import { t } from "@lingui/core/macro"; import type { Locale as DateFnsLocale } from "date-fns"; import { format } from "date-fns"; import { HiEllipsisHorizontal } from "react-icons/hi2"; import { twMerge } from "tailwind-merge"; import Dropdown from "~/components/Dropdown"; import { useLocalisation } from "~/hooks/useLocalisation"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { api } from "~/utils/api"; interface TableRowProps { publicId?: string; name?: string; url?: string; events?: string[]; active?: boolean; createdAt?: Date | null; dateLocale?: DateFnsLocale; isLastRow?: boolean; showSkeleton?: boolean; onEdit?: () => void; onTest?: () => void; onDelete?: () => void; } function formatEvents(events: string[]) { return events .map((e) => e.replace("card.", "")) .join(", "); } function formatDate(date?: Date | null, locale?: DateFnsLocale) { if (!date) return "Never"; return format(date, "MMM d, yyyy", { locale }); } function TableRow({ publicId, name, url, events, active, createdAt, dateLocale, isLastRow, showSkeleton, onEdit, onTest, onDelete, }: TableRowProps) { return (

{name}

{url}

{events && formatEvents(events)}

{!showSkeleton && (active ? t`Active` : t`Inactive`)}

{formatDate(createdAt, dateLocale)}

{!showSkeleton && (
onEdit?.(), }, { label: t`Test`, action: () => onTest?.(), }, { label: t`Delete`, action: () => onDelete?.(), }, ]} >
)} ); } interface WebhookListProps { workspacePublicId: string; } export default function WebhookList({ workspacePublicId }: WebhookListProps) { const { openModal, setModalState } = useModal(); const { showPopup } = usePopup(); const { dateLocale } = useLocalisation(); const { data: webhooks, isLoading } = api.webhook.list.useQuery({ workspacePublicId, }); const testWebhookMutation = api.webhook.test.useMutation({ onSuccess: (result) => { if (result.success) { showPopup({ message: t`Test webhook sent successfully!`, type: "success" }); } else { showPopup({ message: result.error || t`Webhook test failed`, type: "error", }); } }, onError: (error) => { showPopup({ message: error.message || t`Failed to test webhook`, type: "error", }); }, }); if (!isLoading && (!webhooks || webhooks.length === 0)) { return (

{t`No webhooks configured. Add a webhook to receive notifications.`}

); } return (
{!isLoading && webhooks?.map((webhook, index) => ( { setModalState("EDIT_WEBHOOK", { publicId: webhook.publicId, name: webhook.name, url: webhook.url, events: webhook.events, active: webhook.active, }); openModal("EDIT_WEBHOOK", webhook.publicId, webhook.name); }} onTest={() => { testWebhookMutation.mutate({ workspacePublicId, webhookPublicId: webhook.publicId, }); }} onDelete={() => { openModal("DELETE_WEBHOOK", webhook.publicId, webhook.name); }} /> ))} {isLoading && ( <> )}
{t`Name`} {t`URL`} {t`Events`} {t`Status`} {t`Created`} {/* Actions column */}
); }