import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { OperatingSystems } from "@/config/siteConfig"; import { PlusCircle, Trash2 } from "lucide-react"; import { memo, useCallback, useRef } from "react"; import { z } from "zod"; import { InstallMethodSchema, ScriptSchema, type Script } from "../_schemas/schemas"; type InstallMethodProps = { script: Script; setScript: (value: Script | ((prevState: Script) => Script)) => void; setIsValid: (isValid: boolean) => void; setZodErrors: (zodErrors: z.ZodError | null) => void; }; function InstallMethod({ script, setScript, setIsValid, setZodErrors, }: InstallMethodProps) { const cpuRefs = useRef<(HTMLInputElement | null)[]>([]); const ramRefs = useRef<(HTMLInputElement | null)[]>([]); const hddRefs = useRef<(HTMLInputElement | null)[]>([]); const addInstallMethod = useCallback(() => { setScript((prev) => { const method = InstallMethodSchema.parse({ type: "default", script: `/${prev.type}/${prev.slug}.sh`, resources: { cpu: null, ram: null, hdd: null, os: null, version: null, }, }); return { ...prev, install_methods: [...prev.install_methods, method], }; }); }, [setScript]); const updateInstallMethod = useCallback( ( index: number, key: keyof Script["install_methods"][number], value: Script["install_methods"][number][keyof Script["install_methods"][number]], ) => { setScript((prev) => { const updatedMethods = prev.install_methods.map((method, i) => { if (i === index) { const updatedMethod = { ...method, [key]: value }; if (key === "type") { updatedMethod.script = value === "alpine" ? `/${prev.type}/alpine-${prev.slug}.sh` : `/${prev.type}/${prev.slug}.sh`; // Set OS to Alpine and reset version if type is alpine if (value === "alpine") { updatedMethod.resources.os = "Alpine"; updatedMethod.resources.version = null; } } return updatedMethod; } return method; }); const updated = { ...prev, install_methods: updatedMethods, }; const result = ScriptSchema.safeParse(updated); setIsValid(result.success); if (!result.success) { setZodErrors(result.error); } else { setZodErrors(null); } return updated; }); }, [setScript, setIsValid, setZodErrors], ); const removeInstallMethod = useCallback( (index: number) => { setScript((prev) => ({ ...prev, install_methods: prev.install_methods.filter((_, i) => i !== index), })); }, [setScript], ); return ( <>