import { ExternalLinkIcon, PlusIcon, TrashIcon } from "lucide-react"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { Link } from "react-router-dom"; import ConfirmDialog from "@/components/ConfirmDialog"; import { Button } from "@/components/ui/button"; import { userServiceClient } from "@/grpcweb"; import useCurrentUser from "@/hooks/useCurrentUser"; import { UserWebhook } from "@/types/proto/api/v1/user_service_pb"; import { useTranslate } from "@/utils/i18n"; import CreateWebhookDialog from "../CreateWebhookDialog"; import SettingTable from "./SettingTable"; const WebhookSection = () => { const t = useTranslate(); const currentUser = useCurrentUser(); const [webhooks, setWebhooks] = useState([]); const [isCreateWebhookDialogOpen, setIsCreateWebhookDialogOpen] = useState(false); const [deleteTarget, setDeleteTarget] = useState(undefined); const listWebhooks = async () => { if (!currentUser) return []; const { webhooks } = await userServiceClient.listUserWebhooks({ parent: currentUser.name, }); return webhooks; }; useEffect(() => { listWebhooks().then((webhooks) => { setWebhooks(webhooks); }); }, [currentUser]); const handleCreateWebhookDialogConfirm = async () => { const webhooks = await listWebhooks(); const name = webhooks[webhooks.length - 1]?.displayName || ""; setWebhooks(webhooks); setIsCreateWebhookDialogOpen(false); toast.success(t("setting.webhook-section.create-dialog.create-webhook-success", { name })); }; const handleDeleteWebhook = async (webhook: UserWebhook) => { setDeleteTarget(webhook); }; const confirmDeleteWebhook = async () => { if (!deleteTarget) return; await userServiceClient.deleteUserWebhook({ name: deleteTarget.name }); setWebhooks(webhooks.filter((item) => item.name !== deleteTarget.name)); setDeleteTarget(undefined); toast.success(t("setting.webhook-section.delete-dialog.delete-webhook-success", { name: deleteTarget.displayName })); }; return (

{t("setting.webhook-section.title")}

{webhook.displayName}, }, { key: "url", header: t("setting.webhook-section.url"), render: (_, webhook: UserWebhook) => ( {webhook.url} ), }, { key: "actions", header: "", className: "text-right", render: (_, webhook: UserWebhook) => ( ), }, ]} data={webhooks} emptyMessage={t("setting.webhook-section.no-webhooks-found")} getRowKey={(webhook) => webhook.name} />
{t("common.learn-more")}
!open && setDeleteTarget(undefined)} title={t("setting.webhook-section.delete-dialog.delete-webhook-title", { name: deleteTarget?.displayName || "" })} description={t("setting.webhook-section.delete-dialog.delete-webhook-description")} confirmLabel={t("common.delete")} cancelLabel={t("common.cancel")} onConfirm={confirmDeleteWebhook} confirmVariant="destructive" />
); }; export default WebhookSection;