"use client"; import { invoke } from "@tauri-apps/api/core"; import { listen } from "@tauri-apps/api/event"; import { useCallback, useEffect, useState } from "react"; import { FiEdit2, FiPlus, FiTrash2, FiWifi } from "react-icons/fi"; import { toast } from "sonner"; import { ProxyFormDialog } from "@/components/proxy-form-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { trimName } from "@/lib/name-utils"; import type { StoredProxy } from "@/types"; import { RippleButton } from "./ui/ripple"; interface ProxyManagementDialogProps { isOpen: boolean; onClose: () => void; } export function ProxyManagementDialog({ isOpen, onClose, }: ProxyManagementDialogProps) { const [storedProxies, setStoredProxies] = useState([]); const [loading, setLoading] = useState(false); const [showProxyForm, setShowProxyForm] = useState(false); const [editingProxy, setEditingProxy] = useState(null); const [proxyUsage, setProxyUsage] = useState>({}); const loadStoredProxies = useCallback(async () => { try { setLoading(true); const proxies = await invoke("get_stored_proxies"); setStoredProxies(proxies); } catch (error) { console.error("Failed to load stored proxies:", error); toast.error("Failed to load proxies"); } finally { setLoading(false); } }, []); const loadProxyUsage = useCallback(async () => { try { const profiles = await invoke>( "list_browser_profiles", ); const counts: Record = {}; for (const p of profiles) { if (p.proxy_id) counts[p.proxy_id] = (counts[p.proxy_id] ?? 0) + 1; } setProxyUsage(counts); } catch (_err) { // ignore non-critical errors } }, []); useEffect(() => { if (isOpen) { loadStoredProxies(); void loadProxyUsage(); } }, [isOpen, loadStoredProxies, loadProxyUsage]); useEffect(() => { let unlisten: (() => void) | undefined; const setup = async () => { try { unlisten = await listen("profile-updated", () => { void loadProxyUsage(); }); } catch (_err) { // ignore non-critical errors } }; if (isOpen) void setup(); return () => { if (unlisten) unlisten(); }; }, [isOpen, loadProxyUsage]); const handleDeleteProxy = useCallback(async (proxy: StoredProxy) => { if ( !confirm(`Are you sure you want to delete the proxy "${proxy.name}"?`) ) { return; } try { await invoke("delete_stored_proxy", { proxyId: proxy.id }); setStoredProxies((prev) => prev.filter((p) => p.id !== proxy.id)); toast.success("Proxy deleted successfully"); } catch (error) { console.error("Failed to delete proxy:", error); toast.error("Failed to delete proxy"); } }, []); const handleCreateProxy = useCallback(() => { setEditingProxy(null); setShowProxyForm(true); }, []); const handleEditProxy = useCallback((proxy: StoredProxy) => { setEditingProxy(proxy); setShowProxyForm(true); }, []); const handleProxySaved = useCallback((savedProxy: StoredProxy) => { setStoredProxies((prev) => { const existingIndex = prev.findIndex((p) => p.id === savedProxy.id); if (existingIndex >= 0) { // Update existing proxy const updated = [...prev]; updated[existingIndex] = savedProxy; return updated; } else { // Add new proxy return [...prev, savedProxy]; } }); setShowProxyForm(false); setEditingProxy(null); }, []); const handleProxyFormClose = useCallback(() => { setShowProxyForm(false); setEditingProxy(null); }, []); return ( <>
Proxy Management
{/* Header with Create Button */}

Stored Proxies

Manage your saved proxy configurations for reuse across profiles

Create Proxy
{/* Proxy List - Scrollable */}
{loading ? (

Loading proxies...

) : storedProxies.length === 0 ? (

No proxies configured

Create your first proxy configuration to get started

Create First Proxy
) : (
{storedProxies.map((proxy) => (
{proxy.name.length > 30 ? ( {trimName(proxy.name)} {proxy.name} ) : ( {proxy.name} )}
{proxyUsage[proxy.id] ?? 0}

Edit proxy

Delete proxy

))}
)}
Close
); }