From ac01d40707966c37dbeef6b8386438d7c932bca1 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 12 Jun 2025 13:19:04 -0500 Subject: [PATCH] fix role checkboxes --- .../components/settings/CameraEditForm.tsx | 83 ++++++++++--------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/web/src/components/settings/CameraEditForm.tsx b/web/src/components/settings/CameraEditForm.tsx index 300754582..eb731b2b3 100644 --- a/web/src/components/settings/CameraEditForm.tsx +++ b/web/src/components/settings/CameraEditForm.tsx @@ -73,27 +73,27 @@ export default function CameraEditForm({ ) .min(1, { message: t("camera.cameraConfig.ffmpeg.inputsRequired"), - }), - // .refine( - // (inputs) => { - // const roleOccurrences = new Map(); - // inputs.forEach((input) => { - // input.roles.forEach((role) => { - // roleOccurrences.set( - // role, - // (roleOccurrences.get(role) || 0) + 1, - // ); - // }); - // }); - // return Array.from(roleOccurrences.values()).every( - // (count) => count <= 1, - // ); - // }, - // { - // message: t("camera.cameraConfig.ffmpeg.rolesUnique"), - // path: ["inputs"], - // }, - // ), + }) + .refine( + (inputs) => { + const roleOccurrences = new Map(); + inputs.forEach((input) => { + input.roles.forEach((role) => { + roleOccurrences.set( + role, + (roleOccurrences.get(role) || 0) + 1, + ); + }); + }); + return Array.from(roleOccurrences.values()).every( + (count) => count <= 1, + ); + }, + { + message: t("camera.cameraConfig.ffmpeg.rolesUnique"), + path: ["inputs"], + }, + ), }), }), [t], @@ -149,19 +149,12 @@ export default function CameraEditForm({ name: "ffmpeg.inputs", }); - // Track used roles across all streams in the form - // const currentUsedRoles = useMemo(() => { - // const roles = new Set(); - // const values = form.getValues(); - // values.ffmpeg.inputs.forEach((input) => { - // input.roles.forEach((role) => roles.add(role)); - // }); - // return roles; - // }, [form]); + // Watch ffmpeg.inputs to track used roles + const watchedInputs = form.watch("ffmpeg.inputs"); const saveCameraConfig = (values: FormValues) => { setIsLoading(true); - const configData = { + const configData: ConfigSetBody["config_data"] = { cameras: { [values.cameraName]: { enabled: values.enabled, @@ -220,7 +213,11 @@ export default function CameraEditForm({ // If camera name changed, delete old camera config const deleteRequestBody: ConfigSetBody = { requires_restart: 1, - config_data: { cameras: { [cameraName]: "" } }, + config_data: { + cameras: { + [cameraName]: "", + }, + }, update_topic: `config/cameras/${cameraName}/remove`, }; @@ -247,14 +244,23 @@ export default function CameraEditForm({ // Determine available roles for new streams const getAvailableRoles = (): Role[] => { - const values = form.getValues(); const used = new Set(); - values.ffmpeg.inputs.forEach((input) => { + watchedInputs.forEach((input) => { input.roles.forEach((role) => used.add(role)); }); return used.has("detect") ? [] : ["detect"]; }; + const getUsedRolesExcludingIndex = (excludeIndex: number) => { + const roles = new Set(); + watchedInputs.forEach((input, idx) => { + if (idx !== excludeIndex) { + input.roles.forEach((role) => roles.add(role)); + } + }); + return roles; + }; + return ( <> @@ -358,11 +364,10 @@ export default function CameraEditForm({ : field.value.filter((r) => r !== role); field.onChange(updatedRoles); }} - // disabled={ - // !field.value.includes(role) && - // currentUsedRoles.has(role) && - // currentUsedRoles.size > 0 - // } + disabled={ + !field.value.includes(role) && + getUsedRolesExcludingIndex(index).has(role) + } /> {role}