import { DiscordIcon, SlackIcon, TelegramIcon, } from "@/components/icons/notification-icons"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { Mail, PenBoxIcon } from "lucide-react"; import { useEffect } from "react"; import { FieldErrors, useFieldArray, useForm } from "react-hook-form"; import { toast } from "sonner"; import { type NotificationSchema, notificationSchema, } from "./add-notification"; interface Props { notificationId: string; } export const UpdateNotification = ({ notificationId }: Props) => { const utils = api.useUtils(); const { data, refetch } = api.notification.one.useQuery( { notificationId, }, { enabled: !!notificationId, }, ); const { mutateAsync: testSlackConnection, isLoading: isLoadingSlack } = api.notification.testSlackConnection.useMutation(); const { mutateAsync: testTelegramConnection, isLoading: isLoadingTelegram } = api.notification.testTelegramConnection.useMutation(); const { mutateAsync: testDiscordConnection, isLoading: isLoadingDiscord } = api.notification.testDiscordConnection.useMutation(); const { mutateAsync: testEmailConnection, isLoading: isLoadingEmail } = api.notification.testEmailConnection.useMutation(); const slackMutation = api.notification.updateSlack.useMutation(); const telegramMutation = api.notification.updateTelegram.useMutation(); const discordMutation = api.notification.updateDiscord.useMutation(); const emailMutation = api.notification.updateEmail.useMutation(); const form = useForm({ defaultValues: { type: "slack", webhookUrl: "", channel: "", }, resolver: zodResolver(notificationSchema), }); const type = form.watch("type"); const { fields, append, remove } = useFieldArray({ control: form.control, name: "toAddresses" as never, }); useEffect(() => { if (data) { if (data.notificationType === "slack") { form.reset({ appBuildError: data.appBuildError, appDeploy: data.appDeploy, dokployRestart: data.dokployRestart, databaseBackup: data.databaseBackup, dockerCleanup: data.dockerCleanup, webhookUrl: data.slack?.webhookUrl, channel: data.slack?.channel || "", name: data.name, type: data.notificationType, }); } else if (data.notificationType === "telegram") { form.reset({ appBuildError: data.appBuildError, appDeploy: data.appDeploy, dokployRestart: data.dokployRestart, databaseBackup: data.databaseBackup, botToken: data.telegram?.botToken, chatId: data.telegram?.chatId, type: data.notificationType, name: data.name, dockerCleanup: data.dockerCleanup, }); } else if (data.notificationType === "discord") { form.reset({ appBuildError: data.appBuildError, appDeploy: data.appDeploy, dokployRestart: data.dokployRestart, databaseBackup: data.databaseBackup, type: data.notificationType, webhookUrl: data.discord?.webhookUrl, name: data.name, dockerCleanup: data.dockerCleanup, }); } else if (data.notificationType === "email") { form.reset({ appBuildError: data.appBuildError, appDeploy: data.appDeploy, dokployRestart: data.dokployRestart, databaseBackup: data.databaseBackup, type: data.notificationType, smtpServer: data.email?.smtpServer, smtpPort: data.email?.smtpPort, username: data.email?.username, password: data.email?.password, toAddresses: data.email?.toAddresses, fromAddress: data.email?.fromAddress, name: data.name, dockerCleanup: data.dockerCleanup, }); } } }, [form, form.reset, data]); const onSubmit = async (formData: NotificationSchema) => { const { appBuildError, appDeploy, dokployRestart, databaseBackup, dockerCleanup, } = formData; let promise: Promise | null = null; if (formData?.type === "slack" && data?.slackId) { promise = slackMutation.mutateAsync({ appBuildError: appBuildError, appDeploy: appDeploy, dokployRestart: dokployRestart, databaseBackup: databaseBackup, webhookUrl: formData.webhookUrl, channel: formData.channel, name: formData.name, notificationId: notificationId, slackId: data?.slackId, dockerCleanup: dockerCleanup, }); } else if (formData.type === "telegram" && data?.telegramId) { promise = telegramMutation.mutateAsync({ appBuildError: appBuildError, appDeploy: appDeploy, dokployRestart: dokployRestart, databaseBackup: databaseBackup, botToken: formData.botToken, chatId: formData.chatId, name: formData.name, notificationId: notificationId, telegramId: data?.telegramId, dockerCleanup: dockerCleanup, }); } else if (formData.type === "discord" && data?.discordId) { promise = discordMutation.mutateAsync({ appBuildError: appBuildError, appDeploy: appDeploy, dokployRestart: dokployRestart, databaseBackup: databaseBackup, webhookUrl: formData.webhookUrl, name: formData.name, notificationId: notificationId, discordId: data?.discordId, dockerCleanup: dockerCleanup, }); } else if (formData.type === "email" && data?.emailId) { promise = emailMutation.mutateAsync({ appBuildError: appBuildError, appDeploy: appDeploy, dokployRestart: dokployRestart, databaseBackup: databaseBackup, smtpServer: formData.smtpServer, smtpPort: formData.smtpPort, username: formData.username, password: formData.password, fromAddress: formData.fromAddress, toAddresses: formData.toAddresses, name: formData.name, notificationId: notificationId, emailId: data?.emailId, dockerCleanup: dockerCleanup, }); } if (promise) { await promise .then(async () => { toast.success("Notification Updated"); await utils.notification.all.invalidate(); refetch(); }) .catch(() => { toast.error("Error to update a notification"); }); } }; return ( Update Notification Update the current notification config
{data?.notificationType === "slack" ? "Slack" : data?.notificationType === "telegram" ? "Telegram" : data?.notificationType === "discord" ? "Discord" : "Email"}
{data?.notificationType === "slack" && ( )} {data?.notificationType === "telegram" && ( )} {data?.notificationType === "discord" && ( )} {data?.notificationType === "email" && ( )}
( Name )} /> {type === "slack" && ( <> ( Webhook URL )} /> ( Channel )} /> )} {type === "telegram" && ( <> ( Bot Token )} /> ( Chat ID )} /> )} {type === "discord" && ( <> ( Webhook URL )} /> )} {type === "email" && ( <>
( SMTP Server )} /> ( SMTP Port { const value = e.target.value; if (value) { const port = Number.parseInt(value); if (port > 0 && port < 65536) { field.onChange(port); } } }} /> )} />
( Username )} /> ( Password )} />
( From Address )} />
To Addresses {fields.map((field, index) => (
( )} />
))} {type === "email" && "toAddresses" in form.formState.errors && (
{form.formState?.errors?.toAddresses?.root?.message}
)}
)}
Select the actions.
(
App Deploy Trigger the action when a app is deployed.
)} /> (
App Builder Error Trigger the action when the build fails.
)} /> (
Database Backup Trigger the action when a database backup is created.
)} /> (
Docker Cleanup Trigger the action when the docker cleanup is performed.
)} /> (
Dokploy Restart Trigger the action when a dokploy is restarted.
)} />
); };