Adds a notification history view accessible from the header, including a clear button and a notification count badge.
72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
|
|
import { useState, useEffect } from 'react';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
import { Notification } from '@/components/notification/NotificationPopover';
|
|
|
|
export const useNotifications = () => {
|
|
const [notifications, setNotifications] = useState<Notification[]>([]);
|
|
|
|
// 로컬 스토리지에서 알림 불러오기
|
|
useEffect(() => {
|
|
try {
|
|
const savedNotifications = localStorage.getItem('notifications');
|
|
if (savedNotifications) {
|
|
const parsedNotifications = JSON.parse(savedNotifications);
|
|
// 시간 문자열을 Date 객체로 변환
|
|
const formattedNotifications = parsedNotifications.map((notification: any) => ({
|
|
...notification,
|
|
timestamp: new Date(notification.timestamp)
|
|
}));
|
|
setNotifications(formattedNotifications);
|
|
}
|
|
} catch (error) {
|
|
console.error('알림 데이터 로드 중 오류 발생:', error);
|
|
}
|
|
}, []);
|
|
|
|
// 알림 추가
|
|
const addNotification = (title: string, message: string) => {
|
|
const newNotification: Notification = {
|
|
id: uuidv4(),
|
|
title,
|
|
message,
|
|
timestamp: new Date(),
|
|
read: false
|
|
};
|
|
|
|
setNotifications(prevNotifications => {
|
|
const updatedNotifications = [newNotification, ...prevNotifications];
|
|
// 로컬 스토리지 업데이트
|
|
localStorage.setItem('notifications', JSON.stringify(updatedNotifications));
|
|
return updatedNotifications;
|
|
});
|
|
};
|
|
|
|
// 알림 읽음 표시
|
|
const markAsRead = (id: string) => {
|
|
setNotifications(prevNotifications => {
|
|
const updatedNotifications = prevNotifications.map(notification =>
|
|
notification.id === id ? { ...notification, read: true } : notification
|
|
);
|
|
// 로컬 스토리지 업데이트
|
|
localStorage.setItem('notifications', JSON.stringify(updatedNotifications));
|
|
return updatedNotifications;
|
|
});
|
|
};
|
|
|
|
// 모든 알림 삭제
|
|
const clearAllNotifications = () => {
|
|
setNotifications([]);
|
|
localStorage.removeItem('notifications');
|
|
};
|
|
|
|
return {
|
|
notifications,
|
|
addNotification,
|
|
markAsRead,
|
|
clearAllNotifications
|
|
};
|
|
};
|
|
|
|
export default useNotifications;
|