page.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. 'use client';
  2. import { useState } from 'react';
  3. import { useRouter } from 'next/navigation';
  4. import { fetchApi } from '@/lib/utils/client';
  5. import { useStudioContext } from '@/app/studio/context';
  6. import { useRankConfigContext } from '../context';
  7. import RankListPanel from '../_components/RankListPanel';
  8. import { DEFAULT_PER_PAGE } from '@/constants/donation';
  9. export default function RankListPage()
  10. {
  11. const router = useRouter();
  12. const { channelID } = useStudioContext();
  13. const { items, loading, saving, setSaving, fetchList } = useRankConfigContext();
  14. const [checkedIDs, setCheckedIDs] = useState<Set<number>>(new Set());
  15. const [page, setPage] = useState(1);
  16. const [perPage, setPerPage] = useState(DEFAULT_PER_PAGE);
  17. const handleBatchDelete = async () => {
  18. if (!channelID || checkedIDs.size === 0) {
  19. return;
  20. }
  21. if (!confirm(`선택한 ${checkedIDs.size}개의 순위 설정을 삭제하시겠습니까?`)) {
  22. return;
  23. }
  24. setSaving(true);
  25. try {
  26. const deletePromises = [...checkedIDs].map(id =>
  27. fetchApi(`/api/studio/donation/rank/config/${id}/${channelID}`, { method: 'DELETE' })
  28. );
  29. await Promise.all(deletePromises);
  30. setCheckedIDs(new Set());
  31. fetchList();
  32. } catch (err) {
  33. alert(err instanceof Error ? err.message : '삭제에 실패했습니다.');
  34. } finally {
  35. setSaving(false);
  36. }
  37. };
  38. return (
  39. <>
  40. <h1 className="studio-page__title">후원 순위</h1>
  41. <div>
  42. <br/>
  43. </div>
  44. <RankListPanel
  45. items={items}
  46. loading={loading}
  47. saving={saving}
  48. checkedIDs={checkedIDs}
  49. setCheckedIDs={setCheckedIDs}
  50. page={page}
  51. setPage={setPage}
  52. perPage={perPage}
  53. setPerPage={setPerPage}
  54. onNew={() => router.push('/studio/donation/rank/add')}
  55. onEdit={(item) => router.push(`/studio/donation/rank/edit/${item.id}`)}
  56. onBatchDelete={handleBatchDelete}
  57. />
  58. </>
  59. );
  60. }