"use client"; import { invoke } from "@tauri-apps/api/core"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; 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 { t } = useTranslation(); 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(t("proxies.exportDialog.failed")); setExportContent(""); } finally { setIsLoading(false); } }, [format, t]); useEffect(() => { if (isOpen) { void loadExportContent(); } }, [isOpen, loadExportContent]); const handleCopyToClipboard = useCallback(async () => { try { await navigator.clipboard.writeText(exportContent); setCopied(true); toast.success(t("toasts.success.copied")); setTimeout(() => { setCopied(false); }, 2000); } catch (error) { console.error("Failed to copy to clipboard:", error); toast.error(t("toasts.error.copyFailed")); } }, [exportContent, t]); 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(t("proxies.exportDialog.downloaded", { filename })); }, [format, exportContent, t]); const handleClose = useCallback(() => { setFormat("json"); setExportContent(""); setCopied(false); onClose(); }, [onClose]); return ( {t("proxies.exportDialog.title")} {t("proxies.exportDialog.description")}
{ setFormat(value as "json" | "txt"); }} className="flex gap-4" >
{isLoading ? (
{t("common.buttons.loading")}
) : exportContent ? (
                  {exportContent}
                
) : (
{t("proxies.exportDialog.noProxies")}
)}
{t("common.buttons.close")} void handleCopyToClipboard()} disabled={!exportContent || isLoading} className="flex gap-2 items-center" > {copied ? ( ) : ( )} {copied ? t("proxies.exportDialog.copied") : t("common.buttons.copy")} {t("common.buttons.download")}
); }