AutoUpdatingCameraImage.jsx 875 B

12345678910111213141516171819202122232425262728
  1. import { h } from 'preact';
  2. import CameraImage from './CameraImage';
  3. import { useCallback, useState } from 'preact/hooks';
  4. const MIN_LOAD_TIMEOUT_MS = 200;
  5. export default function AutoUpdatingCameraImage({ camera, searchParams = '', showFps = true }) {
  6. const [key, setKey] = useState(Date.now());
  7. const [fps, setFps] = useState(0);
  8. const handleLoad = useCallback(() => {
  9. const loadTime = Date.now() - key;
  10. setFps((1000 / Math.max(loadTime, MIN_LOAD_TIMEOUT_MS)).toFixed(1));
  11. setTimeout(
  12. () => {
  13. setKey(Date.now());
  14. },
  15. loadTime > MIN_LOAD_TIMEOUT_MS ? 1 : MIN_LOAD_TIMEOUT_MS
  16. );
  17. }, [key, setFps]);
  18. return (
  19. <div>
  20. <CameraImage camera={camera} onload={handleLoad} searchParams={`cache=${key}&${searchParams}`} />
  21. {showFps ? <span className="text-xs">Displaying at {fps}fps</span> : null}
  22. </div>
  23. );
  24. }