import React, {useState} from 'react'; import {ArrowRightLeft, CheckCircle, AlertTriangle, FolderOpen, Loader2} from 'lucide-react'; import Modal from '@/components/ui/Modal'; import Button from '@/components/ui/Button'; import {useTranslations} from '@/lib/i18n'; import * as tauri from '@/lib/tauri'; interface MigrationModalProps { onClose: () => void; onSuccess: () => void; } type MigrationStep = 'intro' | 'select' | 'importing' | 'success' | 'error'; export default function MigrationModal({onClose, onSuccess}: MigrationModalProps) { const t = useTranslations(); const [step, setStep] = useState('intro'); const [filePath, setFilePath] = useState(''); const [errorMsg, setErrorMsg] = useState(''); const [migratedUserId, setMigratedUserId] = useState(''); async function handleCheck(): Promise { if (!filePath.trim()) return; try { const result: tauri.MigrationCheckResult = await tauri.checkElectronMigration(filePath.trim()); if (!result.found) { setErrorMsg(t('migration.fileNotFound')); setStep('error'); return; } if (!result.hasDb) { setErrorMsg(t('migration.dbNotFound')); setStep('error'); return; } await handleImport(); } catch (e: unknown) { setErrorMsg(e instanceof Error ? e.message : String(e)); setStep('error'); } } async function handleImport(): Promise { setStep('importing'); try { const result: tauri.MigrationResult = await tauri.importFromElectron(filePath.trim()); if (result.success) { setMigratedUserId(result.userId || ''); setStep('success'); } else { setErrorMsg(result.error || t('migration.importFailed')); setStep('error'); } } catch (e: unknown) { setErrorMsg(e instanceof Error ? e.message : String(e)); setStep('error'); } } function handleSuccessClose(): void { localStorage.setItem('electron_migration_done', 'true'); onSuccess(); } function handleDismiss(): void { localStorage.setItem('electron_migration_dismissed', 'true'); onClose(); } return ( {step === 'intro' && (

{t('migration.introText')}

{t('migration.steps')}

  1. {t('migration.step1')}
  2. {t('migration.step2')}
  3. {t('migration.step3')}
)} {step === 'select' && (

{t('migration.selectText')}

): void { setFilePath(e.target.value); }} placeholder="/Users/.../Desktop/eritors-migration.json" className="w-full px-4 py-2.5 rounded-xl bg-tertiary border border-secondary text-text-primary text-sm placeholder:text-muted/50 focus:outline-none focus:border-primary" />
)} {step === 'importing' && (

{t('migration.importing')}

)} {step === 'success' && (

{t('migration.successTitle')}

{t('migration.successText')}

)} {step === 'error' && (

{t('migration.errorTitle')}

{errorMsg}

)}
); }