import { useState } from 'react'; import { useAppContext } from '../AppContext'; import { db } from '../database'; import { Download, Upload, Globe, Moon, Sun, Monitor } from 'lucide-react'; export function SettingsScreen() { const { language, setLanguage, themeMode, setThemeMode } = useAppContext(); const [backupStatus, setBackupStatus] = useState(''); const handleExport = async () => { try { const spottings = await db.spottings.toArray(); const places = await db.customPlaces.toArray(); const backup = { version: 1, timestamp: new Date().toISOString(), spottings, places }; const blob = new Blob([JSON.stringify(backup, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `birdspotter_backup_${new Date().toISOString().split('T')[0]}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); setBackupStatus('Export successful!'); setTimeout(() => setBackupStatus(''), 3000); } catch (error) { console.error(error); setBackupStatus('Export failed.'); } }; const handleImport = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; try { const text = await file.text(); const backup = JSON.parse(text); if (backup.spottings) { await db.spottings.clear(); await db.spottings.bulkAdd(backup.spottings); } if (backup.places) { await db.customPlaces.clear(); await db.customPlaces.bulkAdd(backup.places); } setBackupStatus('Import successful!'); setTimeout(() => setBackupStatus(''), 3000); } catch (error) { console.error(error); setBackupStatus('Import failed. Invalid file format.'); } }; return (

Settings

{/* Appearance */}

Appearance

Language
{themeMode === 'dark' ? : themeMode === 'light' ? : } Theme
{/* Backup & Restore */}

Backup & Restore

Export your spottings and custom places to a JSON file, or restore from a previous backup.

{backupStatus && (

{backupStatus}

)}
{/* About */}

BirdSpotter Web

A Progressive Web App version of the offline-first Flutter design. Uses IndexedDB for local storage and browser Geolocation.

); }