import { h } from 'preact'; import { useEffect, useCallback, 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 = useCallback(async (e, dir) => { e.stopPropagation(); sendPtz(`MOVE_${dir}`); setCurrentPreset(''); }, [sendPtz, setCurrentPreset]); const onSetZoom = useCallback(async (e, dir) => { e.stopPropagation(); sendPtz(`ZOOM_${dir}`); setCurrentPreset(''); }, [sendPtz, setCurrentPreset]); const onSetStop = useCallback(async (e) => { e.stopPropagation(); sendPtz('STOP'); }, [sendPtz]); const keydownListener = useCallback((e) => { if (!ptz || !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'); } } } }, [onSetMove, onSetZoom, ptz]); const keyupListener = useCallback((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); } }, [onSetStop]); useEffect(() => { document.addEventListener('keydown', keydownListener); document.addEventListener('keyup', keyupListener); return () => { document.removeEventListener('keydown', keydownListener); document.removeEventListener('keyup', keyupListener); }; }, [keydownListener, keyupListener, ptz]); if (!ptz) { return ; } return (
{ptz.features.includes('pt') && (
Pan / Tilt
)} {ptz.features.includes('zoom') && (
Zoom
)} {(ptz.presets || []).length > 0 && (
Presets
)}
); }