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" 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) onOpenChange(false) onSuccess() } catch (error) { console.error("Failed to save settings:", error) } } 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")} />
) }