Skip to content

Instantly share code, notes, and snippets.

@mwpastore
Created May 19, 2020 16:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mwpastore/106b109d3c768edbace127631311f71b to your computer and use it in GitHub Desktop.
Save mwpastore/106b109d3c768edbace127631311f71b to your computer and use it in GitHub Desktop.
{{on-key}} modifier for Ember.js
import { modifier } from 'ember-modifier';
import { isArray } from '@ember/array';
import { capitalize } from '@ember/string';
import { isEmpty, isPresent, typeOf } from '@ember/utils';
const { isInteger } = Number;
const parseKeys = arr => arr
.filter(_ => typeOf(_) === 'string')
.map(capitalize);
const parseKeyCodes = arr => arr
.filter(isPresent)
.map(_ => parseInt(_, 10))
.filter(isInteger);
function onKey(element, positional, named) {
const
press = positional.shift(),
callback = positional.shift();
const {
key,
keys,
keyCode,
keyCodes,
...eventListenerOptions
} = named;
const
wantedKeys = new Set(
[positional, [key], keys]
.filter(arr => isArray(arr) && !isEmpty(arr))
.flatMap(parseKeys)
),
wantedKeyCodes = new Set(
[[keyCode], keyCodes]
.filter(arr => isArray(arr) && !isEmpty(arr))
.flatMap(parseKeyCodes)
);
const handler = (event) => {
if (event.isComposing || event.keyCode === 229) {
return;
}
if (wantedKeys.has(event.key) || wantedKeyCodes.has(event.keyCode)) {
callback(event);
}
};
element.addEventListener(`key${press}`, handler, eventListenerOptions);
return () => {
element.removeEventListener(`key${press}`, handler, eventListenerOptions);
};
}
export default modifier(onKey);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment