layout.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use client';
  2. import './style.scss';
  3. import { useState, useCallback, useEffect } from 'react';
  4. import { fetchApi } from '@/lib/utils/client';
  5. import { useStudioContext } from '@/app/studio/context';
  6. import type { AlertConfigResponse, AlertConfigItem } from '@/types/response/donation/alertConfig';
  7. import { AlertConfigContext } from './context';
  8. export default function AlertLayout({ children }: { children: React.ReactNode })
  9. {
  10. const { channelID } = useStudioContext();
  11. const [items, setItems] = useState<AlertConfigItem[]>([]);
  12. const [widgetToken, setWidgetToken] = useState<string|null>(null);
  13. const [loading, setLoading] = useState(true);
  14. const [saving, setSaving] = useState(false);
  15. const fetchList = useCallback(() => {
  16. if (!channelID) {
  17. setLoading(false);
  18. return;
  19. }
  20. setLoading(true);
  21. fetchApi<AlertConfigResponse>(`/api/studio/donation/alert/config/${channelID}`).then(res => {
  22. setItems(res.data?.list ?? []);
  23. setWidgetToken(res.data?.widgetToken ?? null);
  24. }).catch(err => {
  25. alert(err instanceof Error ? err.message : '불러오기 실패');
  26. }).finally(() => setLoading(false));
  27. }, [channelID]);
  28. useEffect(() => {
  29. fetchList();
  30. }, [fetchList]);
  31. if (!channelID) {
  32. return (
  33. <div className="studio-page">
  34. <p className="studio-page__empty">채널을 먼저 연동해 주세요.</p>
  35. </div>
  36. );
  37. }
  38. return (
  39. <AlertConfigContext.Provider value={{ items, widgetToken, loading, saving, setSaving, fetchList }}>
  40. <div className="alert-config">
  41. {children}
  42. </div>
  43. </AlertConfigContext.Provider>
  44. );
  45. }