| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | 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,
|
| | };
|
| | };
|
| |
|