import type { NotificationItem, NotificationTimeGroup, NotificationVariant, } from "@/lib/mock/notifications" import { workspaceRole } from "@/lib/workspace-role" import { STATUS_BADGE_TONE_CLASS, type StatusBadgeTone } from "@/lib/list-status-badges" export type NotificationFilter = "all" | "unread" const TIME_GROUP_LABEL: Record = { today: "Today", yesterday: "Yesterday", earlier: "Earlier", } const TIME_GROUP_ORDER: NotificationTimeGroup[] = ["today", "yesterday", "earlier"] /** Role filter — mirrors `visibleWhatsNew` audience rules. */ export function visibleNotifications( items: readonly NotificationItem[], ): NotificationItem[] { const student = workspaceRole() === "student" return items.filter(item => { if (!item.audience) return true return item.audience === (student ? "student" : "staff") }) } export function applyNotificationReadState( items: readonly NotificationItem[], readIds: readonly string[], ): NotificationItem[] { const readSet = new Set(readIds) return items.map(item => ({ ...item, read: readSet.has(item.id) ? true : item.read, })) } export function filterNotifications( items: readonly NotificationItem[], filter: NotificationFilter, ): NotificationItem[] { if (filter === "unread") return items.filter(item => !item.read) return [...items] } export function groupNotificationsByTime( items: readonly NotificationItem[], ): { label: string; items: NotificationItem[] }[] { return TIME_GROUP_ORDER.flatMap(group => { const grouped = items.filter(item => item.timeGroup === group) if (grouped.length === 0) return [] return [{ label: TIME_GROUP_LABEL[group], items: grouped }] }) } export function notificationVariantTone(variant: NotificationVariant): StatusBadgeTone { if (variant === "success") return "success" if (variant === "warning") return "warning" return "info" } export function notificationVariantTint(variant: NotificationVariant): string { return STATUS_BADGE_TONE_CLASS[notificationVariantTone(variant)] }