diff --git a/src/components/wrappers/dashboard/common/notifier/notifier-add-edit-modal.tsx b/src/components/wrappers/dashboard/common/notifier/notifier-add-edit-modal.tsx index dd4024ca..e0b0bac9 100644 --- a/src/components/wrappers/dashboard/common/notifier/notifier-add-edit-modal.tsx +++ b/src/components/wrappers/dashboard/common/notifier/notifier-add-edit-modal.tsx @@ -9,6 +9,7 @@ import {Button} from "@/components/ui/button"; import {NotifierForm} from "@/components/wrappers/dashboard/common/notifier/notifier-form/notifier-form"; import {OrganizationWithMembers} from "@/db/schema/03_organization"; import {NotificationChannel} from "@/db/schema/09_notification-channel"; +import {useIsMobile} from "@/hooks/use-mobile"; type OrganizationNotifierAddModalProps = { notificationChannel?: NotificationChannel @@ -24,6 +25,7 @@ export const NotifierAddEditModal = ({ open, onOpenChangeAction }: OrganizationNotifierAddModalProps) => { + const isMobile = useIsMobile(); const isCreate = !Boolean(notificationChannel); @@ -32,7 +34,7 @@ export const NotifierAddEditModal = ({ {isCreate ? : ) diff --git a/src/components/wrappers/dashboard/organization/tabs/organization-notifiers-tab/organization-notifiers-tab.tsx b/src/components/wrappers/dashboard/organization/tabs/organization-notifiers-tab/organization-notifiers-tab.tsx index ec183ad0..75a0d270 100644 --- a/src/components/wrappers/dashboard/organization/tabs/organization-notifiers-tab/organization-notifiers-tab.tsx +++ b/src/components/wrappers/dashboard/organization/tabs/organization-notifiers-tab/organization-notifiers-tab.tsx @@ -63,17 +63,16 @@ export const OrganizationNotifiersTab = ({
-
+

Notification Settings

-

+

Configure how and when you receive alerts about your services and infrastructure.

{ + // // 1. Get policy + channel // const policy = await db // .select({ @@ -66,7 +68,7 @@ export async function dispatchNotification( .values({ channelId: channel.id, // policyId: policy.id, - // organizationId: organizationId || null, + organizationId: organizationId || null, title: payload.title, message: payload.message, level: payload.level, @@ -74,6 +76,7 @@ export async function dispatchNotification( success: result.success, error: result.success ? null : result.error, providerResponse: result.response || null, + }) .returning({id: notificationLog.id}); diff --git a/src/features/notifications/providers/index.ts b/src/features/notifications/providers/index.ts index d5a39eb4..7ea1d920 100644 --- a/src/features/notifications/providers/index.ts +++ b/src/features/notifications/providers/index.ts @@ -1,13 +1,13 @@ "use server" -import type { ProviderKind, EventPayload, DispatchResult } from '../types'; -// import { sendSlack } from './slack'; -import { sendSmtp } from './smtp'; +import type {ProviderKind, EventPayload, DispatchResult} from '../types'; +import {sendSlack} from './slack'; +import {sendSmtp} from './smtp'; const handlers: Record< ProviderKind, (config: any, payload: EventPayload) => Promise > = { - // slack: sendSlack, + slack: sendSlack, smtp: sendSmtp, }; diff --git a/src/features/notifications/providers/slack.ts b/src/features/notifications/providers/slack.ts new file mode 100644 index 00000000..196ede58 --- /dev/null +++ b/src/features/notifications/providers/slack.ts @@ -0,0 +1,46 @@ +import type {EventPayload, DispatchResult} from '../types'; + +export async function sendSlack( + config: { slackWebhook: string }, + payload: EventPayload +): Promise { + const {slackWebhook: webhookUrl} = config; + + const text = `*${payload.title}*\n${payload.message}`; + const blocks = [ + { + type: 'section', + text: {type: 'mrkdwn', text: `*${payload.title}*`}, + }, + {type: 'section', text: {type: 'mrkdwn', text: payload.message}}, + payload.data + ? { + type: 'context', + elements: [{type: 'mrkdwn', text: `*Data:* \`\`\`${JSON.stringify(payload.data, null, 2)}\`\`\``}], + } + : null, + ].filter(Boolean); + + const body = { + text, + blocks, + }; + + const res = await fetch(webhookUrl, { + method: 'POST', + body: JSON.stringify(body), + headers: {'Content-Type': 'application/json'}, + }); + + if (!res.ok) { + const err = await res.text(); + throw new Error(`Slack error: ${res.status} ${err}`); + } + + return { + success: true, + provider: 'slack', + message: 'Sent to Slack', + response: await res.text(), + }; +} \ No newline at end of file diff --git a/src/features/notifications/types.ts b/src/features/notifications/types.ts index 162a366d..dbce3f3f 100644 --- a/src/features/notifications/types.ts +++ b/src/features/notifications/types.ts @@ -1,5 +1,4 @@ -// export type ProviderKind = 'slack' | 'smtp'; -export type ProviderKind = 'smtp'; +export type ProviderKind = 'slack' | 'smtp'; export interface DispatchResult { success: boolean;