import { h } from 'preact'; import { useState } from 'preact/hooks'; import useSWR from 'swr'; import { usePtzCommand } from '../api/ws'; import ActivityIndicator from './ActivityIndicator'; import ArrowRightDouble from '../icons/ArrowRightDouble'; import ArrowUpDouble from '../icons/ArrowUpDouble'; import ArrowDownDouble from '../icons/ArrowDownDouble'; import ArrowLeftDouble from '../icons/ArrowLeftDouble'; import Button from './Button'; import Heading from './Heading'; export default function CameraControlPanel({ camera = '' }) { const { data: ptz } = useSWR(`${camera}/ptz/info`); const [currentPreset, setCurrentPreset] = useState(''); const { payload: _, send: sendPtz } = usePtzCommand(camera); const onSetPreview = async (e) => { e.stopPropagation(); if (currentPreset == 'none') { return; } sendPtz(`preset_${currentPreset}`); setCurrentPreset(''); }; const onSetMove = async (e, dir) => { e.stopPropagation(); sendPtz(`MOVE_${dir}`); setCurrentPreset(''); }; const onSetZoom = async (e, dir) => { e.stopPropagation(); sendPtz(`ZOOM_${dir}`); setCurrentPreset(''); }; const onSetStop = async (e) => { e.stopPropagation(); sendPtz('STOP'); }; if (!ptz) { return ; } document.addEventListener('keydown', (e) => { if (!e) { return; } if (e.repeat) { e.preventDefault(); return; } if (ptz.features.includes('pt')) { if (e.key === 'ArrowLeft') { e.preventDefault(); onSetMove(e, 'LEFT'); } else if (e.key === 'ArrowRight') { e.preventDefault(); onSetMove(e, 'RIGHT'); } else if (e.key === 'ArrowUp') { e.preventDefault(); onSetMove(e, 'UP'); } else if (e.key === 'ArrowDown') { e.preventDefault(); onSetMove(e, 'DOWN'); } if (ptz.features.includes('zoom')) { if (e.key == '+') { e.preventDefault(); onSetZoom(e, 'IN'); } else if (e.key == '-') { e.preventDefault(); onSetZoom(e, 'OUT'); } } } }); document.addEventListener('keyup', (e) => { if (!e || e.repeat) { return; } if ( e.key === 'ArrowLeft' || e.key === 'ArrowRight' || e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === '+' || e.key === '-' ) { e.preventDefault(); onSetStop(e); } }); return (
{ptz.features.includes('pt') && (
Pan / Tilt
)} {ptz.features.includes('zoom') && (
Zoom
)} {(ptz.presets || []).length > 0 && (
Presets
)}
); }