import { useRef, useState } from 'preact/hooks'; import { Download, FileUp } from 'lucide-preact'; import ConfirmDialog from '@/components/ConfirmDialog'; import { t } from '@/lib/i18n'; interface HelpPageProps { onExport: () => Promise; onImport: (file: File, replaceExisting?: boolean) => Promise; onNotify: (type: 'success' | 'error', text: string) => void; } export default function HelpPage(props: HelpPageProps) { const fileInputRef = useRef(null); const [selectedFile, setSelectedFile] = useState(null); const [exporting, setExporting] = useState(false); const [importing, setImporting] = useState(false); const [localError, setLocalError] = useState(''); const [confirmReplaceOpen, setConfirmReplaceOpen] = useState(false); function isReplaceRequiredError(error: unknown): boolean { const message = error instanceof Error ? String(error.message || '') : ''; return message.toLowerCase().includes('fresh instance'); } async function handleExport() { setLocalError(''); setExporting(true); try { await props.onExport(); props.onNotify('success', t('txt_backup_export_success')); } catch (error) { const message = error instanceof Error ? error.message : t('txt_backup_export_failed'); setLocalError(message); props.onNotify('error', message); } finally { setExporting(false); } } async function runImport(replaceExisting: boolean) { if (!selectedFile) { const message = t('txt_backup_file_required'); setLocalError(message); props.onNotify('error', message); return; } setLocalError(''); setImporting(true); try { await props.onImport(selectedFile, replaceExisting); props.onNotify('success', t('txt_backup_import_success_relogin')); setSelectedFile(null); if (fileInputRef.current) fileInputRef.current.value = ''; setConfirmReplaceOpen(false); } catch (error) { if (!replaceExisting && isReplaceRequiredError(error)) { setConfirmReplaceOpen(true); return; } const message = error instanceof Error ? error.message : t('txt_backup_import_failed'); setLocalError(message); props.onNotify('error', message); } finally { setImporting(false); } } async function handleImport() { await runImport(false); } return (

{t('txt_backup_export')}

{t('txt_backup_export_description')}

{t('txt_backup_import')}

{t('txt_backup_import_description')}

{selectedFile ? ( {t('txt_backup_selected_file_name', { name: selectedFile.name })} ) : ( {t('txt_backup_no_file_selected')} )}

{t('txt_backup_restore_note')}

{localError &&
{localError}
}
void runImport(true)} onCancel={() => setConfirmReplaceOpen(false)} />
); }