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