|
import { logStore } from '~/lib/stores/logs'; |
|
import type { LogEntry } from '~/lib/stores/logs'; |
|
|
|
export interface Notification { |
|
id: string; |
|
title: string; |
|
message: string; |
|
type: 'info' | 'warning' | 'error' | 'success'; |
|
timestamp: string; |
|
read: boolean; |
|
details?: Record<string, unknown>; |
|
} |
|
|
|
export interface LogEntryWithRead extends LogEntry { |
|
read: boolean; |
|
} |
|
|
|
export const getNotifications = async (): Promise<Notification[]> => { |
|
|
|
const logs = Object.values(logStore.logs.get()); |
|
|
|
return logs |
|
.filter((log) => log.category !== 'system') |
|
.map((log) => ({ |
|
id: log.id, |
|
title: (log.details?.title as string) || log.message.split('\n')[0], |
|
message: log.message, |
|
type: log.level as 'info' | 'warning' | 'error' | 'success', |
|
timestamp: log.timestamp, |
|
read: logStore.isRead(log.id), |
|
details: log.details, |
|
})) |
|
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); |
|
}; |
|
|
|
export const markNotificationRead = async (notificationId: string): Promise<void> => { |
|
logStore.markAsRead(notificationId); |
|
}; |
|
|
|
export const clearNotifications = async (): Promise<void> => { |
|
logStore.clearLogs(); |
|
}; |
|
|
|
export const getUnreadCount = (): number => { |
|
const logs = Object.values(logStore.logs.get()) as LogEntryWithRead[]; |
|
|
|
return logs.filter((log) => { |
|
if (!logStore.isRead(log.id)) { |
|
if (log.details?.type === 'update') { |
|
return true; |
|
} |
|
|
|
return log.level === 'error' || log.level === 'warning'; |
|
} |
|
|
|
return false; |
|
}).length; |
|
}; |
|
|