Fix mouseup/down behaviour of PTT button

Handle mouseup events anywhere so the button releases if you move
the cursor out of the button & release. Likewsie for window losing
focus.
This commit is contained in:
David Baker 2022-05-04 16:52:45 +01:00
commit f0b116714b

View file

@ -1,4 +1,4 @@
import React from "react"; import React, { useCallback, useEffect, useState } from "react";
import classNames from "classnames"; import classNames from "classnames";
import styles from "./PTTButton.module.css"; import styles from "./PTTButton.module.css";
import { ReactComponent as MicIcon } from "../icons/Mic.svg"; import { ReactComponent as MicIcon } from "../icons/Mic.svg";
@ -14,14 +14,39 @@ export function PTTButton({
startTalking, startTalking,
stopTalking, stopTalking,
}) { }) {
const [isHeld, setHeld] = useState(false);
const onDocumentMouseUp = useCallback(() => {
if (isHeld) stopTalking();
setHeld(false);
}, [isHeld, setHeld]);
const onWindowBlur = useCallback(() => {
if (isHeld) stopTalking();
setHeld(false);
}, [isHeld, setHeld]);
const onButtonMouseDown = useCallback(() => {
setHeld(true);
startTalking();
}, [setHeld]);
useEffect(() => {
window.addEventListener("mouseup", onDocumentMouseUp);
window.addEventListener("blur", onWindowBlur);
return () => {
window.removeEventListener("mouseup", onDocumentMouseUp);
window.removeEventListener("blur", onWindowBlur);
};
}, [onDocumentMouseUp, onWindowBlur]);
return ( return (
<button <button
className={classNames(styles.pttButton, { className={classNames(styles.pttButton, {
[styles.talking]: activeSpeakerUserId, [styles.talking]: activeSpeakerUserId,
[styles.error]: showTalkOverError, [styles.error]: showTalkOverError,
})} })}
onMouseDown={startTalking} onMouseDown={onButtonMouseDown}
onMouseUp={stopTalking}
> >
{activeSpeakerIsLocalUser || !activeSpeakerUserId ? ( {activeSpeakerIsLocalUser || !activeSpeakerUserId ? (
<MicIcon <MicIcon