Skip to content

Instantly share code, notes, and snippets.

@danman113
Created May 16, 2023 04:12
Show Gist options
  • Save danman113/9c73e8464c1f7ca71f876c27e76a7394 to your computer and use it in GitHub Desktop.
Save danman113/9c73e8464c1f7ca71f876c27e76a7394 to your computer and use it in GitHub Desktop.
Key Rebind Component
export type KeySet = Set<string>
const KeyListener = ({
defaultText = 'Click Here',
keys,
setKeys
}: { defaultText?: string, keys: KeySet, setKeys: (args: KeySet) => void }) => {
const [prevKeys, setPrevKeys] = useState<KeySet>(new Set())
const [currentKeys, setCurrentKeys] = useState<KeySet>(new Set())
const [listening, setListening] = useState(false)
const prevKeysStr = prevKeys.size <= 0 ? 'Enter Key Combination' : [...prevKeys].join(', ')
const end = () => {
setListening(false)
console.log('Setting keys', prevKeys)
setKeys(prevKeys)
setPrevKeys(new Set())
}
useEffect(() => {
if (currentKeys.size <= 0 && prevKeys.size > 0 && listening) {
end()
}
}, [currentKeys, listening])
return (
<button
onClick={() => {
setCurrentKeys(new Set())
setListening(!listening)
}}
onKeyDown={(e) => {
e.preventDefault()
if (e.key === 'Escape') return end()
setCurrentKeys(prev => new Set([...prev, e.key]))
setPrevKeys(prev => new Set([...prev, e.key]))
}}
onKeyUp={(e) => {
e.preventDefault()
setCurrentKeys(prev => new Set([...prev].filter(k => k !== e.key)))
}}
onBlur={(e) => {
end()
}}
>
{listening ? prevKeysStr : defaultText}
</button>
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment