import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Checkbox } from "@/components/ui/checkbox" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Loader2, CheckCircle, XCircle } from "lucide-react" import { Settings as AppSettings, SettingsCreate, updateSettings, testImapConnection, } from "@/lib/api" import { toast } from "sonner" interface SettingsDialogProps { settings: AppSettings folderOptions: string[] isOpen: boolean onOpenChange: (isOpen: boolean) => void onSuccess: () => void } export function SettingsDialog({ settings, folderOptions, isOpen, onOpenChange, onSuccess, }: SettingsDialogProps) { const [currentSettings, setCurrentSettings] = useState( null ) const [testConnectionStatus, setTestConnectionStatus] = useState< "idle" | "loading" | "success" | "error" >("idle") const [testConnectionMessage, setTestConnectionMessage] = useState("") useEffect(() => { if (settings) { setCurrentSettings({ ...settings, imap_password: "" }) } }, [settings]) if (!currentSettings) return null const handleSettingsChange = ( key: K, value: SettingsCreate[K] ) => { setCurrentSettings((prev) => (prev ? { ...prev, [key]: value } : null)) } const handleSave = async () => { if (!currentSettings) return try { await updateSettings(currentSettings) toast.success("Settings saved successfully!") onOpenChange(false) onSuccess() } catch (error) { console.error("Failed to save settings:", error) toast.error("Failed to save settings.") } } const handleTestConnection = async () => { if (!currentSettings) return setTestConnectionStatus("loading") try { await updateSettings(currentSettings) const result = await testImapConnection() setTestConnectionStatus("success") setTestConnectionMessage(result.message) } catch (error: unknown) { setTestConnectionStatus("error") if (error instanceof Error) { setTestConnectionMessage(error.message || "Connection failed") } else { setTestConnectionMessage("An unknown error occurred") } } } return ( Settings Fields are locked if they are set by environment variables.
{/* IMAP Configuration */}

IMAP Configuration

handleSettingsChange("imap_server", e.target.value) } placeholder="imap.gmail.com" disabled={settings.locked_fields.includes("imap_server")} />
handleSettingsChange("imap_username", e.target.value) } placeholder="your-email@gmail.com" disabled={settings.locked_fields.includes("imap_username")} />
handleSettingsChange("imap_password", e.target.value) } placeholder="Your password or app password" disabled={settings.locked_fields.includes("imap_password")} />
{testConnectionStatus !== "idle" && (
{testConnectionStatus === "success" && ( )} {testConnectionStatus === "error" && ( )} {testConnectionMessage}
)}
{/* Email Processing */}

Email Processing

handleSettingsChange( "email_check_interval", Number.parseInt(e.target.value) || 15 ) } placeholder="15" disabled={settings.locked_fields.includes("email_check_interval")} />
handleSettingsChange("mark_as_read", !!checked) } disabled={settings.locked_fields.includes("mark_as_read")} />
handleSettingsChange("auto_add_new_senders", !!checked) } disabled={settings.locked_fields.includes("auto_add_new_senders")} />
) }