From 51f5d4cbda84c5769695ac88164f170bd9d231bd Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Mon, 27 Oct 2025 13:01:37 -0500 Subject: [PATCH] multiple triggers can trigger at once --- web/src/views/settings/TriggerView.tsx | 36 ++++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/web/src/views/settings/TriggerView.tsx b/web/src/views/settings/TriggerView.tsx index 8d794c2f2..e70e2bf47 100644 --- a/web/src/views/settings/TriggerView.tsx +++ b/web/src/views/settings/TriggerView.tsx @@ -91,7 +91,7 @@ export default function TriggerView({ const [showCreate, setShowCreate] = useState(false); const [showDelete, setShowDelete] = useState(false); const [selectedTrigger, setSelectedTrigger] = useState(null); - const [triggeredTrigger, setTriggeredTrigger] = useState(); + const [triggeredTrigger, setTriggeredTrigger] = useState([]); const [isLoading, setIsLoading] = useState(false); const cameraName = useCameraFriendlyName(selectedCamera); @@ -128,16 +128,32 @@ export default function TriggerView({ mutate(); - setTriggeredTrigger(triggers_status_ws.name); + setTriggeredTrigger((prev) => { + const current = prev || []; + const isFirstTrigger = current.length === 0; + if (!current.includes(triggers_status_ws.name)) { + const newTriggers = [...current, triggers_status_ws.name]; + // Only scroll if this is the first triggered trigger + if (isFirstTrigger) { + const target = document.querySelector( + `#trigger-${triggers_status_ws.name}`, + ); + if (target) { + target.scrollIntoView({ + block: "center", + behavior: "smooth", + inline: "nearest", + }); + } + } + return newTriggers; + } + return current; + }); const target = document.querySelector( `#trigger-${triggers_status_ws.name}`, ); if (target) { - target.scrollIntoView({ - block: "center", - behavior: "smooth", - inline: "nearest", - }); const ring = target.querySelector(".trigger-ring"); if (ring) { ring.classList.add(`outline-selected`); @@ -146,6 +162,9 @@ export default function TriggerView({ const timeout = setTimeout(() => { ring.classList.remove(`outline-selected`); ring.classList.add("outline-transparent"); + setTriggeredTrigger((prev) => + (prev || []).filter((name) => name !== triggers_status_ws.name), + ); }, 3000); return () => clearTimeout(timeout); } @@ -387,6 +406,7 @@ export default function TriggerView({ setShowCreate(false); setShowDelete(false); setUnsavedChanges(false); + setTriggeredTrigger([]); } }, [selectedCamera, setUnsavedChanges]); @@ -500,7 +520,7 @@ export default function TriggerView({