import { useAudioState, useDetectState, usePtzCommand, useRecordingsState, useSnapshotsState, } from "@/api/ws"; import CameraFeatureToggle from "@/components/dynamic/CameraFeatureToggle"; import LivePlayer from "@/components/player/LivePlayer"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { TooltipProvider } from "@/components/ui/tooltip"; import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { CameraConfig } from "@/types/frigateConfig"; import { CameraPtzInfo } from "@/types/ptz"; import React, { useCallback, useMemo, useState } from "react"; import { isDesktop, isMobile, isSafari, useMobileOrientation, } from "react-device-detect"; import { BsThreeDotsVertical } from "react-icons/bs"; import { FaAngleDown, FaAngleLeft, FaAngleRight, FaAngleUp, } from "react-icons/fa"; import { GiSpeaker, GiSpeakerOff } from "react-icons/gi"; import { IoMdArrowBack } from "react-icons/io"; import { LuEar, LuEarOff, LuVideo, LuVideoOff } from "react-icons/lu"; import { MdNoPhotography, MdPersonOff, MdPersonSearch, MdPhotoCamera, MdZoomIn, MdZoomOut, } from "react-icons/md"; import { useNavigate } from "react-router-dom"; import useSWR from "swr"; type LiveCameraViewProps = { camera: CameraConfig; }; export default function LiveCameraView({ camera }: LiveCameraViewProps) { const navigate = useNavigate(); const { isPortrait } = useMobileOrientation(); // camera features const { payload: detectState, send: sendDetect } = useDetectState( camera.name, ); const { payload: recordState, send: sendRecord } = useRecordingsState( camera.name, ); const { payload: snapshotState, send: sendSnapshot } = useSnapshotsState( camera.name, ); const { payload: audioState, send: sendAudio } = useAudioState(camera.name); // playback state const [audio, setAudio] = useState(false); const growClassName = useMemo(() => { if (isMobile) { if (isPortrait) { return "absolute left-2 right-2 top-[50%] -translate-y-[50%]"; } else { return "absolute top-2 bottom-2 left-[50%] -translate-x-[50%]"; } } else if (camera.detect.width / camera.detect.height > 2) { return "absolute left-2 right-2 top-[50%] -translate-y-[50%]"; } else { return "absolute top-2 bottom-2 left-[50%] -translate-x-[50%]"; } }, [camera, isPortrait]); return (