MCPcopy Create free account
hub / github.com/cloudflare/meet / useButtonIsHeldDown

Function useButtonIsHeldDown

app/components/AiPushToTalkButton.tsx:10–64  ·  view source on GitHub ↗
({
	key,
	disabled,
}: {
	key: string
	disabled: boolean
})

Source from the content-addressed store, hash-verified

8import { Button } from './Button'
9
10function useButtonIsHeldDown({
11 key,
12 disabled,
13}: {
14 key: string
15 disabled: boolean
16}) {
17 const [keyIsHeldDown, setKeyIsHeldDown] = useState(false)
18 const buttonRef = useRef<HTMLButtonElement>(null)
19
20 useEffect(() => {
21 const button = buttonRef.current
22 let timeout = -1
23 const setTrue = () => {
24 if (!disabled) {
25 setKeyIsHeldDown(true)
26 clearTimeout(timeout)
27 }
28 }
29 const setFalse = () => {
30 timeout = window.setTimeout(() => {
31 setKeyIsHeldDown(false)
32 }, 200)
33 }
34
35 const onKeyDown = (e: KeyboardEvent) => {
36 if (e.key.toLowerCase() === key.toLowerCase()) {
37 setTrue()
38 }
39 }
40
41 const onKeyUp = (e: KeyboardEvent) => {
42 if (e.key.toLowerCase() === key.toLowerCase()) {
43 setFalse()
44 }
45 }
46
47 document.addEventListener('keydown', onKeyDown)
48 document.addEventListener('keyup', onKeyUp)
49 document.addEventListener('blur', setFalse)
50 button?.addEventListener('pointerdown', setTrue)
51 button?.addEventListener('pointerup', setFalse)
52
53 return () => {
54 clearTimeout(timeout)
55 document.removeEventListener('keydown', onKeyDown)
56 document.removeEventListener('keyup', onKeyUp)
57 document.removeEventListener('blur', setFalse)
58 button?.removeEventListener('pointerdown', setTrue)
59 button?.removeEventListener('pointerup', setFalse)
60 }
61 }, [disabled, key])
62
63 return [keyIsHeldDown, buttonRef] as const
64}
65
66export function AiPushToTalkButtion() {
67 const {

Callers 1

AiPushToTalkButtionFunction · 0.85

Calls 2

addEventListenerMethod · 0.80
removeEventListenerMethod · 0.80

Tested by

no test coverage detected