@@ -53,7 +53,7 @@ const Versions = () => {
53
53
return rows ( ) . length
54
54
} ,
55
55
getScrollElement : ( ) => {
56
- let element = versionsContainerRef
56
+ let element : HTMLElement | undefined = versionsContainerRef
57
57
while ( element ?. parentElement ) {
58
58
const style = window . getComputedStyle ( element . parentElement )
59
59
if (
@@ -82,117 +82,118 @@ const Versions = () => {
82
82
</ div >
83
83
}
84
84
>
85
- < div class = "flex h-full flex-col" ref = { versionsContainerRef } >
86
- < div
87
- class = "bg-darkSlate-800 border-darkSlate-600 sticky z-20 mb-4 grid grid-cols-[4fr_130px_100px_120px_150px] gap-4 border-b px-6 pb-3 pt-4 text-xs font-medium uppercase tracking-wide text-lightSlate-400"
88
- style = { { top : "136px" } }
89
- >
90
- < div >
91
- < Trans key = "browser_table_headers.name" />
92
- </ div >
93
- < div >
94
- < Trans key = "browser_table_headers.published" />
95
- </ div >
96
- < div >
97
- < Trans key = "browser_table_headers.downloads" />
98
- </ div >
99
- < div >
100
- < Trans key = "browser_table_headers.type" />
85
+ < div class = "flex h-full flex-col" ref = { versionsContainerRef } >
86
+ < div
87
+ class = "bg-darkSlate-800 border-darkSlate-600 sticky z-20 mb-4 grid grid-cols-[4fr_130px_100px_120px_150px] gap-4 border-b px-6 pb-3 pt-4 text-xs font-medium uppercase tracking-wide text-lightSlate-400"
88
+ style = { { top : "136px" } }
89
+ >
90
+ < div >
91
+ < Trans key = "browser_table_headers.name" />
92
+ </ div >
93
+ < div >
94
+ < Trans key = "browser_table_headers.published" />
95
+ </ div >
96
+ < div >
97
+ < Trans key = "browser_table_headers.downloads" />
98
+ </ div >
99
+ < div >
100
+ < Trans key = "browser_table_headers.type" />
101
+ </ div >
102
+ < div class = "text-right" > Actions</ div >
101
103
</ div >
102
- < div class = "text-right" > Actions</ div >
103
- </ div >
104
- < div class = "flex-1 px-6" >
105
- < Show
106
- when = { rows ( ) . length > 0 }
107
- fallback = {
108
- < div class = "flex flex-col items-center justify-center py-16 text-center" >
109
- < Show when = { infiniteQuery . isLoading } >
110
- < div class = "i-ri:loader-4-line animate-spin text-2xl text-lightSlate-400" />
111
- < span class = "ml-2" > Loading versions...</ span >
112
- </ Show >
113
- < Show when = { infiniteQuery . infiniteQuery . error } >
114
- < div class = "i-ri:error-warning-line text-red-400 mb-4 text-3xl" />
115
- < h3 class = "text-red-300 mb-2 text-lg font-semibold" >
116
- Error loading versions
117
- </ h3 >
118
- < Button
119
- type = "secondary"
120
- size = "small"
121
- onClick = { ( ) => infiniteQuery . infiniteQuery . refetch ( ) }
104
+ < div class = "flex-1 px-6" >
105
+ < Show
106
+ when = { rows ( ) . length > 0 }
107
+ fallback = {
108
+ < div class = "flex flex-col items-center justify-center py-16 text-center" >
109
+ < Show when = { infiniteQuery . isLoading } >
110
+ < div class = "i-ri:loader-4-line animate-spin text-2xl text-lightSlate-400" />
111
+ < span class = "ml-2" > Loading versions...</ span >
112
+ </ Show >
113
+ < Show when = { infiniteQuery . infiniteQuery . error } >
114
+ < div class = "i-ri:error-warning-line text-red-400 mb-4 text-3xl" />
115
+ < h3 class = "text-red-300 mb-2 text-lg font-semibold" >
116
+ Error loading versions
117
+ </ h3 >
118
+ < Button
119
+ type = "secondary"
120
+ size = "small"
121
+ onClick = { ( ) => infiniteQuery . infiniteQuery . refetch ( ) }
122
+ >
123
+ < div class = "i-ri:refresh-line mr-2" />
124
+ Retry
125
+ </ Button >
126
+ </ Show >
127
+ < Show
128
+ when = {
129
+ ! infiniteQuery . isLoading &&
130
+ ! infiniteQuery . infiniteQuery . error
131
+ }
122
132
>
123
- < div class = "i-ri:refresh-line mr-2" />
124
- Retry
125
- </ Button >
126
- </ Show >
127
- < Show
128
- when = {
129
- ! infiniteQuery . isLoading && ! infiniteQuery . infiniteQuery . error
130
- }
131
- >
132
- < span class = "text-lightSlate-400" > No versions found</ span >
133
- </ Show >
134
- </ div >
135
- }
136
- >
137
- < div
138
- style = { {
139
- height : `${ virtualizer . getTotalSize ( ) } px` ,
140
- width : "100%" ,
141
- position : "relative"
142
- } }
133
+ < span class = "text-lightSlate-400" > No versions found</ span >
134
+ </ Show >
135
+ </ div >
136
+ }
143
137
>
144
- < For each = { virtualizer . getVirtualItems ( ) } >
145
- { ( virtualItem ) => {
146
- const version = rows ( ) [ virtualItem . index ]
147
- if ( ! version ) return null
138
+ < div
139
+ style = { {
140
+ height : `${ virtualizer . getTotalSize ( ) } px` ,
141
+ width : "100%" ,
142
+ position : "relative"
143
+ } }
144
+ >
145
+ < For each = { virtualizer . getVirtualItems ( ) } >
146
+ { ( virtualItem ) => {
147
+ const version = rows ( ) [ virtualItem . index ]
148
+ if ( ! version ) return null
148
149
149
- if (
150
- virtualItem . index >= rows ( ) . length - 5 &&
151
- infiniteQuery . infiniteQuery . hasNextPage &&
152
- ! infiniteQuery . infiniteQuery . isFetchingNextPage
153
- ) {
154
- infiniteQuery . infiniteQuery . fetchNextPage ( ) . catch ( ( ) => { } )
155
- }
150
+ if (
151
+ virtualItem . index >= rows ( ) . length - 5 &&
152
+ infiniteQuery . infiniteQuery . hasNextPage &&
153
+ ! infiniteQuery . infiniteQuery . isFetchingNextPage
154
+ ) {
155
+ infiniteQuery . infiniteQuery . fetchNextPage ( ) . catch ( ( ) => { } )
156
+ }
156
157
157
- return (
158
- < div
159
- style = { {
160
- position : "absolute" ,
161
- top : "0" ,
162
- left : "0" ,
163
- width : "100%" ,
164
- height : `${ virtualItem . size } px` ,
165
- transform : `translateY(${ virtualItem . start } px)`
166
- } }
167
- class = "border-darkSlate-700 hover:bg-darkSlate-750 grid grid-cols-[4fr_130px_100px_120px_150px] gap-4 border-b py-2 transition-colors duration-150"
168
- classList = { {
169
- "bg-green-500/5 border-green-500/20" :
170
- installedMod ( ) ?. remoteId . toString ( ) ===
171
- version ?. fileId . toString ( )
172
- } }
173
- >
174
- < VersionRow
175
- project = { mod ?. data }
176
- modVersion = { version }
177
- installedFile = { installedMod ( ) }
178
- instanceId = { instanceId ( ) }
179
- type = { mod ?. data ?. type }
180
- instanceMods = { instanceMods . data || undefined }
181
- instanceDetails = { instanceDetails . data || undefined }
182
- />
183
- </ div >
184
- )
185
- } }
186
- </ For >
187
- </ div >
188
- < Show when = { infiniteQuery . infiniteQuery . isFetchingNextPage } >
189
- < div class = "flex h-20 items-center justify-center" >
190
- < div class = "i-ri:loader-4-line animate-spin text-2xl text-lightSlate-400" />
158
+ return (
159
+ < div
160
+ style = { {
161
+ position : "absolute" ,
162
+ top : "0" ,
163
+ left : "0" ,
164
+ width : "100%" ,
165
+ height : `${ virtualItem . size } px` ,
166
+ transform : `translateY(${ virtualItem . start } px)`
167
+ } }
168
+ class = "border-darkSlate-700 hover:bg-darkSlate-750 grid grid-cols-[4fr_130px_100px_120px_150px] gap-4 border-b py-2 transition-colors duration-150"
169
+ classList = { {
170
+ "bg-green-500/5 border-green-500/20" :
171
+ installedMod ( ) ?. remoteId . toString ( ) ===
172
+ version ?. fileId . toString ( )
173
+ } }
174
+ >
175
+ < VersionRow
176
+ project = { mod ?. data }
177
+ modVersion = { version }
178
+ installedFile = { installedMod ( ) }
179
+ instanceId = { instanceId ( ) }
180
+ type = { mod ?. data ?. type }
181
+ instanceMods = { instanceMods . data || undefined }
182
+ instanceDetails = { instanceDetails . data || undefined }
183
+ />
184
+ </ div >
185
+ )
186
+ } }
187
+ </ For >
191
188
</ div >
189
+ < Show when = { infiniteQuery . infiniteQuery . isFetchingNextPage } >
190
+ < div class = "flex h-20 items-center justify-center" >
191
+ < div class = "i-ri:loader-4-line animate-spin text-2xl text-lightSlate-400" />
192
+ </ div >
193
+ </ Show >
192
194
</ Show >
193
- </ Show >
195
+ </ div >
194
196
</ div >
195
- </ div >
196
197
</ Show >
197
198
)
198
199
}
0 commit comments