| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import { useState, useEffect } from 'react'; |
| |
|
| | export const useNotifications = (statusState) => { |
| | const [noticeVisible, setNoticeVisible] = useState(false); |
| | const [unreadCount, setUnreadCount] = useState(0); |
| |
|
| | const announcements = statusState?.status?.announcements || []; |
| |
|
| | |
| | const getAnnouncementKey = (a) => |
| | `${a?.publishDate || ''}-${(a?.content || '').slice(0, 30)}`; |
| |
|
| | const calculateUnreadCount = () => { |
| | if (!announcements.length) return 0; |
| | let readKeys = []; |
| | try { |
| | readKeys = JSON.parse(localStorage.getItem('notice_read_keys')) || []; |
| | } catch (_) { |
| | readKeys = []; |
| | } |
| | const readSet = new Set(readKeys); |
| | return announcements.filter((a) => !readSet.has(getAnnouncementKey(a))) |
| | .length; |
| | }; |
| |
|
| | const getUnreadKeys = () => { |
| | if (!announcements.length) return []; |
| | let readKeys = []; |
| | try { |
| | readKeys = JSON.parse(localStorage.getItem('notice_read_keys')) || []; |
| | } catch (_) { |
| | readKeys = []; |
| | } |
| | const readSet = new Set(readKeys); |
| | return announcements |
| | .filter((a) => !readSet.has(getAnnouncementKey(a))) |
| | .map(getAnnouncementKey); |
| | }; |
| |
|
| | |
| | useEffect(() => { |
| | setUnreadCount(calculateUnreadCount()); |
| | }, [announcements]); |
| |
|
| | |
| | const handleNoticeOpen = () => { |
| | setNoticeVisible(true); |
| | }; |
| |
|
| | const handleNoticeClose = () => { |
| | setNoticeVisible(false); |
| | if (announcements.length) { |
| | let readKeys = []; |
| | try { |
| | readKeys = JSON.parse(localStorage.getItem('notice_read_keys')) || []; |
| | } catch (_) { |
| | readKeys = []; |
| | } |
| | const mergedKeys = Array.from( |
| | new Set([...readKeys, ...announcements.map(getAnnouncementKey)]), |
| | ); |
| | localStorage.setItem('notice_read_keys', JSON.stringify(mergedKeys)); |
| | } |
| | setUnreadCount(0); |
| | }; |
| |
|
| | return { |
| | noticeVisible, |
| | unreadCount, |
| | announcements, |
| | handleNoticeOpen, |
| | handleNoticeClose, |
| | getUnreadKeys, |
| | }; |
| | }; |
| |
|