import { useState, useRef } from "react"; import { api } from "@/api/client"; import { useUiStore } from "@/stores/uiStore"; import { useAccountStore } from "@/stores/accountStore"; import { IconUpload } from "@/components/shared/Icons"; import { useT } from "@/lib/i18n"; interface Props { onClose: () => void; } export function ImportModal({ onClose }: Props) { const t = useT(); const [file, setFile] = useState(null); const [result, setResult] = useState(""); const [uploading, setUploading] = useState(false); const inputRef = useRef(null); const addToast = useUiStore((s) => s.addToast); const loadAccounts = useAccountStore((s) => s.loadAccounts); const handleDrop = (e: React.DragEvent) => { e.preventDefault(); const f = e.dataTransfer.files[0]; if (f) setFile(f); }; const doImport = async () => { if (!file) return; setUploading(true); try { const res = await api.importAccounts(file); setResult(t("toast.importResult", { imported: res.imported, skipped: res.skipped })); addToast("success", `${res.imported} ok, ${res.skipped} skip`); await loadAccounts(); } catch (e: unknown) { setResult(e instanceof Error ? e.message : t("misc.errorStr")); } finally { setUploading(false); } }; return (
e.stopPropagation()}>

{t("modal.importAccounts")}

{t("import.formats")} ({t("import.delimiter")} : {t("import.or")} |)

login:pass:{"{"}mafile{"}"}

login:pass:email:email_pass:{"{"}mafile{"}"}

login:pass:email:email_pass

e.preventDefault()} onDrop={handleDrop} onClick={() => inputRef.current?.click()} className="border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent" >

{file ? t("import.selected", { name: file.name }) : t("import.dragTxt")}

{ const f = e.target.files?.[0]; if (f) setFile(f); }} /> {result &&

{result}

}
); }