import { useEffect } from "react"; import validator from "validator"; import { LuPlus, LuX } from "react-icons/lu"; import { useFieldArray, useFormContext } from "react-hook-form"; import { cx } from "cva"; import { NetworkSettings } from "@hooks/stores"; import { Button } from "@components/Button"; import { GridCard } from "@components/Card"; import { InputFieldWithLabel } from "@components/InputField"; import { netMaskFromCidr4 } from "@/utils/ip"; import { m } from "@localizations/messages.js"; export default function StaticIpv4Card() { const formMethods = useFormContext(); const { register, formState, watch, setValue } = formMethods; const { fields, append, remove } = useFieldArray({ name: "ipv4_static.dns" }); useEffect(() => { if (fields.length === 0) append(""); }, [append, fields.length]); const dns = watch("ipv4_static.dns"); const ipv4StaticAddress = watch("ipv4_static.address"); const hideSubnetMask = ipv4StaticAddress?.includes("/"); useEffect(() => { const parts = ipv4StaticAddress?.split("/", 2); if (parts?.length !== 2) return; const cidrNotation = parseInt(parts?.[1] ?? ""); if (isNaN(cidrNotation) || cidrNotation < 0 || cidrNotation > 32) return; const mask = netMaskFromCidr4(cidrNotation); setValue("ipv4_static.netmask", mask); }, [ipv4StaticAddress, setValue]); const ipv4Validation = (value: string) => { if (!validator.isIP(value, 4)) return m.network_ipv4_invalid() return true; }; const validateIsIPOrCIDR4 = (value: string) => { if (!validator.isIP(value) && !validator.isIPRange(value, 4)) return m.network_ipv4_invalid_cidr(); return true; }; return (

{m.network_static_ipv4_header()}

validateIsIPOrCIDR4(value ?? "") })} error={formState.errors.ipv4_static?.address?.message} /> {!hideSubnetMask && ipv4Validation(value ?? "") })} error={formState.errors.ipv4_static?.netmask?.message} />}
ipv4Validation(value ?? "") })} error={formState.errors.ipv4_static?.gateway?.message} /> {/* DNS server fields */}
{fields.map((dns, index) => { return (
ipv4Validation(value ?? "") } )} error={formState.errors.ipv4_static?.dns?.[index]?.message} />
{index > 0 && (
)}
); })}
); }