@@ -15,21 +15,50 @@ export function useFeedConfig(feedId: string) {
15
15
} ) ;
16
16
}
17
17
18
- export function useFeedItems ( feedId : string ) {
19
- return useQuery < SubmissionWithFeedData [ ] > ( {
20
- queryKey : [ "feed-items" , feedId ] ,
21
- queryFn : async ( ) => {
22
- const response = await fetch ( `/api/feed/${ feedId } ` ) ;
18
+ export function useFeedItems (
19
+ feedId : string ,
20
+ limit : number = 20 ,
21
+ status ?: string ,
22
+ ) {
23
+ return useInfiniteQuery <
24
+ PaginatedResponse < SubmissionWithFeedData > ,
25
+ Error ,
26
+ TransformedInfiniteData < SubmissionWithFeedData > ,
27
+ [ string , string , string | undefined ] ,
28
+ number
29
+ > ( {
30
+ queryKey : [ "feed-items-paginated" , feedId , status ] ,
31
+ queryFn : async ( { pageParam = 0 } ) => {
32
+ const statusParam = status ? `status=${ status } ` : "" ;
33
+ const pageParamStr = `page=${ pageParam } ` ;
34
+ const limitParam = `limit=${ limit } ` ;
35
+
36
+ // Build query string with available parameters
37
+ const queryParams = [ statusParam , pageParamStr , limitParam ]
38
+ . filter ( ( param ) => param !== "" )
39
+ . join ( "&" ) ;
40
+
41
+ const url = `/api/feed/${ feedId } ?${ queryParams } ` ;
42
+ const response = await fetch ( url ) ;
23
43
if ( ! response . ok ) {
24
44
throw new Error ( "Failed to fetch feed items" ) ;
25
45
}
26
46
return response . json ( ) ;
27
47
} ,
28
- // Poll every 10 seconds
48
+ initialPageParam : 0 ,
49
+ getNextPageParam : ( lastPage ) => {
50
+ if ( ! lastPage || ! lastPage . pagination ) return undefined ;
51
+ return lastPage . pagination . hasNextPage
52
+ ? lastPage . pagination . page + 1
53
+ : undefined ;
54
+ } ,
55
+ select : ( data ) => ( {
56
+ pages : data . pages ,
57
+ pageParams : data . pageParams ,
58
+ items : data . pages . flatMap ( ( page ) => ( Array . isArray ( page ) ? page : [ ] ) ) ,
59
+ } ) ,
29
60
refetchInterval : 10000 ,
30
- // Refetch on window focus
31
61
refetchOnWindowFocus : true ,
32
- // Refetch when regaining network connection
33
62
refetchOnReconnect : true ,
34
63
} ) ;
35
64
}
@@ -163,7 +192,7 @@ export function useAllSubmissions(limit: number = 20, status?: string) {
163
192
} ,
164
193
initialPageParam : 0 ,
165
194
getNextPageParam : ( lastPage ) => {
166
- // Use the pagination metadata to determine if there's a next page
195
+ if ( ! lastPage || ! lastPage . pagination ) return undefined ;
167
196
return lastPage . pagination . hasNextPage
168
197
? lastPage . pagination . page + 1
169
198
: undefined ;
@@ -172,8 +201,9 @@ export function useAllSubmissions(limit: number = 20, status?: string) {
172
201
select : ( data ) => ( {
173
202
pages : data . pages ,
174
203
pageParams : data . pageParams ,
175
- // Add a flattened items array for easier access
176
- items : data . pages . flatMap ( ( page ) => page . items ) ,
204
+ items : data . pages . flatMap ( ( page ) =>
205
+ Array . isArray ( page . items ) ? page . items : [ ] ,
206
+ ) ,
177
207
} ) ,
178
208
// Poll every 10 seconds
179
209
refetchInterval : 10000 ,
0 commit comments