useNotification.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. 'use client';
  2. import { useState, useEffect, useCallback } from 'react';
  3. import { useSignalRContext } from '@/contexts/signalrProvider';
  4. import { fetchApi } from '@/lib/utils/client';
  5. import { NotificationItem, NotePreview } from '@/types/notification';
  6. import { NotificationReadRequest } from '@/types/request/notification/read';
  7. export type { NotificationItem, NotePreview };
  8. export function useNotification()
  9. {
  10. const { chatConnection } = useSignalRContext();
  11. const [unreadNotifCount, setUnreadNotifCount] = useState(0);
  12. const [unreadNoteCount, setUnreadNoteCount] = useState(0);
  13. const [latestNotification, setLatestNotification] = useState<NotificationItem|null>(null);
  14. const [latestNote, setLatestNote] = useState<NotePreview|null>(null);
  15. useEffect(() => {
  16. if (!chatConnection) {
  17. return;
  18. }
  19. // AppHub에서 알림/쪽지 이벤트 수신
  20. chatConnection.on('ReceiveNotification', (data: NotificationItem) => {
  21. setLatestNotification(data);
  22. setUnreadNotifCount(prev => prev + 1);
  23. });
  24. chatConnection.on('ReceiveNote', (data: NotePreview) => {
  25. setLatestNote(data);
  26. setUnreadNoteCount(prev => prev + 1);
  27. });
  28. chatConnection.on('ReceiveUnreadCounts', (notifCount: number, noteCount: number) => {
  29. setUnreadNotifCount(notifCount);
  30. setUnreadNoteCount(noteCount);
  31. });
  32. return () => {
  33. chatConnection.off('ReceiveNotification');
  34. chatConnection.off('ReceiveNote');
  35. chatConnection.off('ReceiveUnreadCounts');
  36. };
  37. }, [chatConnection]);
  38. const markNotifRead = useCallback(async (notificationID?: number) => {
  39. await fetchApi('/api/notification/read', {
  40. method: 'POST',
  41. body: { notificationID } as NotificationReadRequest,
  42. silent: true
  43. });
  44. if (notificationID) {
  45. setUnreadNotifCount(prev => Math.max(0, prev - 1));
  46. } else {
  47. setUnreadNotifCount(0);
  48. }
  49. }, []);
  50. const clearLatestNotification = useCallback(() => setLatestNotification(null), []);
  51. const clearLatestNote = useCallback(() => setLatestNote(null), []);
  52. return {
  53. unreadNotifCount,
  54. unreadNoteCount,
  55. latestNotification,
  56. latestNote,
  57. markNotifRead,
  58. clearLatestNotification,
  59. clearLatestNote
  60. };
  61. }