"use client"; import { invoke } from "@tauri-apps/api/core"; import { useCallback, useEffect, useState } from "react"; import { toast } from "sonner"; import { LoadingButton } from "@/components/loading-button"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import type { StoredProxy } from "@/types"; interface ProxyFormData { name: string; proxy_type: string; host: string; port: number; username: string; password: string; } interface ProxyFormDialogProps { isOpen: boolean; onClose: () => void; onSave: (proxy: StoredProxy) => void; editingProxy?: StoredProxy | null; } export function ProxyFormDialog({ isOpen, onClose, onSave, editingProxy, }: ProxyFormDialogProps) { const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ name: "", proxy_type: "http", host: "", port: 8080, username: "", password: "", }); const resetForm = useCallback(() => { setFormData({ name: "", proxy_type: "http", host: "", port: 8080, username: "", password: "", }); }, []); // Load editing proxy data when dialog opens useEffect(() => { if (isOpen) { if (editingProxy) { setFormData({ name: editingProxy.name, proxy_type: editingProxy.proxy_settings.proxy_type, host: editingProxy.proxy_settings.host, port: editingProxy.proxy_settings.port, username: editingProxy.proxy_settings.username || "", password: editingProxy.proxy_settings.password || "", }); } else { resetForm(); } } }, [isOpen, editingProxy, resetForm]); const handleSubmit = useCallback(async () => { if (!formData.name.trim()) { toast.error("Proxy name is required"); return; } if (!formData.host.trim() || !formData.port) { toast.error("Host and port are required"); return; } setIsSubmitting(true); try { const proxySettings = { proxy_type: formData.proxy_type, host: formData.host.trim(), port: formData.port, username: formData.username.trim() || undefined, password: formData.password.trim() || undefined, }; let savedProxy: StoredProxy; if (editingProxy) { // Update existing proxy savedProxy = await invoke("update_stored_proxy", { proxyId: editingProxy.id, name: formData.name.trim(), proxySettings, }); toast.success("Proxy updated successfully"); } else { // Create new proxy savedProxy = await invoke("create_stored_proxy", { name: formData.name.trim(), proxySettings, }); toast.success("Proxy created successfully"); } onSave(savedProxy); onClose(); } catch (error) { console.error("Failed to save proxy:", error); const errorMessage = error instanceof Error ? error.message : String(error); toast.error(`Failed to save proxy: ${errorMessage}`); } finally { setIsSubmitting(false); } }, [formData, editingProxy, onSave, onClose]); const handleClose = useCallback(() => { if (!isSubmitting) { onClose(); } }, [isSubmitting, onClose]); const isFormValid = formData.name.trim() && formData.host.trim() && formData.port > 0 && formData.port <= 65535; return ( {editingProxy ? "Edit Proxy" : "Create New Proxy"}
setFormData({ ...formData, name: e.target.value }) } placeholder="e.g. Office Proxy, Home VPN, etc." disabled={isSubmitting} />
setFormData({ ...formData, host: e.target.value }) } placeholder="e.g. 127.0.0.1" disabled={isSubmitting} />
setFormData({ ...formData, port: parseInt(e.target.value, 10) || 0, }) } placeholder="e.g. 8080" min="1" max="65535" disabled={isSubmitting} />
setFormData({ ...formData, username: e.target.value, }) } placeholder="Proxy username" disabled={isSubmitting} />
setFormData({ ...formData, password: e.target.value, }) } placeholder="Proxy password" disabled={isSubmitting} />
{editingProxy ? "Update Proxy" : "Create Proxy"}
); }