Spaces:
Sleeping
Sleeping
| import { Download, Upload } from 'lucide-react' | |
| export default function BackupSection({ | |
| t, | |
| importMode, | |
| setImportMode, | |
| importing, | |
| onLoadExportData, | |
| onDownloadExportFile, | |
| onImport, | |
| onImportFileChange, | |
| importText, | |
| setImportText, | |
| exportData, | |
| }) { | |
| return ( | |
| <div className="bg-card border border-border rounded-xl p-5 space-y-4"> | |
| <h3 className="font-semibold">{t('settings.backupTitle')}</h3> | |
| <div className="flex flex-wrap items-center gap-3"> | |
| <button | |
| type="button" | |
| onClick={onLoadExportData} | |
| className="px-3 py-2 rounded-lg bg-secondary border border-border hover:bg-secondary/80 text-sm flex items-center gap-2" | |
| > | |
| <Download className="w-4 h-4" /> | |
| {t('settings.loadExport')} | |
| </button> | |
| <button | |
| type="button" | |
| onClick={onDownloadExportFile} | |
| className="px-3 py-2 rounded-lg bg-secondary border border-border hover:bg-secondary/80 text-sm flex items-center gap-2" | |
| > | |
| <Download className="w-4 h-4" /> | |
| {t('settings.downloadExport')} | |
| </button> | |
| <label className="px-3 py-2 rounded-lg bg-secondary border border-border hover:bg-secondary/80 text-sm flex items-center gap-2 cursor-pointer"> | |
| <Upload className="w-4 h-4" /> | |
| {t('settings.chooseImportFile')} | |
| <input | |
| type="file" | |
| accept=".json,application/json" | |
| className="hidden" | |
| onChange={(e) => { | |
| onImportFileChange(e.target.files?.[0] || null) | |
| e.target.value = '' | |
| }} | |
| /> | |
| </label> | |
| <select | |
| value={importMode} | |
| onChange={(e) => setImportMode(e.target.value)} | |
| className="bg-background border border-border rounded-lg px-3 py-2 text-sm" | |
| > | |
| <option value="merge">{t('settings.importModeMerge')}</option> | |
| <option value="replace">{t('settings.importModeReplace')}</option> | |
| </select> | |
| <button | |
| type="button" | |
| onClick={onImport} | |
| disabled={importing} | |
| className="px-3 py-2 rounded-lg bg-secondary border border-border hover:bg-secondary/80 text-sm flex items-center gap-2" | |
| > | |
| <Upload className="w-4 h-4" /> | |
| {importing ? t('settings.importing') : t('settings.importNow')} | |
| </button> | |
| </div> | |
| <textarea | |
| value={importText} | |
| onChange={(e) => setImportText(e.target.value)} | |
| rows={8} | |
| className="w-full bg-background border border-border rounded-lg px-3 py-2 font-mono text-xs" | |
| placeholder={t('settings.importPlaceholder')} | |
| /> | |
| {exportData && ( | |
| <div className="space-y-2"> | |
| <label className="text-sm text-muted-foreground">{t('settings.exportJson')}</label> | |
| <textarea | |
| value={exportData.json || ''} | |
| readOnly | |
| rows={6} | |
| className="w-full bg-background border border-border rounded-lg px-3 py-2 font-mono text-xs" | |
| /> | |
| </div> | |
| )} | |
| </div> | |
| ) | |
| } | |