/
host-listener.ts
50 lines (45 loc) · 2.06 KB
/
host-listener.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import * as d from '../declarations';
import { BUILD } from '@app-data';
import { doc, plt, supportsListenerOptions, win } from '@platform';
import { HOST_FLAGS, LISTENER_FLAGS } from '@utils';
export const addHostEventListeners = (elm: d.HostElement, hostRef: d.HostRef, listeners: d.ComponentRuntimeHostListener[]) => {
if (BUILD.hostListener && listeners) {
// this is called immediately within the element's constructor
// initialize our event listeners on the host element
// we do this now so that we can listen to events that may
// have fired even before the instance is ready
listeners.map(([flags, name, method]) => {
const target = BUILD.hostListenerTarget ? getHostListenerTarget(elm, flags) : elm;
const handler = hostListenerProxy(hostRef, method);
const opts = hostListenerOpts(flags);
plt.ael(target, name, handler, opts);
(hostRef.$rmListeners$ = hostRef.$rmListeners$ || []).push(() => plt.rel(target, name, handler, opts));
});
}
};
const hostListenerProxy = (hostRef: d.HostRef, methodName: string) => (ev: Event) => {
if (BUILD.lazyLoad) {
if (hostRef.$flags$ & HOST_FLAGS.isListenReady) {
// instance is ready, let's call it's member method for this event
hostRef.$lazyInstance$[methodName](ev);
} else {
(hostRef.$queuedListeners$ = hostRef.$queuedListeners$ || []).push([methodName, ev]);
}
} else {
(hostRef.$hostElement$ as any)[methodName](ev);
}
};
const getHostListenerTarget = (elm: Element, flags: number): EventTarget => {
if (BUILD.hostListenerTargetDocument && flags & LISTENER_FLAGS.TargetDocument) return doc;
if (BUILD.hostListenerTargetWindow && flags & LISTENER_FLAGS.TargetWindow) return win;
if (BUILD.hostListenerTargetBody && flags & LISTENER_FLAGS.TargetBody) return doc.body;
return elm;
};
// prettier-ignore
const hostListenerOpts = (flags: number) =>
supportsListenerOptions
? ({
passive: (flags & LISTENER_FLAGS.Passive) !== 0,
capture: (flags & LISTENER_FLAGS.Capture) !== 0,
})
: (flags & LISTENER_FLAGS.Capture) !== 0;