diff --git a/web/src/components/CameraControlPanel.jsx b/web/src/components/CameraControlPanel.jsx index fe5b12a60..31be6b291 100644 --- a/web/src/components/CameraControlPanel.jsx +++ b/web/src/components/CameraControlPanel.jsx @@ -1,5 +1,5 @@ import { h } from 'preact'; -import { useState } from 'preact/hooks'; +import { useEffect, useCallback, useState } from 'preact/hooks'; import useSWR from 'swr'; import { usePtzCommand } from '../api/ws'; import ActivityIndicator from './ActivityIndicator'; @@ -44,12 +44,8 @@ export default function CameraControlPanel({ camera = '' }) { sendPtz('STOP'); }; - if (!ptz) { - return ; - } - - document.addEventListener('keydown', (e) => { - if (!e) { + const keydownListener = useCallback((e) => { + if (!ptz || !e) { return; } @@ -83,9 +79,9 @@ export default function CameraControlPanel({ camera = '' }) { } } } - }); + }, [ptz]); - document.addEventListener('keyup', (e) => { + const keyupListener = useCallback((e) => { if (!e || e.repeat) { return; } @@ -101,7 +97,20 @@ export default function CameraControlPanel({ camera = '' }) { e.preventDefault(); onSetStop(e); } - }); + }, []); + + 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 (