Disable keyboard shortcuts when focus is in a modal

This commit is contained in:
Robin Townsend 2023-04-19 15:51:44 -04:00
parent 18fa1371d3
commit 56bd54a645
2 changed files with 22 additions and 14 deletions

View file

@ -157,7 +157,7 @@ export function InCallView({
const { hideScreensharing } = useUrlParams(); const { hideScreensharing } = useUrlParams();
useCallViewKeyboardShortcuts( useCallViewKeyboardShortcuts(
!feedbackModalState.isOpen, containerRef1,
toggleMicrophoneMuted, toggleMicrophoneMuted,
toggleLocalVideoMuted, toggleLocalVideoMuted,
setMicrophoneMuted setMicrophoneMuted

View file

@ -14,30 +14,41 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import { useCallback, useRef } from "react"; import { RefObject, useCallback, useRef } from "react";
import { getSetting } from "./settings/useSetting"; import { getSetting } from "./settings/useSetting";
import { useEventTarget } from "./useEvents"; import { useEventTarget } from "./useEvents";
/**
* Determines whether focus is in the same part of the tree as the given
* element (specifically, if an ancestor or descendant of it is focused).
*/
const mayReceiveKeyEvents = (e: HTMLElement): boolean => {
const focusedElement = document.activeElement
return focusedElement !== null && (focusedElement.contains(e) || e.contains(focusedElement))
}
export function useCallViewKeyboardShortcuts( export function useCallViewKeyboardShortcuts(
enabled: boolean, focusElement: RefObject<HTMLElement | null>,
toggleMicrophoneMuted: () => void, toggleMicrophoneMuted: () => void,
toggleLocalVideoMuted: () => void, toggleLocalVideoMuted: () => void,
setMicrophoneMuted: (muted: boolean) => void setMicrophoneMuted: (muted: boolean) => void
) { ) {
const spacebarHeld = useRef(false); const spacebarHeld = useRef(false);
// These event handlers are set on the window because we want users to be able
// to trigger them without going to the trouble of focusing something
useEventTarget( useEventTarget(
window, window,
"keydown", "keydown",
useCallback( useCallback(
(event: KeyboardEvent) => { (event: KeyboardEvent) => {
if (!enabled) return; if (focusElement.current === null) return
if (!mayReceiveKeyEvents(focusElement.current)) return;
// Check if keyboard shortcuts are enabled // Check if keyboard shortcuts are enabled
const keyboardShortcuts = getSetting("keyboard-shortcuts", true); const keyboardShortcuts = getSetting("keyboard-shortcuts", true);
if (!keyboardShortcuts) { if (!keyboardShortcuts) return;
return;
}
if (event.key === "m") { if (event.key === "m") {
toggleMicrophoneMuted(); toggleMicrophoneMuted();
@ -49,8 +60,6 @@ export function useCallViewKeyboardShortcuts(
} }
}, },
[ [
enabled,
spacebarHeld,
toggleLocalVideoMuted, toggleLocalVideoMuted,
toggleMicrophoneMuted, toggleMicrophoneMuted,
setMicrophoneMuted, setMicrophoneMuted,
@ -63,19 +72,18 @@ export function useCallViewKeyboardShortcuts(
"keyup", "keyup",
useCallback( useCallback(
(event: KeyboardEvent) => { (event: KeyboardEvent) => {
if (!enabled) return; if (focusElement.current === null) return
if (!mayReceiveKeyEvents(focusElement.current)) return;
// Check if keyboard shortcuts are enabled // Check if keyboard shortcuts are enabled
const keyboardShortcuts = getSetting("keyboard-shortcuts", true); const keyboardShortcuts = getSetting("keyboard-shortcuts", true);
if (!keyboardShortcuts) { if (!keyboardShortcuts) return;
return;
}
if (event.key === " ") { if (event.key === " ") {
spacebarHeld.current = false; spacebarHeld.current = false;
setMicrophoneMuted(true); setMicrophoneMuted(true);
} }
}, },
[enabled, setMicrophoneMuted] [setMicrophoneMuted]
) )
); );