refactor: re-structure stream playback control

This commit is contained in:
talksik
2026-04-25 13:48:37 -07:00
parent cf143f232d
commit 13c6bbd0fb
18 changed files with 313 additions and 206 deletions
+57
View File
@@ -0,0 +1,57 @@
import { useEffect } from "react";
import { REACTION_EMOJIS } from "@/api/types";
import { selectIsPaused, usePlaybackPauseStore } from "@/stores/playback-pause-store";
import { isTypingTarget } from "@/lib/keyboard";
interface UseStreamActionKeysOptions {
onToggleReaction: (emoji: string) => void;
onOpenHuddle: () => void;
onToggleRecordingMode: () => void;
onToggleKeybindings: () => void;
}
/**
* Reactions 17, `h` huddle, `v` toggle recording mode, `?` toggle
* keybindings overlay. Skipped while playback is paused for any reason.
*/
export function useStreamActionKeys({
onToggleReaction,
onOpenHuddle,
onToggleRecordingMode,
onToggleKeybindings,
}: UseStreamActionKeysOptions) {
useEffect(() => {
const onKeyDown = (e: KeyboardEvent) => {
if (isTypingTarget(e)) return;
if (selectIsPaused(usePlaybackPauseStore.getState())) return;
switch (e.key) {
case "h":
e.preventDefault();
onOpenHuddle();
break;
case "v":
e.preventDefault();
onToggleRecordingMode();
break;
case "?":
e.preventDefault();
onToggleKeybindings();
break;
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
e.preventDefault();
onToggleReaction(REACTION_EMOJIS[parseInt(e.key) - 1]);
break;
}
};
window.addEventListener("keydown", onKeyDown);
return () => window.removeEventListener("keydown", onKeyDown);
}, [onToggleReaction, onOpenHuddle, onToggleRecordingMode, onToggleKeybindings]);
}