import { useState, FC } from "react"; import { useRouter } from "next/router"; import { Button, Tooltip } from "@plane/ui"; import { Copy, Eye, EyeOff, RefreshCw } from "lucide-react"; import { observer } from "mobx-react-lite"; // hooks import useToast from "hooks/use-toast"; // store import { useMobxStore } from "lib/mobx/store-provider"; // helpers import { copyTextToClipboard } from "helpers/string.helper"; import { csvDownload } from "helpers/download.helper"; // utils import { getCurrentHookAsCSV } from "../utils"; // types import { IWebhook } from "types"; type Props = { data: Partial; }; export const WebhookSecretKey: FC = observer((props) => { const { data } = props; // states const [isRegenerating, setIsRegenerating] = useState(false); const [shouldShowKey, setShouldShowKey] = useState(false); // router const router = useRouter(); const { workspaceSlug, webhookId } = router.query; // store const { webhook: { currentWebhook, regenerateSecretKey, webhookSecretKey }, workspace: { currentWorkspace }, } = useMobxStore(); // hooks const { setToastAlert } = useToast(); const handleCopySecretKey = () => { if (!webhookSecretKey) return; copyTextToClipboard(webhookSecretKey) .then(() => setToastAlert({ type: "success", title: "Success!", message: "Secret key copied to clipboard.", }) ) .catch(() => setToastAlert({ type: "error", title: "Error!", message: "Error occurred while copying secret key.", }) ); }; const handleRegenerateSecretKey = () => { if (!workspaceSlug || !webhookId) return; setIsRegenerating(true); regenerateSecretKey(workspaceSlug.toString(), webhookId.toString()) .then(() => { setToastAlert({ type: "success", title: "Success!", message: "New key regenerated successfully.", }); const csvData = getCurrentHookAsCSV(currentWorkspace, currentWebhook, webhookSecretKey); csvDownload(csvData, `webhook-secret-key-${Date.now()}`); }) .catch((err) => setToastAlert({ type: "error", title: "Error!", message: err?.error ?? "Something went wrong. Please try again.", }) ) .finally(() => setIsRegenerating(false)); }; const toggleShowKey = () => setShouldShowKey((prevState) => !prevState); const SECRET_KEY_OPTIONS = [ { label: "View secret key", Icon: shouldShowKey ? EyeOff : Eye, onClick: toggleShowKey, key: "eye" }, { label: "Copy secret key", Icon: Copy, onClick: handleCopySecretKey, key: "copy" }, ]; return ( <> {(data || webhookSecretKey) && (
Secret key
Generate a token to sign-in to the webhook payload
{shouldShowKey ? (

{webhookSecretKey}

) : (
{[...Array(30)].map((_, index) => (
))}
)}
{webhookSecretKey && (
{SECRET_KEY_OPTIONS.map((option) => ( ))}
)}
{data && (
)}
)} ); });