"use client"; import { invoke } from "@tauri-apps/api/core"; import { useCallback, useEffect, useState } from "react"; import { LuCheck, LuCopy, LuDownload } from "react-icons/lu"; import { toast } from "sonner"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { ScrollArea } from "@/components/ui/scroll-area"; import { RippleButton } from "./ui/ripple"; interface ProxyExportDialogProps { isOpen: boolean; onClose: () => void; } export function ProxyExportDialog({ isOpen, onClose }: ProxyExportDialogProps) { const [format, setFormat] = useState<"json" | "txt">("json"); const [exportContent, setExportContent] = useState(""); const [isLoading, setIsLoading] = useState(false); const [copied, setCopied] = useState(false); const loadExportContent = useCallback(async () => { setIsLoading(true); try { const content = await invoke("export_proxies", { format }); setExportContent(content); } catch (error) { console.error("Failed to export proxies:", error); toast.error("Failed to export proxies"); setExportContent(""); } finally { setIsLoading(false); } }, [format]); useEffect(() => { if (isOpen) { void loadExportContent(); } }, [isOpen, loadExportContent]); const handleCopyToClipboard = useCallback(async () => { try { await navigator.clipboard.writeText(exportContent); setCopied(true); toast.success("Copied to clipboard"); setTimeout(() => { setCopied(false); }, 2000); } catch (error) { console.error("Failed to copy to clipboard:", error); toast.error("Failed to copy to clipboard"); } }, [exportContent]); const handleDownload = useCallback(() => { const filename = format === "json" ? "proxies.json" : "proxies.txt"; const mimeType = format === "json" ? "application/json" : "text/plain"; const blob = new Blob([exportContent], { type: mimeType }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); toast.success(`Downloaded ${filename}`); }, [format, exportContent]); const handleClose = useCallback(() => { setFormat("json"); setExportContent(""); setCopied(false); onClose(); }, [onClose]); return ( Export Proxies Export your proxy configurations to a file
{ setFormat(value as "json" | "txt"); }} className="flex gap-4" >
{isLoading ? (
Loading...
) : exportContent ? (
                  {exportContent}
                
) : (
No proxies to export
)}
Close void handleCopyToClipboard()} disabled={!exportContent || isLoading} className="flex gap-2 items-center" > {copied ? ( ) : ( )} {copied ? "Copied" : "Copy"} Download
); }