Skip to content

Instantly share code, notes, and snippets.

@disgusting-dev
Last active September 6, 2023 09:49
Show Gist options
  • Select an option

  • Save disgusting-dev/8d45aebff8a536af1cba39b0fcd203e3 to your computer and use it in GitHub Desktop.

Select an option

Save disgusting-dev/8d45aebff8a536af1cba39b0fcd203e3 to your computer and use it in GitHub Desktop.
const isTouch =
typeof window !== 'undefined'
&& ('ontouchstart' in window || navigator.msMaxTouchPoints > 0);
const events = isTouch
? ['touchstart', 'click']
: ['click'];
function onClickOutside({ event, el, handler }) {
const isClickOutside =
event.target !== el
&& !el.contains(event.target);
return isClickOutside ? handler(event, el) : null;
}
const instances = new Map();
function bind(el, { value: handler }) {
const eventHandler = event => onClickOutside({ el, event, handler});
toggleEventListeners('add', eventHandler);
instances.set(
el,
eventHandler
);
}
function update(el) {
const eventHandler = instances.get(el);
toggleEventListeners('remove', eventHandler);
toggleEventListeners('add', eventHandler);
}
function unbind(el) {
const eventHandler = instances.get(el);
toggleEventListeners('remove', eventHandler);
}
function processArgs(value) {
}
function toggleEventListeners(action, eventHandler) {
document[`${action}EventListener`]('click', eventHandler);
}
function eventAdapter(events) {
return events.map((eventName) => ({
event: eventName,
handler: (event) => onEvent({ event, el, handler, middleware })
}));
}
const directive = {
bind,
update,
unbind,
};
export default directive;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment