Shonen-Labs/Roster-Rumble

FRONTEND: Contest Listing Page with Server-Side Filters

Open

#16 aperta il 23 apr 2025

Vedi su GitHub
 (0 commenti) (0 reazioni) (0 assegnatari)TypeScript (11 fork)auto 404
ODHack 14UI/Webgood first issue

Metriche repository

Star
 (4 star)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

Description
SSR page displaying paginated contests with dynamic filters.

Acceptance Criteria:

  1. URL params control filters:
    /contests?sport=nba&minFee=0.1&page=2
  2. Server-side rendered initial data using getServerSideProps
  3. Client-side pagination via useSWRInfinite
  4. Filter sidebar with:
    • Sport multi-select (NBA/NFL/MLB)
    • Entry fee range slider
    • Date picker for start time
  5. Loading states with skeleton screens

Technical Details:

// pages/contests.tsx
export const getServerSideProps: GetServerSideProps = async ({ query }) => {
  const res = await fetch(`${API_URL}/contests?${qs.stringify(query)}`);
  return { props: { initialData: await res.json() } };
};

function ContestsPage({ initialData }) {
  const { data, setSize } = useSWRInfinite((pageIndex) => 
    `/api/contests?${qs.stringify({ ...query, page: pageIndex + 1 })}`
  );
  
  return (
    <div>
      <ContestFilters />
      <InfiniteLoader onLoadMore={() => setSize(size => size + 1)}>
        {data?.map(page => page.contests.map(contest => 
          <ContestCard key={contest.id} {...contest} />
        ))}
      </InfiniteLoader>
    </div>
  );
}

Notes:

  • Use next-query-params for URL state management
  • Debounce filter updates by 500ms
  • Implement scroll restoration

Guida contributor