import { ArrowUpRightIcon, AxeIcon, CommandIcon, InfoIcon, NetworkIcon, ServerIcon, ShieldOffIcon, SwordIcon, WaypointsIcon, ZapIcon, } from "lucide-react"; import { type JSX, useCallback, useRef, useState } from "react"; import { Controller, type UseFormReturn, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { AntSwordTabContent } from "@/components/memshell/tabs/antsword-tab"; import { BehinderTabContent } from "@/components/memshell/tabs/behinder-tab"; import { CommandTabContent } from "@/components/memshell/tabs/command-tab"; import CustomTabContent from "@/components/memshell/tabs/custom-tab"; import { GodzillaTabContent } from "@/components/memshell/tabs/godzilla-tab"; import { NeoRegTabContent } from "@/components/memshell/tabs/neoreg-tab"; import { Suo5TabContent } from "@/components/memshell/tabs/suo5-tab"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Field, FieldContent, FieldDescription, FieldError, FieldLabel, } from "@/components/ui/field"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Tabs } from "@/components/ui/tabs"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { type MainConfig, type ServerConfig, ShellToolType, } from "@/types/memshell"; import type { MemShellFormSchema } from "@/types/schema"; import { Spinner } from "../ui/spinner"; const shellToolIcons: Record = { [ShellToolType.Behinder]: , [ShellToolType.Godzilla]: , [ShellToolType.Command]: , [ShellToolType.AntSword]: , [ShellToolType.Suo5]: , [ShellToolType.Suo5v2]: , [ShellToolType.NeoreGeorg]: , [ShellToolType.Custom]: , }; const defaultServerVersionOptions = [ { name: "Unknown", value: "Unknown", }, ]; export default function MainConfigCard({ mainConfig, form, servers, }: Readonly<{ mainConfig: MainConfig | undefined; form: UseFormReturn; servers?: ServerConfig; }>) { const { t } = useTranslation(["common", "memshell"]); const [shellToolMap, setShellToolMap] = useState<{ [toolName: string]: string[]; }>(); const [shellTools, setShellTools] = useState([]); const [shellTypes, setShellTypes] = useState([]); const [serverVersionOptions, setServerVersionOptions] = useState( defaultServerVersionOptions, ); const shellTool = useWatch({ control: form.control, name: "shellTool", }); const handleServerChange = useCallback( (value: string) => { if (mainConfig) { const newShellToolMap = mainConfig[value]; setShellToolMap(newShellToolMap); const newShellTools = Object.keys(newShellToolMap); setShellTools([ ...newShellTools.map((tool) => tool as ShellToolType), ShellToolType.Custom, ]); const currentShellTool = form.getValues("shellTool"); const firstTool = newShellTools[0]; let currentShellTypes = null; if (!newShellToolMap[currentShellTool]) { form.setValue("shellTool", firstTool); currentShellTypes = newShellToolMap[firstTool]; } else { currentShellTypes = newShellToolMap[currentShellTool]; } setShellTypes(currentShellTypes); if (currentShellTypes && currentShellTypes.length > 0) { form.setValue("shellType", currentShellTypes[0]); } if ( (value === "SpringWebFlux" || value === "XXLJOB") && Number.parseInt(form.getValues("targetJdkVersion") as string, 10) < 52 ) { form.setValue("targetJdkVersion", "52"); } else { form.setValue("targetJdkVersion", "50"); } if (value === "TongWeb") { setServerVersionOptions([ ...defaultServerVersionOptions, { name: "6", value: "6" }, { name: "7", value: "7" }, { name: "8", value: "8" }, ]); } else if (value === "Jetty") { setServerVersionOptions([ ...defaultServerVersionOptions, { name: "6", value: "6" }, { name: "7+", value: "7+" }, { name: "12", value: "12" }, ]); } else { setServerVersionOptions(defaultServerVersionOptions); } form.resetField("serverVersion"); form.resetField("byPassJavaModule"); form.resetField("urlPattern"); } }, [form, mainConfig], ); const handleShellToolChange = useCallback( (value: string) => { const resetCommand = () => { form.resetField("commandParamName"); form.resetField("implementationClass"); form.resetField("encryptor"); }; const resetGodzilla = () => { form.resetField("godzillaKey"); form.resetField("godzillaPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetBehinder = () => { form.resetField("behinderPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetSuo5 = () => { form.resetField("headerName"); form.resetField("headerValue"); }; const resetAntSword = () => { form.resetField("antSwordPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetNeoreGeorg = () => { form.setValue("headerName", "Referer"); form.resetField("headerValue"); }; const resetCustom = () => { form.resetField("shellClassBase64"); }; if (shellToolMap) { let currentShellTypes = null; if (value === ShellToolType.Custom) { currentShellTypes = servers?.[form.getValues("server")] as string[]; } else { currentShellTypes = shellToolMap[value]; } setShellTypes(currentShellTypes); // 直接设置 shellType 而不是依赖 useEffect if (currentShellTypes && currentShellTypes.length > 0) { form.setValue("shellType", currentShellTypes[0]); } form.resetField("urlPattern"); form.resetField("shellClassName"); form.resetField("injectorClassName"); if (value === ShellToolType.Godzilla) { resetGodzilla(); } else if (value === ShellToolType.Behinder) { resetBehinder(); } else if (value === ShellToolType.Command) { resetCommand(); } else if (value === ShellToolType.Suo5) { resetSuo5(); } else if (value === ShellToolType.AntSword) { resetAntSword(); } else if (value === ShellToolType.NeoreGeorg) { resetNeoreGeorg(); } else if (value === ShellToolType.Custom) { resetCustom(); } } form.setValue("shellTool", value); }, [form, servers, shellToolMap], ); const initializedRef = useRef(false); if (!initializedRef.current && mainConfig) { const initialServer = form.getValues("server"); if (initialServer && mainConfig[initialServer]) { handleServerChange(initialServer); initializedRef.current = true; } } return ( <> {t("common:mainConfig.title")} {!mainConfig ? (
{t("loading")}
) : (
( {t("common:server")} {t("memshell:tips.targetServerNotFound")}  {t("memshell:tips.targetServerRequest")} )} /> ( {t("common:serverVersion")} {fieldState.error && ( )} )} />
( {t("common:shellTool")} )} />
(

{t("common:debug.description")}

)} /> (

{t("common:probe.description")}

)} /> (

{t("common:byPassJavaModule.description")}

)} /> (

{t("common:lambdaSuffix.description")}

)} /> (

{t("common:shrink.description")}

)} /> (

{t("common:staticInitialize.description")}

)} />
)}
{mainConfig && ( )} ); }