import { logStore, type LogEntry } from '~/lib/stores/logs'; export type NotificationType = 'info' | 'warning' | 'error' | 'success' | 'update'; export interface NotificationDetails { type?: string; message?: string; currentVersion?: string; latestVersion?: string; branch?: string; updateUrl?: string; } export interface Notification { id: string; title: string; message: string; type: NotificationType; read: boolean; timestamp: string; details?: NotificationDetails; } interface LogEntryWithRead extends LogEntry { read?: boolean; } const mapLogToNotification = (log: LogEntryWithRead): Notification => { const type: NotificationType = log.details?.type === 'update' ? 'update' : log.level === 'error' ? 'error' : log.level === 'warning' ? 'warning' : 'info'; const baseNotification: Notification = { id: log.id, title: log.category.charAt(0).toUpperCase() + log.category.slice(1), message: log.message, type, read: log.read || false, timestamp: log.timestamp, }; if (log.details) { return { ...baseNotification, details: log.details as NotificationDetails, }; } return baseNotification; }; export const getNotifications = async (): Promise => { const logs = Object.values(logStore.logs.get()) as LogEntryWithRead[]; return logs .filter((log) => { if (log.details?.type === 'update') { return true; } return log.level === 'error' || log.level === 'warning'; }) .map(mapLogToNotification) .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); }; export const markNotificationRead = async (notificationId: string): Promise => { logStore.markAsRead(notificationId); }; export const clearNotifications = async (): Promise => { logStore.clearLogs(); }; export const getUnreadCount = (): number => { const logs = Object.values(logStore.logs.get()) as LogEntryWithRead[]; return logs.filter((log) => { if (!log.read) { if (log.details?.type === 'update') { return true; } return log.level === 'error' || log.level === 'warning'; } return false; }).length; };