"use client"; import { useState, useId } from "react"; import { useFocusTrap } from "@/hooks/use-focus-trap"; import { useTranslations } from "next-intl"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { KeyRound, Eye, EyeOff } from "lucide-react"; interface SmimePassphraseDialogProps { isOpen: boolean; onClose: () => void; onSubmit: (passphrase: string) => void | Promise; title: string; description?: string; submitText?: string; error?: string | null; /** Show a second passphrase field for import/export confirmation. */ showConfirm?: boolean; } export function SmimePassphraseDialog({ isOpen, onClose, onSubmit, title, description, submitText, error, showConfirm = false, }: SmimePassphraseDialogProps) { const t = useTranslations("smime"); const id = useId(); const [passphrase, setPassphrase] = useState(""); const [confirm, setConfirm] = useState(""); const [showPassword, setShowPassword] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const dialogRef = useFocusTrap({ isActive: isOpen, onEscape: onClose, restoreFocus: true, }); if (!isOpen) return null; const mismatch = showConfirm && passphrase !== confirm && confirm.length > 0; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!passphrase || (showConfirm && passphrase !== confirm)) return; setIsSubmitting(true); try { await onSubmit(passphrase); } finally { setIsSubmitting(false); } }; const handleClose = () => { setPassphrase(""); setConfirm(""); setShowPassword(false); onClose(); }; return (

{title}

{description && (

{description}

)}
setPassphrase(e.target.value)} placeholder={t("passphrase_placeholder")} autoFocus className="pr-10" autoComplete="off" />
{showConfirm && (
setConfirm(e.target.value)} placeholder={t("confirm_passphrase_placeholder")} autoComplete="off" /> {mismatch && (

{t("passphrase_mismatch")}

)}
)} {error && (

{error}

)}
); }