"use client"; import { 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 { 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 { Badge } from "@coss/ui/components/badge"; import { Button } from "@coss/ui/components/button"; import { Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuPopup, MenuSeparator, MenuTrigger, } from "@coss/ui/components/menu"; import { Switch } from "@coss/ui/components/switch"; import { toastManager } from "@coss/ui/components/toast"; import { Tooltip, TooltipPopup, TooltipProvider, TooltipTrigger, } from "@coss/ui/components/tooltip"; import { useIsMobile } from "@coss/ui/hooks/use-mobile"; import { ListItem, ListItemActions, ListItemBadges, ListItemContent, ListItemHeader, ListItemTitle, ListItemTitleLink, } from "@coss/ui/shared/list-item"; import { EllipsisIcon, ExternalLinkIcon, PencilIcon, TrashIcon, WebhookIcon } from "@coss/ui/icons"; import Link from "next/link"; import { useEffect, useState } from "react"; import { DeleteWebhookDialog } from "./dialogs/DeleteWebhookDialog"; const MAX_BADGES_TWO_ROWS = 7; export default function WebhookListItem(props: { webhook: Webhook; profile?: { name: string | null; image?: string; slug?: string | null }; canEditWebhook?: boolean; editHref?: string; onEditWebhookAction?: () => void; permissions: { canEditWebhook?: boolean; canDeleteWebhook?: boolean; }; }) { const { t } = useLocale(); const utils = trpc.useUtils(); const { webhook } = props; const [active, setActive] = useState(webhook.active); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [badgesExpanded, setBadgesExpanded] = useState(false); const isMobile = useIsMobile(); useEffect(() => { setActive(webhook.active); }, [webhook.active]); const deleteWebhook = trpc.viewer.webhook.delete.useMutation({ async onSuccess() { if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId); revalidateWebhooksList(); toastManager.add({ title: t("webhook_removed_successfully"), type: "success" }); await utils.viewer.webhook.getByViewer.invalidate(); await utils.viewer.webhook.list.invalidate(); await utils.viewer.eventTypes.get.invalidate(); setDeleteDialogOpen(false); }, onError() { toastManager.add({ title: t("something_went_wrong"), type: "error" }); setDeleteDialogOpen(false); }, }); const toggleWebhook = trpc.viewer.webhook.edit.useMutation({ async onSuccess() { if (webhook.eventTypeId) revalidateEventTypeEditPage(webhook.eventTypeId); revalidateWebhooksList(); toastManager.add({ title: t("webhook_updated_successfully"), type: "success" }); await utils.viewer.webhook.getByViewer.invalidate(); await utils.viewer.webhook.list.invalidate(); await utils.viewer.eventTypes.get.invalidate(); }, onError() { toastManager.add({ title: t("something_went_wrong"), type: "error" }); }, }); return (
{props.permissions.canEditWebhook && props.editHref ? ( {webhook.subscriberUrl} ) : props.permissions.canEditWebhook && props.onEditWebhookAction ? ( { e.preventDefault(); props.onEditWebhookAction?.(); }}> {webhook.subscriberUrl} ) : ( {webhook.subscriberUrl} )}
{!props.permissions.canEditWebhook && {t("readonly")}}
}> {getWebhookVersionLabel(webhook.version)} {t("webhook_version")} }> {t("webhook_version_docs")} {t("webhook_version_docs", { version: getWebhookVersionLabel(webhook.version), })}
{webhook.eventTriggers.slice(0, badgesExpanded ? undefined : MAX_BADGES_TWO_ROWS).map((trigger) => ( {t(`${trigger.toLowerCase()}`)} ))} {!badgesExpanded && webhook.eventTriggers.length > MAX_BADGES_TWO_ROWS && ( } onClick={() => setBadgesExpanded(true)}> +{webhook.eventTriggers.length - MAX_BADGES_TWO_ROWS} {t("more")} )}
{!isMobile && (
{props.permissions.canEditWebhook ? ( { setActive(checked); toggleWebhook.mutate({ id: webhook.id, active: checked, payloadTemplate: webhook.payloadTemplate, eventTypeId: webhook.eventTypeId || undefined, }); }} /> } /> {active ? t("disable_webhook") : t("enable_webhook")} ) : ( )}
{props.permissions.canEditWebhook ? ( props.editHref ? ( } size="icon" variant="outline" > ) : ( ) ) : ( )} {props.permissions.canDeleteWebhook ? ( setDeleteDialogOpen(true)} disabled={deleteWebhook.isPending} > ) : ( )}
)} {isMobile && ( }> {props.permissions.canEditWebhook ? ( { setActive(checked); toggleWebhook.mutate({ id: webhook.id, active: checked, payloadTemplate: webhook.payloadTemplate, eventTypeId: webhook.eventTypeId || undefined, }); }} variant="switch" > {t("enable_webhook")} ) : ( {t("enable_webhook")} )} {props.permissions.canEditWebhook ? ( props.editHref ? ( }> {t("edit")} ) : ( {t("edit")} ) ) : ( {t("edit")} )} {props.permissions.canDeleteWebhook ? ( setDeleteDialogOpen(true)} disabled={deleteWebhook.isPending} > {t("delete")} ) : ( {t("delete")} )} )}
{ deleteWebhook.mutate({ id: webhook.id, eventTypeId: webhook.eventTypeId || undefined, teamId: webhook.teamId || undefined, }); }} />
); }