@stackoverfloweth/vue-compositions
Version:
A collection of reusable vue compositions.
40 lines • 1.35 kB
JavaScript
import { computed, reactive, unref } from 'vue';
import { asArray } from '../utilities/arrays';
import { tryOnScopeDispose } from '../utilities/tryOnScopeDispose';
function useKeyDownFactory() {
const downKeys = reactive(new Set());
const callbacks = new Set();
function keyDownCallback(event) {
downKeys.add(event.key);
callbacks.forEach(callback => callback(event));
}
function keyUpCallback(event) {
downKeys.delete(event.key);
}
document.addEventListener('keydown', keyDownCallback);
document.addEventListener('keyup', keyUpCallback);
return (...[key, callback]) => {
const keys = computed(() => asArray(unref(key)));
const down = computed(() => keys.value.some(key => downKeys.has(key)));
const filteredCallback = (event) => {
if (keys.value.includes(event.key)) {
callback?.(event);
}
};
const connect = () => {
callbacks.add(filteredCallback);
};
const disconnect = () => {
callbacks.delete(filteredCallback);
};
connect();
tryOnScopeDispose(disconnect);
return {
down,
connect,
disconnect,
};
};
}
export const useKeyDown = useKeyDownFactory();
//# sourceMappingURL=useKeyDown.js.map