import React, { useEffect, useState } from "react"; import { Save, Download, Loader2, Package } from "lucide-react"; import { useTranslation } from "react-i18next"; import { FullScreenPanel } from "@/components/common/FullScreenPanel"; import { Button } from "@/components/ui/button"; import JsonEditor from "@/components/JsonEditor"; interface GeminiCommonConfigModalProps { isOpen: boolean; onClose: () => void; value: string; onSave: (value: string) => boolean; error?: string; onExtract?: () => void; isExtracting?: boolean; } /** * GeminiCommonConfigModal - Common Gemini configuration editor modal * Allows editing of common env snippet shared across Gemini providers */ export const GeminiCommonConfigModal: React.FC< GeminiCommonConfigModalProps > = ({ isOpen, onClose, value, onSave, error, onExtract, isExtracting }) => { const { t } = useTranslation(); const [isDarkMode, setIsDarkMode] = useState(false); const [draftValue, setDraftValue] = useState(value); useEffect(() => { setIsDarkMode(document.documentElement.classList.contains("dark")); const observer = new MutationObserver(() => { setIsDarkMode(document.documentElement.classList.contains("dark")); }); observer.observe(document.documentElement, { attributes: true, attributeFilter: ["class"], }); return () => observer.disconnect(); }, []); useEffect(() => { if (isOpen) { setDraftValue(value); } }, [isOpen, value]); const handleClose = () => { setDraftValue(value); onClose(); }; const handleSave = () => { if (onSave(draftValue)) { onClose(); } }; return ( {onExtract && ( )} } >

{t("commonConfig.guideTitle")}

{t("commonConfig.guidePurpose")}

{t("commonConfig.guideUsage")}

{t("commonConfig.guideReExtract")}

{t("commonConfig.guideReassurance")}

{t("geminiConfig.commonConfigHint", { defaultValue: "该片段会写入 Gemini 的 .env(不允许包含 GOOGLE_GEMINI_BASE_URL、GEMINI_API_KEY)", })}

{(!draftValue || draftValue.trim() === "" || draftValue.trim() === "{}") && (

{t("commonConfig.emptyTitle")}

{t("commonConfig.emptyHint")}

)} {error && (

{error}

)}
); };