import { ExternalLinkIcon, 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"; import { useTranslate } from "@/utils/i18n"; import CreateWebhookDialog from "../CreateWebhookDialog"; 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")}

{webhooks.map((webhook) => ( ))} {webhooks.length === 0 && ( )}
{t("common.name")} {t("setting.webhook-section.url")} {t("common.delete")}
{webhook.displayName} {webhook.url}
{t("setting.webhook-section.no-webhooks-found")}
{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;