Openstatus
www.openstatus.dev
1import { FormDiscord } from "@/components/forms/notifications/form-discord";
2import { FormEmail } from "@/components/forms/notifications/form-email";
3import { FormNtfy } from "@/components/forms/notifications/form-ntfy";
4import { FormOpsGenie } from "@/components/forms/notifications/form-opsgenie";
5import { FormPagerDuty } from "@/components/forms/notifications/form-pagerduty";
6import { FormSlack } from "@/components/forms/notifications/form-slack";
7import { FormSms } from "@/components/forms/notifications/form-sms";
8import { FormTelegram } from "@/components/forms/notifications/form-telegram";
9import { FormWebhook } from "@/components/forms/notifications/form-webhook";
10import { FormWhatsApp } from "@/components/forms/notifications/form-whatsapp";
11import { DiscordIcon, TelegramIcon, WhatsappIcon } from "@openstatus/icons";
12import { OpsGenieIcon } from "@openstatus/icons";
13import { PagerDutyIcon } from "@openstatus/icons";
14import { SlackIcon } from "@openstatus/icons";
15import { sendTestDiscordMessage as sendTestDiscord } from "@openstatus/notification-discord";
16import { sendTest as sendTestNtfy } from "@openstatus/notification-ntfy";
17import { sendTest as sendTestOpsGenie } from "@openstatus/notification-opsgenie";
18import { sendTest as sendTestPagerDuty } from "@openstatus/notification-pagerduty";
19import { sendTestSlackMessage as sendTestSlack } from "@openstatus/notification-slack";
20import { sendTest as sendTestTelegram } from "@openstatus/notification-telegram";
21import { sendTest as sendWhatsAppTest } from "@openstatus/notification-twillio-whatsapp";
22import { sendTest as sendTestWebhook } from "@openstatus/notification-webhook";
23import {
24 BellIcon,
25 Cog,
26 Mail,
27 MessageCircle,
28 Trash2,
29 Webhook,
30} from "lucide-react";
31
32export const actions = [
33 {
34 id: "edit",
35 label: "Settings",
36 icon: Cog,
37 variant: "default" as const,
38 },
39 {
40 id: "delete",
41 label: "Delete",
42 icon: Trash2,
43 variant: "destructive" as const,
44 },
45] as const;
46
47export type NotifierAction = (typeof actions)[number];
48
49export const getActions = (
50 props: Partial<Record<NotifierAction["id"], () => Promise<void> | void>>,
51): (NotifierAction & { onClick?: () => Promise<void> | void })[] => {
52 return actions.map((action) => ({
53 ...action,
54 onClick: props[action.id as keyof typeof props],
55 }));
56};
57
58// List of the notifiers
59
60export const config = {
61 slack: {
62 icon: SlackIcon,
63 label: "Slack",
64 form: FormSlack,
65 sendTest: sendTestSlack,
66 },
67 discord: {
68 icon: DiscordIcon,
69 label: "Discord",
70 form: FormDiscord,
71 sendTest: sendTestDiscord,
72 },
73 email: {
74 icon: Mail,
75 label: "Email",
76 form: FormEmail,
77 // TODO: add sendTest
78 sendTest: undefined,
79 },
80 sms: {
81 icon: MessageCircle,
82 label: "SMS",
83 form: FormSms,
84 // TODO: add sendTest
85 sendTest: undefined,
86 },
87 webhook: {
88 icon: Webhook,
89 label: "Webhook",
90 form: FormWebhook,
91 sendTest: sendTestWebhook,
92 },
93 opsgenie: {
94 icon: OpsGenieIcon,
95 label: "OpsGenie",
96 form: FormOpsGenie,
97 sendTest: sendTestOpsGenie,
98 },
99 pagerduty: {
100 icon: PagerDutyIcon,
101 label: "PagerDuty",
102 form: FormPagerDuty,
103 sendTest: sendTestPagerDuty,
104 },
105 ntfy: {
106 icon: BellIcon, // TODO: add svg icon
107 label: "Ntfy",
108 form: FormNtfy,
109 sendTest: sendTestNtfy,
110 },
111 telegram: {
112 icon: TelegramIcon,
113 label: "Telegram",
114 form: FormTelegram,
115 sendTest: sendTestTelegram,
116 },
117 whatsapp: {
118 icon: WhatsappIcon,
119 label: "WhatsApp",
120 form: FormWhatsApp,
121 sendTest: sendWhatsAppTest,
122 },
123};
124
125export type NotifierProvider = keyof typeof config;