import type { MemShellFormSchema } from "@/types/schema"; import { ArrowUpRightIcon, InfoIcon, ServerIcon } from "lucide-react"; import { useCallback, useEffect, useMemo } 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, 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, ShellToolType } from "@/types/memshell"; import { Spinner } from "../ui/spinner"; import { JREVersionFormField } from "./jreversion-field"; import { ServerVersionFormField } from "./serverversion-field"; import { ProxyTabContent } from "./tabs/proxy-tab"; export default function MainConfigCard({ mainConfig, form, }: Readonly<{ mainConfig: MainConfig | undefined; form: UseFormReturn; }>) { const { t } = useTranslation(["common", "memshell"]); const server = useWatch({ control: form.control, name: "server", }); const shellTool = useWatch({ control: form.control, name: "shellTool", }); const serverToolMap = useMemo(() => { if (!mainConfig || !server) { return undefined; } return mainConfig[server]; }, [mainConfig, server]); const serverOptions = useMemo(() => Object.keys(mainConfig ?? {}), [mainConfig]); const shellTools = useMemo(() => { if (!serverToolMap) { return []; } const tools = Object.keys(serverToolMap).map((tool) => tool as ShellToolType); return Array.from(new Set([...tools, ShellToolType.Custom])); }, [serverToolMap]); const customShellTypes = useMemo(() => { if (!serverToolMap) { return []; } return Array.from(new Set(Object.values(serverToolMap).flat())); }, [serverToolMap]); const shellTypes = useMemo(() => { if (!serverToolMap || !server) { return []; } if (shellTool === ShellToolType.Custom) { return customShellTypes; } return serverToolMap[shellTool] ?? []; }, [customShellTypes, server, serverToolMap, shellTool]); useEffect(() => { if (!mainConfig || !server) { return; } const toolMap = mainConfig[server]; if (!toolMap) { return; } const toolKeys = Object.keys(toolMap); if (toolKeys.length === 0) { return; } const currentShellTool = form.getValues("shellTool") as ShellToolType; const nextShellTool = toolMap[currentShellTool] ? currentShellTool : (toolKeys[0] as ShellToolType); if (nextShellTool !== currentShellTool) { form.setValue("shellTool", nextShellTool); } if (nextShellTool !== ShellToolType.Custom) { const nextShellTypes = toolMap[nextShellTool] ?? []; if (nextShellTypes.length > 0) { const currentShellType = form.getValues("shellType"); if (currentShellType !== nextShellTypes[0]) { form.setValue("shellType", nextShellTypes[0]); } } } const currentTargetJdk = form.getValues("targetJdkVersion") as string; const currentJdkVersion = Number.parseInt(currentTargetJdk, 10); const shouldRaiseJdkVersion = (server === "SpringWebFlux" || server === "XXLJOB" || server === "Dubbo") && currentJdkVersion <= 52; const nextJdkVersion = shouldRaiseJdkVersion ? "52" : "50"; if (currentTargetJdk !== nextJdkVersion) { form.setValue("targetJdkVersion", nextJdkVersion); } form.resetField("serverVersion"); form.resetField("byPassJavaModule"); form.resetField("urlPattern"); }, [form, mainConfig, server]); useEffect(() => { if (shellTool !== ShellToolType.Custom || customShellTypes.length === 0) { return; } const currentShellType = form.getValues("shellType"); if (currentShellType !== customShellTypes[0]) { form.setValue("shellType", customShellTypes[0]); } }, [customShellTypes, form, shellTool]); 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 (serverToolMap) { let currentShellTypes = null; if (value === ShellToolType.Custom) { currentShellTypes = customShellTypes; } else { currentShellTypes = serverToolMap[value]; } // Set shellType directly instead of relying on 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); }, [customShellTypes, form, serverToolMap], ); return ( <> {t("common:mainConfig.title")} {!mainConfig ? (
{t("loading")}
) : (
( {t("common:server")} {t("memshell:tips.targetServerNotFound")}  {t("memshell:tips.targetServerRequest")} )} />
( {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 && ( )} ); }