diff --git a/web/src/components/filter/CameraGroupSelector.tsx b/web/src/components/filter/CameraGroupSelector.tsx
index b36406e4d..c165a938a 100644
--- a/web/src/components/filter/CameraGroupSelector.tsx
+++ b/web/src/components/filter/CameraGroupSelector.tsx
@@ -298,24 +298,26 @@ function NewGroupDialog({ open, setOpen, currentGroups }: NewGroupDialogProps) {
- {Object.keys(config?.cameras ?? {}).map((camera) => (
- {
- if (checked) {
- setCameras([...cameras, camera]);
- } else {
- const index = cameras.indexOf(camera);
- setCameras([
- ...cameras.slice(0, index),
- ...cameras.slice(index + 1),
- ]);
- }
- }}
- />
- ))}
+ {[...Object.keys(config?.cameras ?? {}), "birdseye"].map(
+ (camera) => (
+ {
+ if (checked) {
+ setCameras([...cameras, camera]);
+ } else {
+ const index = cameras.indexOf(camera);
+ setCameras([
+ ...cameras.slice(0, index),
+ ...cameras.slice(index + 1),
+ ]);
+ }
+ }}
+ />
+ ),
+ )}
{error &&
MSE is only supported on iOS 17.1+. You'll need to update if available
or use jsmpeg / webRTC streams. See the docs for more info.
@@ -35,17 +32,23 @@ export default function BirdseyeLivePlayer({
);
}
} else if (liveMode == "jsmpeg") {
- return (
-
-
-
+ player = (
+
);
} else {
-
;
+ player =
;
}
+
+ return (
+
+ );
}
diff --git a/web/src/pages/Live.tsx b/web/src/pages/Live.tsx
index cbf4fb44d..f13214ed7 100644
--- a/web/src/pages/Live.tsx
+++ b/web/src/pages/Live.tsx
@@ -11,6 +11,14 @@ function Live() {
const [selectedCameraName, setSelectedCameraName] = useOverlayState("camera");
const [cameraGroup] = useOverlayState("cameraGroup");
+ const includesBirdseye = useMemo(() => {
+ if (config && cameraGroup) {
+ return config.camera_groups[cameraGroup].cameras.includes("birdseye");
+ } else {
+ return false;
+ }
+ }, [config, cameraGroup]);
+
const cameras = useMemo(() => {
if (!config) {
return [];
@@ -18,15 +26,9 @@ function Live() {
if (cameraGroup) {
const group = config.camera_groups[cameraGroup];
- console.log(config.cameras);
const groupCameras = Object.values(config.cameras)
.filter((conf) => conf.enabled && group.cameras.includes(conf.name))
.sort((aConf, bConf) => aConf.ui.order - bConf.ui.order);
- if (group.cameras.includes("birdseye")) {
- groupCameras.push({
- name: "birdseye",
- });
- }
return groupCameras;
}
@@ -47,6 +49,7 @@ function Live() {
return (
);
diff --git a/web/src/pages/UIPlayground.tsx b/web/src/pages/UIPlayground.tsx
index 407bc6f92..76ac6fe95 100644
--- a/web/src/pages/UIPlayground.tsx
+++ b/web/src/pages/UIPlayground.tsx
@@ -186,7 +186,6 @@ function UIPlayground() {
const [isEventsReviewTimeline, setIsEventsReviewTimeline] = useState(true);
const birdseyeConfig = config?.birdseye;
- console.log(birdseyeConfig);
return (
<>
diff --git a/web/src/views/live/LiveDashboardView.tsx b/web/src/views/live/LiveDashboardView.tsx
index 6381d8de2..ed178f152 100644
--- a/web/src/views/live/LiveDashboardView.tsx
+++ b/web/src/views/live/LiveDashboardView.tsx
@@ -2,12 +2,13 @@ import { useFrigateReviews } from "@/api/ws";
import Logo from "@/components/Logo";
import { CameraGroupSelector } from "@/components/filter/CameraGroupSelector";
import { AnimatedEventThumbnail } from "@/components/image/AnimatedEventThumbnail";
+import BirdseyeLivePlayer from "@/components/player/BirdseyeLivePlayer";
import LivePlayer from "@/components/player/LivePlayer";
import { Button } from "@/components/ui/button";
import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
import { TooltipProvider } from "@/components/ui/tooltip";
import { usePersistence } from "@/hooks/use-persistence";
-import { CameraConfig } from "@/types/frigateConfig";
+import { CameraConfig, FrigateConfig } from "@/types/frigateConfig";
import { ReviewSegment } from "@/types/review";
import { useCallback, useEffect, useMemo, useState } from "react";
import { isDesktop, isMobile, isSafari } from "react-device-detect";
@@ -16,12 +17,16 @@ import useSWR from "swr";
type LiveDashboardViewProps = {
cameras: CameraConfig[];
+ includeBirdseye: boolean;
onSelectCamera: (camera: string) => void;
};
export default function LiveDashboardView({
cameras,
+ includeBirdseye,
onSelectCamera,
}: LiveDashboardViewProps) {
+ const { data: config } = useSWR
("config");
+
// layout
const [layout, setLayout] = usePersistence<"grid" | "list">(
@@ -74,6 +79,8 @@ export default function LiveDashboardView({
};
}, [visibilityListener]);
+ const birdseyeConfig = config?.birdseye;
+
return (
{isMobile && (
@@ -123,6 +130,12 @@ export default function LiveDashboardView({
+ {includeBirdseye && birdseyeConfig && (
+
+ )}
{cameras.map((camera) => {
let grow;
const aspectRatio = camera.detect.width / camera.detect.height;