import { useState, useCallback, useRef } from "preact/hooks"; import { useT } from "../../../shared/i18n/context"; interface ImportResult { success: boolean; added: number; updated: number; failed: number; errors: string[]; } interface AccountImportExportProps { onExport: (selectedIds?: string[]) => Promise; onImport: (file: File) => Promise; selectedIds: Set; } export function AccountImportExport({ onExport, onImport, selectedIds }: AccountImportExportProps) { const t = useT(); const fileRef = useRef(null); const [importing, setImporting] = useState(false); const [result, setResult] = useState(null); const handleExport = useCallback(async () => { try { const ids = selectedIds.size > 0 ? [...selectedIds] : undefined; await onExport(ids); } catch (err) { console.error("[AccountExport] failed:", err); } }, [onExport, selectedIds]); const handleFileChange = useCallback(async () => { const files = fileRef.current?.files; if (!files || files.length === 0) return; setImporting(true); setResult(null); try { let totalAdded = 0, totalUpdated = 0, totalFailed = 0; for (const file of files) { const res = await onImport(file); totalAdded += res.added; totalUpdated += res.updated; totalFailed += res.failed; } const msg = t("accountImportResult") .replace("{added}", String(totalAdded)) .replace("{updated}", String(totalUpdated)) .replace("{failed}", String(totalFailed)); setResult(msg); } catch { setResult(t("accountImportError")); } finally { setImporting(false); if (fileRef.current) fileRef.current.value = ""; } }, [onImport, t]); const triggerFileSelect = useCallback(() => { fileRef.current?.click(); }, []); const exportTitle = selectedIds.size > 0 ? `${t("exportBtn")} (${selectedIds.size})` : t("exportBtn"); return ( <> {selectedIds.size > 0 && ( )} {result && ( )} ); }