mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
* chore: remove useKeyDownListener * chore: remove react-use, update jazz version and add query string * chore: update jazz version * chore: use simple mac or win utils code * feat(util): add isTextInput * feat(hooks): all needed hooks * fix: link bunch stuff * fix: page bunch stuff * chore: bunch update for custom component * chore: use throttle from internal hook * chore: topic bunch stuff * chore: update layout * fix: truncate content header of topic detail
62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import { useAtom } from "jotai"
|
|
import { useEffect, useCallback } from "react"
|
|
import { keyboardDisableSourcesAtom } from "@/store/keydown-manager"
|
|
|
|
const allowedKeys = [
|
|
"Escape",
|
|
"ArrowUp",
|
|
"ArrowDown",
|
|
"ArrowLeft",
|
|
"ArrowRight",
|
|
"Enter",
|
|
"Tab",
|
|
"Backspace",
|
|
"Home",
|
|
"End"
|
|
]
|
|
|
|
export function useKeyboardManager(sourceId: string) {
|
|
const [disableSources, setDisableSources] = useAtom(keyboardDisableSourcesAtom)
|
|
|
|
useEffect(() => {
|
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
if (disableSources.has(sourceId)) {
|
|
if (allowedKeys.includes(event.key)) {
|
|
if (event.key === "Escape") {
|
|
setDisableSources(prev => {
|
|
const next = new Set(prev)
|
|
next.delete(sourceId)
|
|
return next
|
|
})
|
|
}
|
|
} else {
|
|
event.stopPropagation()
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener("keydown", handleKeyDown, true)
|
|
return () => window.removeEventListener("keydown", handleKeyDown, true)
|
|
}, [disableSources, sourceId, setDisableSources])
|
|
|
|
const disableKeydown = useCallback(
|
|
(disable: boolean) => {
|
|
console.log(`${sourceId} disable:`, disable)
|
|
setDisableSources(prev => {
|
|
const next = new Set(prev)
|
|
if (disable) {
|
|
next.add(sourceId)
|
|
} else {
|
|
next.delete(sourceId)
|
|
}
|
|
return next
|
|
})
|
|
},
|
|
[setDisableSources, sourceId]
|
|
)
|
|
|
|
const isKeyboardDisabled = disableSources.has(sourceId)
|
|
|
|
return { disableKeydown, isKeyboardDisabled }
|
|
}
|