import type { WebhookSummary } from "@/contracts"; import { useState } from "react"; import { RotateCw } from "lucide-react"; import { ConfirmDialog } from "@/client/components/ui"; import { SecretRevealDialog } from "@/client/components/webhooks/secret-reveal-dialog"; import { formatApiError, getApiClient } from "@/client/lib"; import { useToast } from "@/client/toast"; import { webhookProviderCatalog } from "@/lib/webhooks"; interface RotateSecretDialogProps { open: boolean; onClose: () => void; webhook: WebhookSummary; webhookUrl: string; onRotated: () => void; } export const RotateSecretDialog = ({ open, onClose, webhook, webhookUrl, onRotated }: RotateSecretDialogProps) => { const { pushToast } = useToast(); const [rotating, setRotating] = useState(false); const [newSecret, setNewSecret] = useState(null); const catalog = webhookProviderCatalog[webhook.provider]; const handleConfirm = () => { setRotating(true); void getApiClient() .rotateWebhookSecret(webhook.projectId, webhook.provider) .then((response) => { setNewSecret(response.secret); onRotated(); pushToast({ tone: "success", title: "Secret rotated", message: `Update your ${catalog.displayName} webhook configuration.`, }); }) .catch((reason: unknown) => { pushToast({ tone: "error", title: "Rotation failed", message: formatApiError(reason) }); onClose(); }) .finally(() => { setRotating(false); }); }; const handleClose = () => { setNewSecret(null); onClose(); }; if (newSecret) { return ( ); } return ( } /> ); };