@@ -11,11 +11,12 @@ function extractFromPathname(pathname: string) {
11
11
}
12
12
interface Props {
13
13
contents : Contents | null ;
14
+ loading ?: boolean ;
14
15
pathname : string ;
15
16
renderLink : ( props : HTMLProps < HTMLAnchorElement > ) => ReactNode ;
16
17
}
17
18
18
- export default function PackageTree ( { contents, pathname, renderLink} : Props ) {
19
+ export default function PackageTree ( { contents, loading , pathname, renderLink} : Props ) {
19
20
const { selectedPkg, selectedComponent} = extractFromPathname ( pathname ) ;
20
21
const [ expandedPkgs , setExpandedPkgs ] = useState < Set < string > > (
21
22
( ) => new Set ( selectedPkg ? [ selectedPkg ] : [ ] ) ,
@@ -46,33 +47,13 @@ export default function PackageTree({contents, pathname, renderLink}: Props) {
46
47
} ) ;
47
48
} ;
48
49
49
- return (
50
- < div className = { styles . container } >
51
- < div className = { styles . searchOuter } >
52
- < div className = { styles . searchContainer } >
53
- < svg
54
- className = { styles . icon }
55
- width = "20"
56
- height = "20"
57
- viewBox = "0 0 20 20"
58
- fill = "currentColor"
59
- xmlns = "http://www.w3.org/2000/svg"
60
- >
61
- < path
62
- d = "M12.9167 11.6667H12.2583L12.025 11.4417C12.8699 10.4617 13.3343 9.21058 13.3333 7.91667C13.3333 6.84535 13.0157 5.7981 12.4205 4.90733C11.8253 4.01656 10.9793 3.3223 9.98954 2.91232C8.99977 2.50235 7.91066 2.39508 6.85993 2.60408C5.8092 2.81309 4.84404 3.32897 4.08651 4.08651C3.32897 4.84404 2.81309 5.8092 2.60408 6.85993C2.39508 7.91066 2.50235 8.99977 2.91232 9.98954C3.3223 10.9793 4.01656 11.8253 4.90733 12.4205C5.7981 13.0157 6.84535 13.3333 7.91667 13.3333C9.25834 13.3333 10.4917 12.8417 11.4417 12.025L11.6667 12.2583V12.9167L15.8333 17.075L17.075 15.8333L12.9167 11.6667ZM7.91667 11.6667C5.84167 11.6667 4.16667 9.99167 4.16667 7.91667C4.16667 5.84167 5.84167 4.16667 7.91667 4.16667C9.99167 4.16667 11.6667 5.84167 11.6667 7.91667C11.6667 9.99167 9.99167 11.6667 7.91667 11.6667Z"
63
- fill = "currentColor"
64
- />
65
- </ svg >
66
- < input
67
- type = "text"
68
- placeholder = "Jump to…"
69
- value = { search }
70
- className = { styles . search }
71
- onChange = { ( e ) => setSearch ( e . target . value ) }
72
- />
73
- </ div >
74
- </ div >
75
- < div className = { styles . treeContainer } >
50
+ const listContent = ( ) => {
51
+ if ( contents === null && loading ) {
52
+ return < div className = { styles . loading } > Loading…</ div > ;
53
+ }
54
+
55
+ return (
56
+ < >
76
57
{ contents ?. map ( ( pkg ) => (
77
58
< div key = { pkg . name } >
78
59
< div className = { styles . pkgItem } >
@@ -98,6 +79,7 @@ export default function PackageTree({contents, pathname, renderLink}: Props) {
98
79
</ svg >
99
80
</ button >
100
81
{ renderLink ( {
82
+ key : pkg . name ,
101
83
href : `/packages/${ pkg . name } ` ,
102
84
className : clsx (
103
85
styles . pkgLink ,
@@ -120,6 +102,7 @@ export default function PackageTree({contents, pathname, renderLink}: Props) {
120
102
return (
121
103
< Fragment key = { componentType . name } >
122
104
{ renderLink ( {
105
+ key : componentType . name ,
123
106
href : `/packages/${ pkg . name } /${ componentType . name } ` ,
124
107
className : clsx ( styles . componentLink , isSelected ? styles . selected : null ) ,
125
108
children : (
@@ -136,7 +119,37 @@ export default function PackageTree({contents, pathname, renderLink}: Props) {
136
119
) : null }
137
120
</ div >
138
121
) ) }
122
+ </ >
123
+ ) ;
124
+ } ;
125
+
126
+ return (
127
+ < div className = { styles . container } >
128
+ < div className = { styles . searchOuter } >
129
+ < div className = { styles . searchContainer } >
130
+ < svg
131
+ className = { styles . icon }
132
+ width = "20"
133
+ height = "20"
134
+ viewBox = "0 0 20 20"
135
+ fill = "currentColor"
136
+ xmlns = "http://www.w3.org/2000/svg"
137
+ >
138
+ < path
139
+ d = "M12.9167 11.6667H12.2583L12.025 11.4417C12.8699 10.4617 13.3343 9.21058 13.3333 7.91667C13.3333 6.84535 13.0157 5.7981 12.4205 4.90733C11.8253 4.01656 10.9793 3.3223 9.98954 2.91232C8.99977 2.50235 7.91066 2.39508 6.85993 2.60408C5.8092 2.81309 4.84404 3.32897 4.08651 4.08651C3.32897 4.84404 2.81309 5.8092 2.60408 6.85993C2.39508 7.91066 2.50235 8.99977 2.91232 9.98954C3.3223 10.9793 4.01656 11.8253 4.90733 12.4205C5.7981 13.0157 6.84535 13.3333 7.91667 13.3333C9.25834 13.3333 10.4917 12.8417 11.4417 12.025L11.6667 12.2583V12.9167L15.8333 17.075L17.075 15.8333L12.9167 11.6667ZM7.91667 11.6667C5.84167 11.6667 4.16667 9.99167 4.16667 7.91667C4.16667 5.84167 5.84167 4.16667 7.91667 4.16667C9.99167 4.16667 11.6667 5.84167 11.6667 7.91667C11.6667 9.99167 9.99167 11.6667 7.91667 11.6667Z"
140
+ fill = "currentColor"
141
+ />
142
+ </ svg >
143
+ < input
144
+ type = "text"
145
+ placeholder = "Jump to…"
146
+ value = { search }
147
+ className = { styles . search }
148
+ onChange = { ( e ) => setSearch ( e . target . value ) }
149
+ />
150
+ </ div >
139
151
</ div >
152
+ < div className = { styles . treeContainer } > { listContent ( ) } </ div >
140
153
</ div >
141
154
) ;
142
155
}
0 commit comments