Files
frigate/web/src/pages/Live.tsx
T

128 lines
3.5 KiB
TypeScript
Raw Normal View History

import { useFullscreen } from "@/hooks/use-fullscreen";
2024-03-15 12:46:17 -06:00
import {
useHashState,
usePersistedOverlayState,
2024-06-19 06:09:49 -06:00
useSearchEffect,
} from "@/hooks/use-overlay-state";
2023-12-15 16:24:50 -07:00
import { FrigateConfig } from "@/types/frigateConfig";
2024-03-15 17:28:32 -06:00
import LiveBirdseyeView from "@/views/live/LiveBirdseyeView";
2024-03-01 17:43:02 -07:00
import LiveCameraView from "@/views/live/LiveCameraView";
import LiveDashboardView from "@/views/live/LiveDashboardView";
import { useEffect, useMemo, useRef } from "react";
2023-12-15 16:24:50 -07:00
import useSWR from "swr";
function Live() {
2023-12-15 16:24:50 -07:00
const { data: config } = useSWR<FrigateConfig>("config");
2024-03-04 16:18:30 -07:00
2024-04-12 06:31:30 -06:00
// selection
2024-03-15 12:46:17 -06:00
const [selectedCameraName, setSelectedCameraName] = useHashState();
2024-06-19 06:09:49 -06:00
const [cameraGroup, setCameraGroup] = usePersistedOverlayState(
2024-03-15 09:59:41 -05:00
"cameraGroup",
"default" as string,
);
2024-02-10 05:30:53 -07:00
2024-06-19 06:09:49 -06:00
useSearchEffect("group", (cameraGroup) => {
if (config && cameraGroup) {
const group = config.camera_groups[cameraGroup];
if (group) {
setCameraGroup(cameraGroup);
}
}
});
// fullscreen
const mainRef = useRef<HTMLDivElement | null>(null);
const { fullscreen, toggleFullscreen } = useFullscreen(mainRef);
2024-04-12 06:31:30 -06:00
// document title
useEffect(() => {
if (selectedCameraName) {
const capitalized = selectedCameraName
.split("_")
.map((text) => text[0].toUpperCase() + text.substring(1));
document.title = `${capitalized.join(" ")} - Live - Frigate`;
} else if (cameraGroup && cameraGroup != "default") {
document.title = `${cameraGroup[0].toUpperCase()}${cameraGroup.substring(1)} - Live - Frigate`;
} else {
document.title = "Live - Frigate";
}
}, [cameraGroup, selectedCameraName]);
// settings
const includesBirdseye = useMemo(() => {
if (
config &&
Object.keys(config.camera_groups).length &&
cameraGroup &&
config.camera_groups[cameraGroup] &&
cameraGroup != "default"
) {
return config.camera_groups[cameraGroup].cameras.includes("birdseye");
} else {
return false;
}
}, [config, cameraGroup]);
2024-02-10 05:30:53 -07:00
const cameras = useMemo(() => {
2023-12-16 07:40:00 -07:00
if (!config) {
return [];
}
if (
Object.keys(config.camera_groups).length &&
cameraGroup &&
config.camera_groups[cameraGroup] &&
cameraGroup != "default"
) {
2024-03-04 16:18:30 -07:00
const group = config.camera_groups[cameraGroup];
return Object.values(config.cameras)
.filter((conf) => conf.enabled && group.cameras.includes(conf.name))
.sort((aConf, bConf) => aConf.ui.order - bConf.ui.order);
}
2024-02-10 05:30:53 -07:00
return Object.values(config.cameras)
.filter((conf) => conf.ui.dashboard && conf.enabled)
.sort((aConf, bConf) => aConf.ui.order - bConf.ui.order);
2024-03-04 16:18:30 -07:00
}, [config, cameraGroup]);
2023-12-15 16:24:50 -07:00
2024-03-01 17:43:02 -07:00
const selectedCamera = useMemo(
() => cameras.find((cam) => cam.name == selectedCameraName),
[cameras, selectedCameraName],
);
2024-02-12 18:28:36 -07:00
return (
<div className="size-full" ref={mainRef}>
{selectedCameraName === "birdseye" ? (
<LiveBirdseyeView
fullscreen={fullscreen}
toggleFullscreen={toggleFullscreen}
/>
) : selectedCamera ? (
<LiveCameraView
config={config}
camera={selectedCamera}
fullscreen={fullscreen}
toggleFullscreen={toggleFullscreen}
/>
) : (
<LiveDashboardView
cameras={cameras}
2024-07-15 09:34:41 -06:00
cameraGroup={cameraGroup ?? "default"}
includeBirdseye={includesBirdseye}
onSelectCamera={setSelectedCameraName}
fullscreen={fullscreen}
toggleFullscreen={toggleFullscreen}
/>
)}
</div>
);
}
export default Live;