diff --git a/internal/site/src/components/network-probes-table/probe-dialog.tsx b/internal/site/src/components/network-probes-table/probe-dialog.tsx index 4faa6deb..99221aa6 100644 --- a/internal/site/src/components/network-probes-table/probe-dialog.tsx +++ b/internal/site/src/components/network-probes-table/probe-dialog.tsx @@ -18,6 +18,17 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@ import { PlusIcon } from "lucide-react" import { useToast } from "@/components/ui/use-toast" import { $systems } from "@/lib/stores" +import * as v from "valibot" + +const Schema = v.object({ + system: v.string(), + target: v.string(), + protocol: v.picklist(["icmp", "tcp", "http"]), + port: v.number(), + interval: v.pipe(v.string(), v.toNumber(), v.minValue(1), v.maxValue(3600)), + enabled: v.boolean(), + name: v.optional(v.string()), +}) export function AddProbeDialog({ systemId }: { systemId?: string }) { const [open, setOpen] = useState(false) @@ -45,16 +56,20 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) + try { - await pb.collection("network_probes").create({ + const payload = v.parse(Schema, { system: systemId ?? selectedSystemId, - name: name || targetName, target, protocol, port: protocol === "tcp" ? Number(port) : 0, - interval: Number(probeInterval), + interval: probeInterval, enabled: true, }) + if (name && name !== target) { + payload.name = name + } + await pb.collection("network_probes").create(payload) resetForm() setOpen(false) } catch (err: unknown) { @@ -116,6 +131,7 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) { +