feat: hold to pause stream playback
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user