@cran/vue.use
Version:
Cranberry Vue Use Utilities
39 lines (38 loc) • 1.41 kB
JavaScript
import { eager } from "@cran/vue.ref";
import { useEventListener } from "./useEventListener";
import { ref, unref } from "@vue/runtime-dom";
function trim(value) { return value.trim(); }
export function useKeys(target = window) {
const keys = Object.create(null);
function update(e, value) {
const code = e.code.toLowerCase();
if (code in keys) {
keys[code].value = value;
}
}
useEventListener(target, "keydown", function onKeydown(e) { update(e, true); }, { capture: true, });
useEventListener(target, "keyup", function onKeydown(e) { update(e, false); }, { capture: true, });
const proxy = new Proxy(keys, {
get(_target, property) {
if ("symbol" === typeof property) {
return undefined;
}
const prop = property.toLowerCase();
if (!(prop in keys)) {
if (-1 < prop.indexOf("+")) {
const split = prop.split("+").map(trim);
keys[prop] = eager(function checkKeys() {
return split.every(function checkKey(key) {
return unref(proxy[key]);
});
});
}
else {
keys[prop] = ref(false);
}
}
return keys[prop];
},
});
return proxy;
}