import { ReactNode, useEffect, useMemo, useState } from "react"; import { faCheck, faDownload, faTriangleExclamation, faXmark, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { differenceInSeconds } from "date-fns"; import { twMerge } from "tailwind-merge"; import { Badge, Tooltip } from "@app/components/v2"; import { BadgeProps } from "@app/components/v2/Badge/Badge"; import { SECRET_SYNC_MAP } from "@app/helpers/secretSyncs"; import { SecretSyncStatus, TSecretSync } from "@app/hooks/api/secretSyncs"; type Props = { secretSync: TSecretSync; className?: string; mini?: boolean; }; export const SecretSyncImportStatusBadge = ({ secretSync, className, mini }: Props) => { const { importStatus, lastImportMessage, lastImportedAt, destination } = secretSync; const [hide, setHide] = useState(importStatus === SecretSyncStatus.Succeeded); const destinationName = SECRET_SYNC_MAP[destination].name; useEffect(() => { if (importStatus === SecretSyncStatus.Succeeded) { setTimeout(() => setHide(true), 3000); } else { setHide(false); } }, [importStatus]); const failureMessage = useMemo(() => { if (importStatus === SecretSyncStatus.Failed) { if (lastImportMessage) try { return JSON.stringify(JSON.parse(lastImportMessage), null, 2); } catch { return lastImportMessage; } return "An Unknown Error Occurred."; } return null; }, [importStatus, lastImportMessage]); if (!importStatus || hide) return null; let variant: BadgeProps["variant"]; let label: string; let icon: IconDefinition; let tooltipContent: ReactNode; switch (importStatus) { case SecretSyncStatus.Pending: case SecretSyncStatus.Running: variant = "primary"; label = "Importing Secrets..."; tooltipContent = `Importing secrets from ${destinationName}. This may take a moment.`; icon = faDownload; break; case SecretSyncStatus.Failed: variant = "danger"; label = "Failed to Import Secrets"; icon = faTriangleExclamation; tooltipContent = (
{failureMessage && (
{mini ? "Failed to Import Secrets" : "Failure Reason"}
{failureMessage}
)}
); break; case SecretSyncStatus.Succeeded: default: // only show success for a bit... if (lastImportedAt && differenceInSeconds(new Date(), lastImportedAt) > 15) return null; tooltipContent = "Successfully imported secrets."; variant = "success"; label = "Secrets Imported"; icon = faCheck; } return (
{!mini && {label}}
); };