Pager.tsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. 'use client';
  2. import { useRouter } from 'next/navigation';
  3. import { useTransition } from 'react';
  4. import Pagination from '@/app/component/Pagination';
  5. type Props = {
  6. total: number;
  7. page: number;
  8. perPage: number;
  9. // 이동 대상 경로 + 유지할 쿼리 (page 는 자동 갱신)
  10. basePath: string;
  11. query?: Record<string, string>;
  12. };
  13. // SSR 목록 페이지용 페이저 — 기존 Pagination(onChange 콜백형)을 router.push 로 연결.
  14. // useTransition 으로 전환 중 현재 목록 유지(스켈레톤 플래시 없이) + 흐림 표시.
  15. export default function Pager({ total, page, perPage, basePath, query }: Props) {
  16. const router = useRouter();
  17. const [isPending, startTransition] = useTransition();
  18. const handleChange = (next: number) => {
  19. const params = new URLSearchParams(query);
  20. params.set('page', String(next));
  21. startTransition(() => {
  22. router.push(`${basePath}?${params.toString()}`);
  23. });
  24. };
  25. return (
  26. <div className={isPending ? 'data-table--pending' : undefined}>
  27. <Pagination total={total} page={page} perPage={perPage} onChange={handleChange} />
  28. </div>
  29. );
  30. }