| import { useState, useEffect } from 'react'; |
| import { getNotifications, markNotificationRead, type Notification } from '~/lib/api/notifications'; |
| import { logStore } from '~/lib/stores/logs'; |
| import { useStore } from '@nanostores/react'; |
|
|
| export const useNotifications = () => { |
| const [hasUnreadNotifications, setHasUnreadNotifications] = useState(false); |
| const [unreadNotifications, setUnreadNotifications] = useState<Notification[]>([]); |
| const logs = useStore(logStore.logs); |
|
|
| const checkNotifications = async () => { |
| try { |
| const notifications = await getNotifications(); |
| const unread = notifications.filter((n) => !logStore.isRead(n.id)); |
| setUnreadNotifications(unread); |
| setHasUnreadNotifications(unread.length > 0); |
| } catch (error) { |
| console.error('Failed to check notifications:', error); |
| } |
| }; |
|
|
| useEffect(() => { |
| |
| checkNotifications(); |
|
|
| const interval = setInterval(checkNotifications, 60 * 1000); |
|
|
| return () => clearInterval(interval); |
| }, [logs]); |
|
|
| const markAsRead = async (notificationId: string) => { |
| try { |
| await markNotificationRead(notificationId); |
| await checkNotifications(); |
| } catch (error) { |
| console.error('Failed to mark notification as read:', error); |
| } |
| }; |
|
|
| const markAllAsRead = async () => { |
| try { |
| const notifications = await getNotifications(); |
| await Promise.all(notifications.map((n) => markNotificationRead(n.id))); |
| await checkNotifications(); |
| } catch (error) { |
| console.error('Failed to mark all notifications as read:', error); |
| } |
| }; |
|
|
| return { hasUnreadNotifications, unreadNotifications, markAsRead, markAllAsRead }; |
| }; |
|
|