UNPKG

4.27 kBJavaScriptView Raw
1import { Trigger } from './trigger.class';
2const DEFAULT_ALIASES = {
3 hover: ['mouseover', 'mouseout'],
4 focus: ['focusin', 'focusout']
5};
6// eslint-disable-next-line @typescript-eslint/no-explicit-any
7export function parseTriggers(triggers, aliases = DEFAULT_ALIASES) {
8 const trimmedTriggers = (triggers || '').trim();
9 if (trimmedTriggers.length === 0) {
10 return [];
11 }
12 const parsedTriggers = trimmedTriggers
13 .split(/\s+/)
14 .map((trigger) => trigger.split(':'))
15 .map((triggerPair) => {
16 const alias = aliases[triggerPair[0]] || triggerPair;
17 return new Trigger(alias[0], alias[1]);
18 });
19 const manualTriggers = parsedTriggers.filter((triggerPair) => triggerPair.isManual());
20 if (manualTriggers.length > 1) {
21 throw new Error('Triggers parse error: only one manual trigger is allowed');
22 }
23 if (manualTriggers.length === 1 && parsedTriggers.length > 1) {
24 throw new Error('Triggers parse error: manual trigger can\'t be mixed with other triggers');
25 }
26 return parsedTriggers;
27}
28export function listenToTriggers(renderer,
29// eslint-disable-next-line @typescript-eslint/no-explicit-any
30target, triggers, showFn, hideFn, toggleFn) {
31 const parsedTriggers = parseTriggers(triggers);
32 const listeners = [];
33 if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
34 return Function.prototype;
35 }
36 parsedTriggers.forEach((trigger) => {
37 if (trigger.open === trigger.close) {
38 listeners.push(renderer.listen(target, trigger.open, toggleFn));
39 return;
40 }
41 listeners.push(renderer.listen(target, trigger.open, showFn));
42 if (trigger.close) {
43 listeners.push(renderer.listen(target, trigger.close, hideFn));
44 }
45 });
46 return () => {
47 listeners.forEach((unsubscribeFn) => unsubscribeFn());
48 };
49}
50export function listenToTriggersV2(renderer, options) {
51 const parsedTriggers = parseTriggers(options.triggers);
52 const target = options.target;
53 // do nothing
54 if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
55 return Function.prototype;
56 }
57 // all listeners
58 const listeners = [];
59 // lazy listeners registration
60 const _registerHide = [];
61 const registerHide = () => {
62 // add hide listeners to unregister array
63 _registerHide.forEach((fn) => listeners.push(fn()));
64 // register hide events only once
65 _registerHide.length = 0;
66 };
67 // register open\close\toggle listeners
68 parsedTriggers.forEach((trigger) => {
69 const useToggle = trigger.open === trigger.close;
70 const showFn = useToggle ? options.toggle : options.show;
71 if (!useToggle && trigger.close && options.hide) {
72 const _hide = renderer.listen(target, trigger.close, options.hide);
73 _registerHide.push(() => _hide);
74 }
75 if (showFn) {
76 listeners.push(renderer.listen(target, trigger.open, () => showFn(registerHide)));
77 }
78 });
79 return () => {
80 listeners.forEach((unsubscribeFn) => unsubscribeFn());
81 };
82}
83export function registerOutsideClick(renderer, options) {
84 if (!options.outsideClick) {
85 return Function.prototype;
86 }
87 // eslint-disable-next-line @typescript-eslint/no-explicit-any
88 return renderer.listen('document', 'click', (event) => {
89 if (options.target && options.target.contains(event.target)) {
90 return;
91 }
92 if (options.targets &&
93 options.targets.some(target => target.contains(event.target))) {
94 return;
95 }
96 if (options.hide) {
97 options.hide();
98 }
99 });
100}
101export function registerEscClick(renderer, options) {
102 if (!options.outsideEsc) {
103 return Function.prototype;
104 }
105 return renderer.listen('document', 'keyup.esc', (event) => {
106 if (options.target && options.target.contains(event.target)) {
107 return;
108 }
109 if (options.targets &&
110 options.targets.some(target => target.contains(event.target))) {
111 return;
112 }
113 if (options.hide) {
114 options.hide();
115 }
116 });
117}
118//# sourceMappingURL=triggers.js.map
\No newline at end of file