import { EventTypeSetupProps, FormValues } from "pages/event-types/[type]"; import { useState } from "react"; import { TbWebhook } from "react-icons/tb"; import { WebhookForm } from "@calcom/features/webhooks/components"; import { WebhookFormSubmitData } from "@calcom/features/webhooks/components/WebhookForm"; import WebhookListItem from "@calcom/features/webhooks/components/WebhookListItem"; import { APP_NAME } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Webhook } from "@calcom/prisma/client"; import { trpc } from "@calcom/trpc/react"; import { Button, Dialog, DialogContent, EmptyScreen, showToast } from "@calcom/ui"; import { FiPlus } from "@calcom/ui/components/icon"; export const EventTeamWebhooksTab = ({ eventType, team, }: Pick) => { const { t } = useLocale(); const utils = trpc.useContext(); const { data: webhooks } = trpc.viewer.webhook.list.useQuery({ eventTypeId: eventType.id }); const { data: installedApps, isLoading } = trpc.viewer.integrations.useQuery({ variant: "other", onlyInstalled: true, }); const [createModalOpen, setCreateModalOpen] = useState(false); const [editModalOpen, setEditModalOpen] = useState(false); const [webhookToEdit, setWebhookToEdit] = useState(); const subscriberUrlReserved = (subscriberUrl: string, id?: string): boolean => { return !!webhooks?.find( (webhook) => webhook.subscriberUrl === subscriberUrl && (!id || webhook.id !== id) ); }; const editWebhookMutation = trpc.viewer.webhook.edit.useMutation({ async onSuccess() { setEditModalOpen(false); await utils.viewer.webhook.list.invalidate(); showToast(t("webhook_updated_successfully"), "success"); }, onError(error) { showToast(`${error.message}`, "error"); }, }); const createWebhookMutation = trpc.viewer.webhook.create.useMutation({ async onSuccess() { showToast(t("webhook_created_successfully"), "success"); await utils.viewer.webhook.list.invalidate(); setCreateModalOpen(false); }, onError(error) { showToast(`${error.message}`, "error"); }, }); const onCreateWebhook = async (values: WebhookFormSubmitData) => { if (subscriberUrlReserved(values.subscriberUrl, values.id)) { showToast(t("webhook_subscriber_url_reserved"), "error"); return; } if (!values.payloadTemplate) { values.payloadTemplate = null; } createWebhookMutation.mutate({ subscriberUrl: values.subscriberUrl, eventTriggers: values.eventTriggers, active: values.active, payloadTemplate: values.payloadTemplate, secret: values.secret, eventTypeId: eventType.id, }); }; const NewWebhookButton = () => { const { t } = useLocale(); return ( ); }; return (
{team && webhooks && !isLoading && ( <>
<> {webhooks.length ? ( <>
{webhooks.map((webhook, index) => { return ( { setEditModalOpen(true); setWebhookToEdit(webhook); }} /> ); })}
) : ( } /> )}
{/* New webhook dialog */} !isOpen && setCreateModalOpen(false)}> setCreateModalOpen(false)} apps={installedApps?.items.map((app) => app.slug)} /> {/* Edit webhook dialog */} !isOpen && setEditModalOpen(false)}> app.slug)} onCancel={() => setEditModalOpen(false)} onSubmit={(values: WebhookFormSubmitData) => { if (subscriberUrlReserved(values.subscriberUrl, webhookToEdit?.id || "")) { showToast(t("webhook_subscriber_url_reserved"), "error"); return; } if (values.changeSecret) { values.secret = values.newSecret.length ? values.newSecret : null; } if (!values.payloadTemplate) { values.payloadTemplate = null; } editWebhookMutation.mutate({ id: webhookToEdit?.id || "", subscriberUrl: values.subscriberUrl, eventTriggers: values.eventTriggers, active: values.active, payloadTemplate: values.payloadTemplate, secret: values.secret, eventTypeId: webhookToEdit?.eventTypeId || undefined, }); }} /> )}
); };