@dark-engine/platform-server
Version:
Dark renderer for server
68 lines (67 loc) • 2.28 kB
JavaScript
import { detectIsFunction, detectIsUndefined, $$scope, detectIsArray } from '@dark-engine/core';
import { PREVENT } from '../constants';
class SyntheticEvent {
type = '';
sourceEvent = null;
target = null;
propagation = true;
constructor(options) {
this.type = options.sourceEvent.type;
this.sourceEvent = options.sourceEvent;
this.target = options.target;
}
stopPropagation() {
this.propagation = false;
this.sourceEvent.stopPropagation();
}
preventDefault() {
this.sourceEvent.preventDefault();
}
getPropagation() {
return this.propagation;
}
}
function delegateEvent(target, eventName, handler) {
const $scope = $$scope();
const eventsMap = $scope.getEvents();
const handlersMap = eventsMap.get(eventName);
const $handler = detectIsArray(handler) ? e => handler[0](...handler.slice(1), e) : handler;
if (!handlersMap) {
const rootHandler = event => {
const handler = eventsMap.get(eventName).get(event.target);
const target = event.target;
let $event = null;
target[PREVENT] && event.preventDefault();
if (detectIsFunction(handler)) {
$event = new SyntheticEvent({ sourceEvent: event, target });
$scope.setIsEvent(true);
exec($event, handler);
$scope.setIsEvent(false);
}
if (target.parentElement) {
const shouldPropagate = $event ? $event.getPropagation() : true;
if (shouldPropagate) {
target.parentElement.dispatchEvent(new event.constructor(event.type, event));
}
}
};
eventsMap.set(eventName, new WeakMap([[target, $handler]]));
document.addEventListener(eventName, rootHandler, true);
$scope.addOff(() => document.removeEventListener(eventName, rootHandler, true));
} else {
handlersMap.set(target, $handler);
}
}
function exec(event, handler) {
const arg = handler(event);
if (detectIsUndefined(arg)) return;
switch (event.type) {
case 'input':
event.target.value = String(arg);
break;
}
}
const detectIsEvent = attrName => attrName.startsWith('on');
const getEventName = attrName => attrName.slice(2, attrName.length).toLowerCase();
export { SyntheticEvent, delegateEvent, detectIsEvent, getEventName };
//# sourceMappingURL=events.js.map