import { usePtzCommand } from "@/api/ws"; import LivePlayer from "@/components/player/LivePlayer"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import useKeyboardListener from "@/hooks/use-keyboard-listener"; import { CameraConfig } from "@/types/frigateConfig"; import { CameraPtzInfo } from "@/types/ptz"; import React, { useCallback, useMemo } from "react"; import { isSafari } from "react-device-detect"; import { BsThreeDotsVertical } from "react-icons/bs"; import { FaAngleDown, FaAngleLeft, FaAngleRight, FaAngleUp, } from "react-icons/fa"; import { IoMdArrowBack } from "react-icons/io"; import { 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 growClassName = useMemo(() => { 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]); return (
{camera.onvif.host != "" && }
); } function PtzControlPanel({ camera }: { camera: string }) { const { data: ptz } = useSWR(`${camera}/ptz/info`); const { payload: _, send: sendPtz } = usePtzCommand(camera); const onStop = useCallback( (e: React.SyntheticEvent) => { e.preventDefault(); sendPtz("STOP"); }, [sendPtz], ); useKeyboardListener( ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "+", "-"], (key, down, repeat) => { if (repeat) { return; } if (!down) { sendPtz("STOP"); return; } switch (key) { case "ArrowLeft": sendPtz("MOVE_LEFT"); break; case "ArrowRight": sendPtz("MOVE_RIGHT"); break; case "ArrowUp": sendPtz("MOVE_UP"); break; case "ArrowDown": sendPtz("MOVE_DOWN"); break; case "+": sendPtz("ZOOM_IN"); break; case "-": sendPtz("ZOOM_OUT"); break; } }, ); return (
{ptz?.features?.includes("pt") && ( <> )} {ptz?.features?.includes("zoom") && ( <> )} {(ptz?.presets?.length ?? 0) > 0 && ( {ptz?.presets.map((preset) => { return ( sendPtz(`preset_${preset}`)}> {preset} ); })} )}
); }