From de8d06b119c1e73f654da047029aa8f1d194dc6c Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sun, 22 Dec 2024 12:25:34 -0600 Subject: [PATCH] live context menu component --- web/src/components/menu/LiveContextMenu.tsx | 142 ++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 web/src/components/menu/LiveContextMenu.tsx diff --git a/web/src/components/menu/LiveContextMenu.tsx b/web/src/components/menu/LiveContextMenu.tsx new file mode 100644 index 000000000..80cd7e97f --- /dev/null +++ b/web/src/components/menu/LiveContextMenu.tsx @@ -0,0 +1,142 @@ +import { ReactNode, useMemo } from "react"; +import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuSeparator, + ContextMenuTrigger, +} from "@/components/ui/context-menu"; +import { + MdVolumeDown, + MdVolumeMute, + MdVolumeOff, + MdVolumeUp, +} from "react-icons/md"; +import { VolumeSlider } from "@/components/ui/slider"; + +type LiveContextMenuProps = { + camera: string; + preferredLiveMode: string; + isRestreamed: boolean; + supportsAudio: boolean; + audioState: boolean; + toggleAudio: () => void; + volumeState?: number; + setVolumeState: (volumeState: number) => void; + muteAll: () => void; + unmuteAll: () => void; + resetPreferredLiveMode: () => void; + children?: ReactNode; +}; +export default function LiveContextMenu({ + camera, + preferredLiveMode, + isRestreamed, + supportsAudio, + audioState, + toggleAudio, + volumeState, + setVolumeState, + muteAll, + unmuteAll, + resetPreferredLiveMode, + children, +}: LiveContextMenuProps) { + const VolumeIcon = useMemo(() => { + if (!volumeState || volumeState == 0.0 || !audioState) { + return MdVolumeOff; + } else if (volumeState <= 0.33) { + return MdVolumeMute; + } else if (volumeState <= 0.67) { + return MdVolumeDown; + } else { + return MdVolumeUp; + } + // only update when specific fields change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [volumeState, audioState]); + + return ( + + {children} + +
+ {camera.replaceAll("_", " ")} +
+ {preferredLiveMode != "jsmpeg" && isRestreamed && supportsAudio && ( + <> + +
+
+

Audio

+
+ { + e.stopPropagation(); + toggleAudio(); + }} + /> + { + setVolumeState(value[0]); + }} + /> +
+
+
+ + )} + + +
+
Mute All Cameras
+
+
+ +
+
Unmute All Cameras
+
+
+ {isRestreamed && ( + <> + + +
{}} + > +
Streaming Settings
+
+
+ + )} + {preferredLiveMode == "jsmpeg" && isRestreamed && ( + <> + + +
+
Reset
+
+
+ + )} +
+
+ ); +}