import { useEffect, useState } from "react"; import { Check, Copy, ExternalLink, Key } from "lucide-react"; import { Button, Dialog } from "@/client/components/ui"; import { useToast } from "@/client/toast"; import type { WebhookProvider } from "@/contracts"; import { webhookProviderCatalog } from "@/lib/webhooks"; interface SecretRevealDialogProps { open: boolean; onClose: () => void; secret: string; provider: WebhookProvider; webhookUrl: string; } export const SecretRevealDialog = ({ open, onClose, secret, provider, webhookUrl }: SecretRevealDialogProps) => { const { pushToast } = useToast(); const [secondsRemaining, setSecondsRemaining] = useState(5); const [copied, setCopied] = useState(false); const catalog = webhookProviderCatalog[provider]; useEffect(() => { if (!open) { return; } const interval = setInterval(() => { setSecondsRemaining((prev) => { if (prev <= 1) { clearInterval(interval); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(interval); }, [open]); const handleCopySecret = () => { void navigator.clipboard.writeText(secret).then(() => { setCopied(true); pushToast({ tone: "info", title: "Copied", message: "Webhook secret copied to clipboard." }); setTimeout(() => setCopied(false), 2000); }); }; return ( } dismissDisabled={secondsRemaining > 0} >
This secret is shown only once. Copy it now and paste it into your {catalog.displayName} webhook settings.
Secret
{secret}
Webhook URL
{webhookUrl}
Setup instructions