import { PencilAltIcon, TrashIcon } from "@heroicons/react/outline"; import { WebhookTriggerEvents } from "@prisma/client"; import Image from "next/image"; import { getErrorFromUnknown } from "pages/_error"; import { Fragment, ReactNode, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { useMutation } from "react-query"; import { QueryCell } from "@lib/QueryCell"; import classNames from "@lib/classNames"; import * as fetcher from "@lib/core/http/fetch-wrapper"; import { useLocale } from "@lib/hooks/useLocale"; import { AddAppleIntegrationModal } from "@lib/integrations/Apple/components/AddAppleIntegration"; import { AddCalDavIntegrationModal } from "@lib/integrations/CalDav/components/AddCalDavIntegration"; import showToast from "@lib/notification"; import { inferQueryOutput, trpc } from "@lib/trpc"; import { Dialog, DialogContent, DialogFooter, DialogTrigger } from "@components/Dialog"; import { List, ListItem, ListItemText, ListItemTitle } from "@components/List"; import Shell, { ShellSubHeading } from "@components/Shell"; import { Tooltip } from "@components/Tooltip"; import ConfirmationDialogContent from "@components/dialog/ConfirmationDialogContent"; import { FieldsetLegend, Form, InputGroupBox, TextField } from "@components/form/fields"; import { Alert } from "@components/ui/Alert"; import Badge from "@components/ui/Badge"; import Button, { ButtonBaseProps } from "@components/ui/Button"; import Switch from "@components/ui/Switch"; function pluralize(opts: { num: number; plural: string; singular: string }) { if (opts.num === 0) { return opts.singular; } return opts.singular; } type TIntegrations = inferQueryOutput<"viewer.integrations">; type TWebhook = TIntegrations["webhooks"][number]; const ALL_TRIGGERS: WebhookTriggerEvents[] = [ // "BOOKING_CREATED", "BOOKING_RESCHEDULED", "BOOKING_CANCELLED", ]; function WebhookListItem(props: { webhook: TWebhook; onEditWebhook: () => void }) { const { t } = useLocale(); const utils = trpc.useContext(); const deleteWebhook = useMutation(async () => fetcher.remove(`/api/webhooks/${props.webhook.id}`, null), { async onSuccess() { await utils.invalidateQueries(["viewer.integrations"]); }, }); return (
{props.webhook.eventTriggers.map((eventTrigger, ind) => ( {t(`${eventTrigger.toLowerCase()}`)} ))}
{props.webhook.subscriberUrl}
{!props.webhook.active && ( {t("disabled")} )} {!!props.webhook.active && ( {t("enabled")} )} deleteWebhook.mutate()}> {t("delete_webhook_confirmation_message")}
); } function WebhookDialogForm(props: { // defaultValues?: TWebhook; handleClose: () => void; }) { const { t } = useLocale(); const utils = trpc.useContext(); const { defaultValues = { id: "", eventTriggers: ALL_TRIGGERS, subscriberUrl: "", active: true, }, } = props; const form = useForm({ defaultValues, }); return (
{ form .handleSubmit(async (values) => { const { id } = values; const body = { subscriberUrl: values.subscriberUrl, enabled: values.active, eventTriggers: values.eventTriggers, }; if (id) { await fetcher.patch(`/api/webhooks/${id}`, body); await utils.invalidateQueries(["viewer.integrations"]); showToast(t("webhook_updated_successfully"), "success"); } else { await fetcher.post("/api/webhook", body); await utils.invalidateQueries(["viewer.integrations"]); showToast(t("webhook_created_successfully"), "success"); } props.handleClose(); })(event) .catch((err) => { showToast(`${getErrorFromUnknown(err).message}`, "error"); }); }} className="space-y-4">
{t("event_triggers")} {ALL_TRIGGERS.map((key) => ( ( { const value = field.value; const newValue = isChecked ? [...value, key] : value.filter((v) => v !== key); form.setValue("eventTriggers", newValue, { shouldDirty: true, }); }} /> )} /> ))}
{t("webhook_status")} ( { form.setValue("active", isChecked); }} /> )} />
); } function WebhookEmbed(props: { webhooks: TWebhook[] }) { const { t } = useLocale(); const user = trpc.useQuery(["viewer.me"]).data; const iframeTemplate = ``; const htmlTemplate = `${t( "schedule_a_meeting" )}${iframeTemplate}`; const [newWebhookModal, setNewWebhookModal] = useState(false); const [editModalOpen, setEditModalOpen] = useState(false); const [editing, setEditing] = useState(null); return ( <>
Webhooks
Webhooks Automation
{props.webhooks.length ? ( {props.webhooks.map((item) => ( { setEditing(item); setEditModalOpen(true); }} /> ))} ) : null}
{/* {!!props.webhooks.length && ( {}} onEditWebhook={editWebhook}> )} */}