import { useState } from "react"; import { useTranslation } from "react-i18next"; import { AlertTriangle, ChevronDown, ChevronUp, X, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import type { EnvConflict } from "@/types/env"; import { deleteEnvVars } from "@/lib/api/env"; import { toast } from "sonner"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; interface EnvWarningBannerProps { conflicts: EnvConflict[]; onDismiss: () => void; onDeleted: () => void; } export function EnvWarningBanner({ conflicts, onDismiss, onDeleted, }: EnvWarningBannerProps) { const { t } = useTranslation(); const [isExpanded, setIsExpanded] = useState(false); const [selectedConflicts, setSelectedConflicts] = useState>( new Set(), ); const [isDeleting, setIsDeleting] = useState(false); const [showConfirmDialog, setShowConfirmDialog] = useState(false); if (conflicts.length === 0) { return null; } const toggleSelection = (key: string) => { const newSelection = new Set(selectedConflicts); if (newSelection.has(key)) { newSelection.delete(key); } else { newSelection.add(key); } setSelectedConflicts(newSelection); }; const toggleSelectAll = () => { if (selectedConflicts.size === conflicts.length) { setSelectedConflicts(new Set()); } else { setSelectedConflicts( new Set(conflicts.map((c) => `${c.varName}:${c.sourcePath}`)), ); } }; const handleDelete = async () => { setShowConfirmDialog(false); setIsDeleting(true); try { const conflictsToDelete = conflicts.filter((c) => selectedConflicts.has(`${c.varName}:${c.sourcePath}`), ); if (conflictsToDelete.length === 0) { toast.warning(t("env.error.noSelection")); return; } const backupInfo = await deleteEnvVars(conflictsToDelete); toast.success(t("env.delete.success"), { description: t("env.backup.location", { path: backupInfo.backupPath, }), duration: 5000, }); // 清空选择并通知父组件 setSelectedConflicts(new Set()); onDeleted(); } catch (error) { console.error("删除环境变量失败:", error); toast.error(t("env.delete.error"), { description: String(error), }); } finally { setIsDeleting(false); } }; const getSourceDescription = (conflict: EnvConflict): string => { if (conflict.sourceType === "system") { if (conflict.sourcePath.includes("HKEY_CURRENT_USER")) { return t("env.source.userRegistry"); } else if (conflict.sourcePath.includes("HKEY_LOCAL_MACHINE")) { return t("env.source.systemRegistry"); } else { return t("env.source.systemEnv"); } } else { return conflict.sourcePath; } }; return ( <>

{t("env.warning.title")}

{t("env.warning.description", { count: conflicts.length })}

{isExpanded && (
{conflicts.map((conflict) => { const key = `${conflict.varName}:${conflict.sourcePath}`; return (
toggleSelection(key)} />

{t("env.field.value")}: {conflict.varValue}

{t("env.field.source")}:{" "} {getSourceDescription(conflict)}

); })}
)}
{t("env.confirm.title")}

{t("env.confirm.message", { count: selectedConflicts.size })}

{t("env.confirm.backupNotice")}

); }