import { FormControl, FormDescription, FormField, FormFieldItem, FormFieldLabel, FormItem, FormLabel, } from "@/components/ui/form.tsx"; import { Label } from "@/components/ui/label.tsx"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select.tsx"; import { Switch } from "@/components/ui/switch.tsx"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { FormSchema } from "@/types/schema.ts"; import { JDKVersion, MainConfig, ServerConfig, ShellToolType } from "@/types/shell.ts"; import { JreTip } from "@/components/tips/jre-tip.tsx"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card.tsx"; import { ArrowUpRightIcon, AxeIcon, CommandIcon, NetworkIcon, ServerIcon, ShieldOffIcon, SwordIcon, WaypointsIcon, ZapIcon, } from "lucide-react"; import { JSX, useEffect, useState } from "react"; import { FormProvider, UseFormReturn } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { AntSwordTabContent } from "./tools/antsword-tab"; import { BehinderTabContent } from "./tools/behinder-tab"; import { CommandTabContent } from "./tools/command-tab"; import CustomTabContent from "./tools/custom-tab"; import { GodzillaTabContent } from "./tools/godzilla-tab"; import { NeoRegTabContent } from "./tools/neoreg-tab"; import { Suo5TabContent } from "./tools/suo5-tab"; const shellToolIcons: Record = { [ShellToolType.Behinder]: , [ShellToolType.Godzilla]: , [ShellToolType.Command]: , [ShellToolType.AntSword]: , [ShellToolType.Suo5]: , [ShellToolType.NeoreGeorg]: , [ShellToolType.Custom]: , }; export function MainConfigCard({ mainConfig, form, servers, }: Readonly<{ mainConfig: MainConfig | undefined; form: UseFormReturn; servers?: ServerConfig; }>) { const [shellToolMap, setShellToolMap] = useState<{ [toolName: string]: string[]; }>(); const [shellTools, setShellTools] = useState([ ShellToolType.Godzilla, ShellToolType.Behinder, ShellToolType.AntSword, ShellToolType.Command, ShellToolType.Suo5, ShellToolType.NeoreGeorg, ShellToolType.Custom, ]); const [shellTypes, setShellTypes] = useState([]); const shellTool = form.watch("shellTool"); const { t } = useTranslation(); // 处理一下默认值 server 不刷新 shellType 的问题 useEffect(() => { if (mainConfig) { const initialServer = form.getValues("server"); if (initialServer && mainConfig[initialServer]) { handleServerChange(initialServer); } } }, [mainConfig, form]); // 处理一下 shellTypes 由于 server 或 shellTool 变更时无法正常为 form.shellType 赋值的问题 useEffect(() => { if (shellTypes.length > 0) { form.setValue("shellType", shellTypes[0]); } }, [shellTypes, form]); const handleServerChange = (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); // 特殊环境的 JDK 版本 if ( (value === "SpringWebFlux" || value === "XXLJOB") && Number.parseInt(form.getValues("targetJdkVersion") as string) < 52 ) { form.setValue("targetJdkVersion", "52"); } else { form.resetField("targetJdkVersion"); } form.resetField("bypassJavaModule"); form.resetField("urlPattern"); } }; const handleShellToolChange = (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); 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); }; return ( {t("configs.main-config")}
( {t("mainConfig.server")} {t("tips.targetServerNotFound")}  {t("tips.targetServerRequest")} )} /> ( {t("mainConfig.jre")} {t("optional")} )} />
( {t("mainConfig.debug")} )} /> ( )} /> ( )} />
{ handleShellToolChange(v); }} className="w-full" >
{shellTools.map((shellTool) => ( {shellToolIcons[shellTool]} {shellTool} ))}
); }