feat: hold to pause stream playback

This commit is contained in:
talksik
2026-04-07 16:32:51 -07:00
parent 45fa4cb0e5
commit 695adddaff
+31 -11
View File
@@ -177,19 +177,20 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
else resume(); else resume();
}, [composeActive, pause, resume]); }, [composeActive, pause, resume]);
// Playback keyboard: arrows, escape // Playback keyboard: arrows, escape, hold-space-to-pause
useEffect(() => { useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => { function isInputTarget(e: KeyboardEvent) {
if (composeActive) return;
const target = e.target as HTMLElement; const target = e.target as HTMLElement;
if ( return (
target.tagName === "INPUT" || target.tagName === "INPUT" ||
target.tagName === "TEXTAREA" || target.tagName === "TEXTAREA" ||
target.isContentEditable target.isContentEditable
) { );
return; }
}
const handleKeyDown = (e: KeyboardEvent) => {
if (composeActive) return;
if (isInputTarget(e)) return;
switch (e.key) { switch (e.key) {
case "ArrowRight": case "ArrowRight":
@@ -202,6 +203,10 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
e.preventDefault(); e.preventDefault();
prev(); prev();
break; break;
case " ":
e.preventDefault();
if (!e.repeat) pause();
break;
case "Escape": case "Escape":
e.preventDefault(); e.preventDefault();
navigate(`/${networkId}`); navigate(`/${networkId}`);
@@ -215,11 +220,26 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
break; break;
} }
} }
} };
const handleKeyUp = (e: KeyboardEvent) => {
if (composeActive) return;
if (isInputTarget(e)) return;
if (e.key === " ") {
e.preventDefault();
resume();
}
};
window.addEventListener("keydown", handleKeyDown); window.addEventListener("keydown", handleKeyDown);
return () => window.removeEventListener("keydown", handleKeyDown); window.addEventListener("keyup", handleKeyUp);
return () => {
window.removeEventListener("keydown", handleKeyDown);
window.removeEventListener("keyup", handleKeyUp);
};
}, },
[composeActive, next, prev, navigate, networkId, streamParticle.id], [composeActive, next, prev, pause, resume, navigate, networkId, streamParticle.id],
); );
// Click-to-navigate: left 30% = prev, right 70% = next // Click-to-navigate: left 30% = prev, right 70% = next