diff --git a/apps/console/src/pages/PeopleListPage.tsx b/apps/console/src/pages/PeopleListPage.tsx index cc0303454..6b60a692b 100644 --- a/apps/console/src/pages/PeopleListPage.tsx +++ b/apps/console/src/pages/PeopleListPage.tsx @@ -15,7 +15,7 @@ import { Link } from "react-router"; import { Helmet } from "react-helmet-async"; import type { PeopleListPageQuery as PeopleListPageQueryType } from "./__generated__/PeopleListPageQuery.graphql"; -const ITEMS_PER_PAGE = 20; +const ITEMS_PER_PAGE = 25; const PeopleListPageQuery = graphql` query PeopleListPageQuery( @@ -59,10 +59,61 @@ const deletePeopleMutation = graphql` } `; +function LoadAboveButton({ + pageInfo, + isPending, + onPageChange, +}: { + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + } | null | undefined; + isPending: boolean; + onPageChange: (direction: "prev") => void; +}) { + return ( +
+ +
+ ); +} + +function LoadBelowButton({ + pageInfo, + isPending, + onPageChange, +}: { + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + } | null | undefined; + isPending: boolean; + onPageChange: (direction: "next") => void; +}) { + return ( +
+ +
+ ); +} + function PeopleListPageContent({ queryRef, onPageChange, - loadQuery, }: { queryRef: PreloadedQuery; onPageChange: (params: { @@ -71,27 +122,38 @@ function PeopleListPageContent({ last?: number; before?: string; }) => void; - loadQuery: LoadQueryType; }) { const data = usePreloadedQuery(PeopleListPageQuery, queryRef); + const [searchParams, setSearchParams] = useSearchParams(); const peoples = data.node.peoples?.edges.map((edge) => edge?.node) ?? []; const pageInfo = data.node.peoples?.pageInfo; const [isPending, startTransition] = useTransition(); const [deletePeople] = useMutation(deletePeopleMutation); const handlePageChange = (direction: "prev" | "next") => { + if (!pageInfo) return; + + if (direction === "next" && !pageInfo.hasNextPage) return; + if (direction === "prev" && !pageInfo.hasPreviousPage) return; + startTransition(() => { - if (direction === "prev") { - onPageChange({ - last: ITEMS_PER_PAGE, - before: pageInfo?.startCursor, - }); - } else { - onPageChange({ - first: ITEMS_PER_PAGE, - after: pageInfo?.endCursor, - }); - } + const params = + direction === "next" + ? { first: ITEMS_PER_PAGE, after: pageInfo.endCursor } + : { last: ITEMS_PER_PAGE, before: pageInfo.startCursor }; + + setSearchParams((prev) => { + if (direction === "next") { + prev.set("after", pageInfo.endCursor!); + prev.delete("before"); + } else { + prev.set("before", pageInfo.startCursor!); + prev.delete("after"); + } + return prev; + }); + + onPageChange(params); }); }; @@ -110,6 +172,13 @@ function PeopleListPageContent({ + + handlePageChange("prev")} + /> +
{peoples.map((person) => ( ))} -
- - -
+ handlePageChange("next")} + />
); @@ -300,7 +355,6 @@ export default function PeopleListPage() { diff --git a/apps/console/src/pages/__generated__/VendorListPage_vendors.graphql.ts b/apps/console/src/pages/__generated__/VendorListPage_vendors.graphql.ts index 91fac6f73..5ec0b3af9 100644 --- a/apps/console/src/pages/__generated__/VendorListPage_vendors.graphql.ts +++ b/apps/console/src/pages/__generated__/VendorListPage_vendors.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<048f9d727dd07032be161da7019c6ebe>> + * @generated SignedSource<<98591652ea931191ef7210e363e0adad>> * @lightSyntaxTransform * @nogrep */ @@ -88,6 +88,7 @@ return { }, "name": "VendorListPage_vendors", "selections": [ + (v1/*: any*/), { "alias": "vendors", "args": null, @@ -195,14 +196,13 @@ return { } ], "storageKey": null - }, - (v1/*: any*/) + } ], "type": "Organization", "abstractKey": null }; })(); -(node as any).hash = "753e6b32cc21645852de27cf6f23c769"; +(node as any).hash = "f61c6a2996a9fe95b71d9c0c2fe0530c"; export default node;