page.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 { useAlertConfigContext } from '../context';
  7. import AlertListPanel from '../_components/AlertListPanel';
  8. import { DEFAULT_PER_PAGE } from '@/constants/donation';
  9. export default function AlertListPage()
  10. {
  11. const router = useRouter();
  12. const { channelID, memberID } = useStudioContext();
  13. const { items, loading, saving, setSaving, fetchList } = useAlertConfigContext();
  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. await fetchApi('/api/studio/donation/alert/config/batch', {
  27. method: 'POST',
  28. body: {
  29. channelID,
  30. memberID,
  31. items: [],
  32. deleteIDs: [...checkedIDs]
  33. }
  34. });
  35. setCheckedIDs(new Set());
  36. fetchList();
  37. } catch (err) {
  38. alert(err instanceof Error ? err.message : '삭제에 실패했습니다.');
  39. } finally {
  40. setSaving(false);
  41. }
  42. };
  43. return (
  44. <>
  45. <h1 className="studio-page__title">후원 알림</h1>
  46. <div>
  47. <br/>
  48. </div>
  49. <AlertListPanel
  50. items={items}
  51. loading={loading}
  52. saving={saving}
  53. checkedIDs={checkedIDs}
  54. setCheckedIDs={setCheckedIDs}
  55. page={page}
  56. setPage={setPage}
  57. perPage={perPage}
  58. setPerPage={setPerPage}
  59. onNew={() => router.push('/studio/donation/alert/add')}
  60. onEdit={(item) => router.push(`/studio/donation/alert/edit/${item.id}`)}
  61. onBatchDelete={handleBatchDelete}
  62. />
  63. </>
  64. );
  65. }