Skip to content

Instantly share code, notes, and snippets.

@marcelblijleven
Created April 5, 2023 07:49
Show Gist options
  • Save marcelblijleven/b4f5d2cd7331ef51f6f14d7d97072458 to your computer and use it in GitHub Desktop.
Save marcelblijleven/b4f5d2cd7331ef51f6f14d7d97072458 to your computer and use it in GitHub Desktop.
Imanok
import { useCallback, useEffect, useState } from 'react';
const Imanok = ({ callback }) => {
const expected = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];
const [keys, setKeys] = useState([]);
const onKeyDown = useCallback(
event => {
const newKeys = [...keys];
newKeys.push(event.keyCode);
setKeys(newKeys);
},
[keys]
);
const onKeyUp = useCallback(
event => {
const index = keys.lastIndexOf(event.keyCode);
if (keys[index] !== expected[index]) {
setKeys([]);
}
if (keys.length === expected.length) {
if (keys.every((value, idx) => value === expected[idx])) {
setKeys([]);
callback();
}
}
},
[keys]
);
useEffect(() => {
document.addEventListener('keydown', onKeyDown, false);
document.addEventListener('keyup', onKeyUp, false);
return () => {
document.removeEventListener('keydown', onKeyDown, false);
document.removeEventListener('keyup', onKeyUp, false);
};
}, [onKeyDown, onKeyUp]);
return null;
};
export default Imanok;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment