Skip to content

Commit 2c125a9

Browse files
committed
fix: Fix RecentSubmissions Sort Order Update
1 parent 7893667 commit 2c125a9

File tree

2 files changed

+54
-20
lines changed

2 files changed

+54
-20
lines changed

frontend/src/components/RecentSubmissions.tsx

+13-9
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export default function RecentSubmissions({
3333
const botId = useBotId();
3434

3535
// Get global filter state from Zustand
36-
const { statusFilter, sortOrder, setStatusFilter } = useFeedFilterStore();
36+
const { statusFilter, sortOrder, setStatusFilter, setSortOrder } =
37+
useFeedFilterStore();
3738

3839
// Local filter state (before applying)
3940
const [localStatusFilter, setLocalStatusFilter] =
@@ -56,11 +57,14 @@ export default function RecentSubmissions({
5657
}, [searchQuery]);
5758

5859
// Fetch submissions with infinite scroll
59-
// const ITEMS_PER_PAGE = 20;
60-
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, status } =
61-
useFeedItems(feedId);
62-
63-
// const { data: items = [] } = useFeedItems(feedId);
60+
const ITEMS_PER_PAGE = 20;
61+
const {
62+
data,
63+
fetchNextPage,
64+
hasNextPage = false,
65+
isFetchingNextPage = false,
66+
status,
67+
} = useFeedItems(feedId, ITEMS_PER_PAGE, statusFilter);
6468

6569
// Get the items from the transformed data
6670
const items = data?.items || [];
@@ -101,7 +105,7 @@ export default function RecentSubmissions({
101105
// Update global filter state
102106
setStatusFilter(localStatusFilter);
103107
// Update other global filters (would need to add these to the store)
104-
// setSortOrder(localSortOrder);
108+
setSortOrder(localSortOrder);
105109
// setPlatform(localPlatform);
106110

107111
// Close the filter panel
@@ -211,8 +215,8 @@ export default function RecentSubmissions({
211215
<InfiniteFeed
212216
items={filteredItems}
213217
fetchNextPage={fetchNextPage}
214-
hasNextPage={hasNextPage && debouncedSearchQuery.trim() === ""}
215-
isFetchingNextPage={isFetchingNextPage}
218+
hasNextPage={!!hasNextPage && debouncedSearchQuery.trim() === ""}
219+
isFetchingNextPage={!!isFetchingNextPage}
216220
status={status}
217221
loadingMessage="Loading more submissions..."
218222
noMoreItemsMessage="No more submissions to load"

frontend/src/lib/api.ts

+41-11
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,50 @@ export function useFeedConfig(feedId: string) {
1515
});
1616
}
1717

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);
2343
if (!response.ok) {
2444
throw new Error("Failed to fetch feed items");
2545
}
2646
return response.json();
2747
},
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+
}),
2960
refetchInterval: 10000,
30-
// Refetch on window focus
3161
refetchOnWindowFocus: true,
32-
// Refetch when regaining network connection
3362
refetchOnReconnect: true,
3463
});
3564
}
@@ -163,7 +192,7 @@ export function useAllSubmissions(limit: number = 20, status?: string) {
163192
},
164193
initialPageParam: 0,
165194
getNextPageParam: (lastPage) => {
166-
// Use the pagination metadata to determine if there's a next page
195+
if (!lastPage || !lastPage.pagination) return undefined;
167196
return lastPage.pagination.hasNextPage
168197
? lastPage.pagination.page + 1
169198
: undefined;
@@ -172,8 +201,9 @@ export function useAllSubmissions(limit: number = 20, status?: string) {
172201
select: (data) => ({
173202
pages: data.pages,
174203
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+
),
177207
}),
178208
// Poll every 10 seconds
179209
refetchInterval: 10000,

0 commit comments

Comments
 (0)