"use client"; import Link from "next/link"; import { useState } from "react"; import { getWebhookVersionDocsUrl, getWebhookVersionLabel } from "@calcom/features/webhooks/lib/constants"; import type { Webhook } from "@calcom/features/webhooks/lib/dto/types"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import classNames from "@calcom/ui/classNames"; import { Badge } from "@calcom/ui/components/badge"; import { Button } from "@calcom/ui/components/button"; import { Dropdown, DropdownItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@calcom/ui/components/dropdown"; import { Switch } from "@calcom/ui/components/form"; import { showToast } from "@calcom/ui/components/toast"; import { Tooltip } from "@calcom/ui/components/tooltip"; import { ExternalLinkIcon } from "@coss/ui/icons"; import { revalidateEventTypeEditPage } from "@calcom/web/app/(use-page-wrapper)/event-types/[type]/actions"; import { revalidateWebhooksList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions"; import { DeleteWebhookDialog } from "./dialogs/DeleteWebhookDialog"; const MAX_BADGES_TWO_ROWS = 8; // Approximately 2 rows of badges export default function WebhookListItem(props: { webhook: Webhook; canEditWebhook?: boolean; onEditWebhook: () => void; lastItem: boolean; permissions: { canEditWebhook?: boolean; canDeleteWebhook?: boolean; }; }) { const { t } = useLocale(); const utils = trpc.useUtils(); const { webhook } = props; const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const deleteWebhook = trpc.viewer.webhook.delete.useMutation({ async onSuccess() { if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId); revalidateWebhooksList(); showToast(t("webhook_removed_successfully"), "success"); await utils.viewer.webhook.getByViewer.invalidate(); await utils.viewer.webhook.list.invalidate(); await utils.viewer.eventTypes.get.invalidate(); setDeleteDialogOpen(false); }, onError() { showToast(t("something_went_wrong"), "error"); setDeleteDialogOpen(false); }, }); const toggleWebhook = trpc.viewer.webhook.edit.useMutation({ async onSuccess(data) { if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId); revalidateWebhooksList(); showToast(t(data?.active ? "enabled" : "disabled"), "success"); await utils.viewer.webhook.getByViewer.invalidate(); await utils.viewer.webhook.list.invalidate(); await utils.viewer.eventTypes.get.invalidate(); }, }); return (

{webhook.subscriberUrl}

{!props.permissions.canEditWebhook && ( {t("readonly")} )}
{getWebhookVersionLabel(webhook.version)}
{webhook.eventTriggers.slice(0, MAX_BADGES_TWO_ROWS).map((trigger) => ( {t(`${trigger.toLowerCase()}`)} ))} {webhook.eventTriggers.length > MAX_BADGES_TWO_ROWS && ( {webhook.eventTriggers.slice(MAX_BADGES_TWO_ROWS).map((trigger) => ( {t(`${trigger.toLowerCase()}`)} ))}
}> +{webhook.eventTriggers.length - MAX_BADGES_TWO_ROWS} {t("more")}
)}
{(props.permissions.canEditWebhook || props.permissions.canDeleteWebhook) && (
toggleWebhook.mutate({ id: webhook.id, active: checked, payloadTemplate: webhook.payloadTemplate, eventTypeId: webhook.eventTypeId || undefined, }) } /> {props.permissions.canEditWebhook && ( )} {props.permissions.canDeleteWebhook && (
)} { deleteWebhook.mutate({ id: webhook.id, eventTypeId: webhook.eventTypeId || undefined, teamId: webhook.teamId || undefined, }); }} /> ); }