import { LuPlus, LuX } from "react-icons/lu"; import { useFieldArray, useFormContext } from "react-hook-form"; import { useEffect } from "react"; import validator from "validator"; import { cx } from "cva"; import { GridCard } from "@/components/Card"; import { Button } from "@/components/Button"; import { InputFieldWithLabel } from "@/components/InputField"; import { NetworkSettings } from "@/hooks/stores"; import { netMaskFromCidr4 } from "@/utils/ip"; 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 validate = (value: string) => { if (!validator.isIP(value)) return "Invalid IP address"; return true; }; const validateIsIPOrCIDR4 = (value: string) => { if (!validator.isIP(value, 4) && !validator.isIPRange(value, 4)) return "Invalid IP address or CIDR notation"; return true; }; return (

Static IPv4 Configuration

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