UNPKG

@cran/vue.use

Version:

Cranberry Vue Use Utilities

39 lines (38 loc) 1.41 kB
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; }