mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-08 12:15:25 +03:00
Add keyboard shortcut hook and support shortcuts for playback page
This commit is contained in:
parent
48b672e4b4
commit
5802ad3259
@ -1,4 +1,11 @@
|
|||||||
import { MutableRefObject, useEffect, useMemo, useRef, useState } from "react";
|
import {
|
||||||
|
MutableRefObject,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from "react";
|
||||||
import VideoPlayer from "./VideoPlayer";
|
import VideoPlayer from "./VideoPlayer";
|
||||||
import Player from "video.js/dist/types/player";
|
import Player from "video.js/dist/types/player";
|
||||||
import TimelineEventOverlay from "../overlay/TimelineDataOverlay";
|
import TimelineEventOverlay from "../overlay/TimelineDataOverlay";
|
||||||
@ -6,6 +13,7 @@ import { useApiHost } from "@/api";
|
|||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import ActivityIndicator from "../ui/activity-indicator";
|
import ActivityIndicator from "../ui/activity-indicator";
|
||||||
|
import useKeyboardListener from "@/hooks/use-keyboard-listener";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dynamically switches between video playback and scrubbing preview player.
|
* Dynamically switches between video playback and scrubbing preview player.
|
||||||
@ -55,6 +63,51 @@ export default function DynamicVideoPlayer({
|
|||||||
);
|
);
|
||||||
}, [config]);
|
}, [config]);
|
||||||
|
|
||||||
|
// keyboard control
|
||||||
|
const onKeyboardShortcut = useCallback(
|
||||||
|
(key: string, down: boolean, repeat: boolean) => {
|
||||||
|
switch (key) {
|
||||||
|
case "ArrowLeft":
|
||||||
|
if (down) {
|
||||||
|
const currentTime = playerRef.current?.currentTime();
|
||||||
|
|
||||||
|
if (currentTime) {
|
||||||
|
playerRef.current?.currentTime(Math.max(0, currentTime - 5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "ArrowRight":
|
||||||
|
if (down) {
|
||||||
|
const currentTime = playerRef.current?.currentTime();
|
||||||
|
|
||||||
|
if (currentTime) {
|
||||||
|
playerRef.current?.currentTime(currentTime + 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "m":
|
||||||
|
if (down && !repeat && playerRef.current) {
|
||||||
|
playerRef.current.muted(!playerRef.current.muted());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case " ":
|
||||||
|
if (down && playerRef.current) {
|
||||||
|
if (playerRef.current.paused()) {
|
||||||
|
playerRef.current.play();
|
||||||
|
} else {
|
||||||
|
playerRef.current.pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[playerRef]
|
||||||
|
);
|
||||||
|
useKeyboardListener(
|
||||||
|
["ArrowLeft", "ArrowRight", "m", " "],
|
||||||
|
onKeyboardShortcut
|
||||||
|
);
|
||||||
|
|
||||||
// initial state
|
// initial state
|
||||||
|
|
||||||
const initialPlaybackSource = useMemo(() => {
|
const initialPlaybackSource = useMemo(() => {
|
||||||
|
|||||||
43
web/src/hooks/use-keyboard-listener.tsx
Normal file
43
web/src/hooks/use-keyboard-listener.tsx
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { useCallback, useEffect } from "react";
|
||||||
|
|
||||||
|
export default function useKeyboardListener(
|
||||||
|
keys: string[],
|
||||||
|
listener: (key: string, down: boolean, repeat: boolean) => void
|
||||||
|
) {
|
||||||
|
const keyDownListener = useCallback(
|
||||||
|
(e: KeyboardEvent) => {
|
||||||
|
if (!e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys.includes(e.key)) {
|
||||||
|
e.preventDefault();
|
||||||
|
listener(e.key, true, e.repeat);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[listener]
|
||||||
|
);
|
||||||
|
|
||||||
|
const keyUpListener = useCallback(
|
||||||
|
(e: KeyboardEvent) => {
|
||||||
|
if (!e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys.includes(e.key)) {
|
||||||
|
e.preventDefault();
|
||||||
|
listener(e.key, false, false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[listener]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
document.addEventListener("keydown", keyDownListener);
|
||||||
|
document.addEventListener("keyup", keyUpListener);
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener("keydown", keyDownListener);
|
||||||
|
document.removeEventListener("keyup", keyUpListener);
|
||||||
|
};
|
||||||
|
}, [listener]);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user