"use client"; import { invoke } from "@tauri-apps/api/core"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { FiCheck } from "react-icons/fi"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { formatRelativeTime } from "@/lib/flag-utils"; import type { ProxyCheckResult } from "@/types"; interface VpnCheckButtonProps { vpnId: string; vpnName: string; checkingVpnId: string | null; setCheckingVpnId: (id: string | null) => void; disabled?: boolean; } export function VpnCheckButton({ vpnId, vpnName, checkingVpnId, setCheckingVpnId, disabled = false, }: VpnCheckButtonProps) { const { t } = useTranslation(); const [result, setResult] = React.useState(); const handleCheck = React.useCallback(async () => { if (checkingVpnId === vpnId) return; setCheckingVpnId(vpnId); try { const checkResult = await invoke("check_vpn_validity", { vpnId, }); setResult(checkResult); if (checkResult.is_valid) { toast.success(t("vpnCheck.valid", { name: vpnName })); } else { toast.error(t("vpnCheck.invalid", { name: vpnName })); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); toast.error(t("vpnCheck.failed", { error: errorMessage })); setResult({ ip: "", timestamp: Math.floor(Date.now() / 1000), is_valid: false, }); } finally { setCheckingVpnId(null); } }, [vpnId, vpnName, checkingVpnId, setCheckingVpnId, t]); const isCurrentlyChecking = checkingVpnId === vpnId; return ( {isCurrentlyChecking ? (

{t("vpnCheck.tooltipChecking")}

) : result?.is_valid ? (

{t("vpnCheck.tooltipValid")}

{t("vpnCheck.tooltipChecked", { time: formatRelativeTime(result.timestamp), })}

) : result && !result.is_valid ? (

{t("vpnCheck.tooltipInvalid")}

{t("vpnCheck.tooltipChecked", { time: formatRelativeTime(result.timestamp), })}

) : (

{t("vpnCheck.tooltipDefault")}

)}
); }