import { useState, useRef, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Separator } from "@/components/ui/separator"; import { toast } from "@/components/ui/sonner"; import { storage, STORAGE_KEYS } from "@/lib/storage"; import { X, Settings, Moon, Sun, Globe, Shield, Database, Cloud } from "lucide-react"; interface SettingsModalProps { open: boolean; onOpenChange: (open: boolean) => void; } const THEME_OPTIONS = [ { value: "light", label: "Light", icon: Sun }, { value: "dark", label: "Dark", icon: Moon }, { value: "system", label: "System", icon: Globe }, ]; export const SettingsModal = ({ open, onOpenChange }: SettingsModalProps) => { // Load settings from storage on mount const [theme, setTheme] = useState(() => { return storage.get(STORAGE_KEYS.THEME) || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); }); const [apiEndpoint, setApiEndpoint] = useState(() => storage.get(STORAGE_KEYS.API_ENDPOINT) || "https://insight-ai-api.hf.space" ); const fileInputRef = useRef(null); // Sync settings from storage when modal opens useEffect(() => { if (open) { setTheme(storage.get(STORAGE_KEYS.THEME)); setApiEndpoint(storage.get(STORAGE_KEYS.API_ENDPOINT)); } }, [open]); const handleThemeChange = (newTheme: string) => { setTheme(newTheme); const root = window.document.documentElement; if (newTheme === "dark") { root.classList.add("dark"); } else if (newTheme === "light") { root.classList.remove("dark"); } else { // System theme if (window.matchMedia("(prefers-color-scheme: dark)").matches) { root.classList.add("dark"); } else { root.classList.remove("dark"); } } storage.set(STORAGE_KEYS.THEME, newTheme); toast.success("Theme updated successfully"); }; const handleSaveEndpoint = () => { storage.set(STORAGE_KEYS.API_ENDPOINT, apiEndpoint); toast.success("API endpoint saved successfully"); }; const handleClearChats = () => { storage.set(STORAGE_KEYS.CHATS, []); toast.success("Chat history cleared successfully"); window.location.reload(); }; const handleClearSources = () => { storage.set(STORAGE_KEYS.SOURCES, []); toast.success("Sources cleared successfully"); }; const handleResetSettings = () => { // Reset all keys to their default values using storage lib storage.resetToDefaults(); window.location.reload(); toast.success("Settings reset to defaults"); }; const handleExportStorage = () => { const data = storage.export(); const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "insight-storage-export.json"; a.click(); URL.revokeObjectURL(url); toast.success("Storage exported successfully"); }; const handleImportStorage = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (e) => { try { const result = e.target?.result as string; const data = JSON.parse(result); if (storage.import(data)) { toast.success("Storage imported successfully. Please refresh the page."); } else { toast.error("Failed to import storage."); } } catch { toast.error("Invalid file format."); } }; reader.readAsText(file); event.target.value = ""; }; return ( Settings

Appearance

{THEME_OPTIONS.map(({ value, label, icon: Icon }) => (
))}

API Configuration

setApiEndpoint(e.target.value)} placeholder="Ex: http://localhost:8000" />

Data Management

Backup & Restore

Export will download your data as a JSON file. Import will overwrite your current data.
); };