1
17
18
19export const NOTIFICATION_TYPES = [
20 "MENTION",
21 "COMMENT",
22 "ASSIGNMENT",
23 "PAGE_SHARED",
24 "TASK_ASSIGNED",
25 "DATABASE_CHANGE",
26 "AUTOMATION",
27 "INTEGRATION",
28 "FORM_SUBMITTED",
29
30 "REVIEW_REQUESTED",
31 "APPROVAL_DECISION",
32 "WATCH_UPDATE",
33 "TASK_DUE"
34] as const;
35export type NotificationTypeValue = (typeof NOTIFICATION_TYPES)[number];
36
37
38export interface NotificationPolicy {
39
40 readonly toast: boolean;
41
42 readonly kind: string;
43}
44
45
46export const NOTIFICATION_POLICY: Readonly<Record<NotificationTypeValue, NotificationPolicy>> = {
47 MENTION: { toast: true, kind: "mention" },
48 ASSIGNMENT: { toast: true, kind: "assignment" },
49 COMMENT: { toast: false, kind: "comment" },
50 PAGE_SHARED: { toast: false, kind: "page_shared" },
51 TASK_ASSIGNED: { toast: false, kind: "task_assigned" },
52 DATABASE_CHANGE: { toast: false, kind: "database_change" },
53 AUTOMATION: { toast: false, kind: "automation" },
54 INTEGRATION: { toast: false, kind: "integration" },
55 FORM_SUBMITTED: { toast: false, kind: "form_submitted" },
56 REVIEW_REQUESTED: { toast: true, kind: "review_requested" },
57 APPROVAL_DECISION: { toast: false, kind: "approval_decision" },
58 WATCH_UPDATE: { toast: false, kind: "watch_update" },
59 TASK_DUE: { toast: false, kind: "task_due" }
60};
61
62
67export function notificationPolicy(type: string): NotificationPolicy {
68 const known = (NOTIFICATION_TYPES as readonly string[]).includes(type);
69 if (known) return NOTIFICATION_POLICY[type as NotificationTypeValue];
70 return { toast: false, kind: type.toLowerCase().replace(/_/g, "_") };
71}
72
73
74export function notificationToasts(type: string): boolean {
75 return notificationPolicy(type).toast;
76}
77