import { useEffect, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import showToast from "@calcom/lib/notification"; import { Tooltip } from "@calcom/ui"; import Button from "@calcom/ui/Button"; import { DialogFooter } from "@calcom/ui/Dialog"; import Switch from "@calcom/ui/Switch"; import { FieldsetLegend, Form, InputGroupBox, TextArea, TextField } from "@calcom/ui/form/fields"; import { trpc } from "@lib/trpc"; import { WEBHOOK_TRIGGER_EVENTS } from "@lib/webhooks/constants"; import customTemplate, { hasTemplateIntegration } from "@lib/webhooks/integrationTemplate"; import { TWebhook } from "@components/webhook/WebhookListItem"; import WebhookTestDisclosure from "@components/webhook/WebhookTestDisclosure"; export default function WebhookDialogForm(props: { eventTypeId?: number; defaultValues?: TWebhook; handleClose: () => void; }) { const { t } = useLocale(); const utils = trpc.useContext(); const { defaultValues = { id: "", eventTriggers: WEBHOOK_TRIGGER_EVENTS, subscriberUrl: "", active: true, payloadTemplate: null, secret: null, } as Omit, } = props; const [useCustomPayloadTemplate, setUseCustomPayloadTemplate] = useState(!!defaultValues.payloadTemplate); const [changeSecret, setChangeSecret] = useState(false); const [newSecret, setNewSecret] = useState(""); const hasSecretKey = !!defaultValues.secret; const currentSecret = defaultValues.secret; const form = useForm({ defaultValues, }); const handleInput = (event: React.FormEvent) => { setNewSecret(event.currentTarget.value); }; useEffect(() => { if (changeSecret) { form.unregister("secret", { keepDefaultValue: false }); } }, [changeSecret]); return (
{ const e = changeSecret ? { ...event, eventTypeId: props.eventTypeId } : { ...event, secret: currentSecret, eventTypeId: props.eventTypeId }; if (!useCustomPayloadTemplate && event.payloadTemplate) { event.payloadTemplate = null; } if (event.id) { await utils.client.mutation("viewer.webhook.edit", e); await utils.invalidateQueries(["viewer.webhook.list"]); showToast(t("webhook_updated_successfully"), "success"); } else { await utils.client.mutation("viewer.webhook.create", e); await utils.invalidateQueries(["viewer.webhook.list"]); showToast(t("webhook_created_successfully"), "success"); } props.handleClose(); }} className="space-y-4">
( { form.setValue("active", isChecked); }} /> )} />
{ form.setValue("subscriberUrl", e.target.value); if (hasTemplateIntegration({ url: e.target.value })) { setUseCustomPayloadTemplate(true); form.setValue("payloadTemplate", customTemplate({ url: e.target.value })); } }} />
{t("event_triggers")} {WEBHOOK_TRIGGER_EVENTS.map((key) => ( ( { const value = field.value; const newValue = isChecked ? [...value, key] : value.filter((v) => v !== key); form.setValue("eventTriggers", newValue, { shouldDirty: true, }); }} /> )} /> ))}
{!!hasSecretKey && !changeSecret && ( <> {t("secret")}
{t("forgotten_secret_description")}
)} {!!hasSecretKey && changeSecret && ( <> )} {!hasSecretKey && ( )}
{t("payload_template")}
{useCustomPayloadTemplate && (