|
import { noop } from './callbacks.js'; |
|
import { isHTMLElement } from './is.js'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function addEventListener(target, event, handler, options) { |
|
const events = Array.isArray(event) ? event : [event]; |
|
|
|
events.forEach((_event) => target.addEventListener(_event, handler, options)); |
|
|
|
return () => { |
|
events.forEach((_event) => target.removeEventListener(_event, handler, options)); |
|
}; |
|
} |
|
export function addMeltEventListener(target, event, handler, options) { |
|
const events = Array.isArray(event) ? event : [event]; |
|
if (typeof handler === 'function') { |
|
const handlerWithMelt = withMelt((_event) => handler(_event)); |
|
|
|
events.forEach((_event) => target.addEventListener(_event, handlerWithMelt, options)); |
|
|
|
return () => { |
|
events.forEach((_event) => target.removeEventListener(_event, handlerWithMelt, options)); |
|
}; |
|
} |
|
return () => noop(); |
|
} |
|
export function dispatchMeltEvent(originalEvent) { |
|
const node = originalEvent.currentTarget; |
|
if (!isHTMLElement(node)) |
|
return null; |
|
const customMeltEvent = new CustomEvent(`m-${originalEvent.type}`, { |
|
detail: { |
|
originalEvent, |
|
}, |
|
cancelable: true, |
|
}); |
|
node.dispatchEvent(customMeltEvent); |
|
return customMeltEvent; |
|
} |
|
export function withMelt(handler) { |
|
return (event) => { |
|
const customEvent = dispatchMeltEvent(event); |
|
if (customEvent?.defaultPrevented) |
|
return; |
|
return handler(event); |
|
}; |
|
} |
|
|