8197de5b39bbf227946f2b4f5644f16a15cfb450
[sdc/sdc-workflow-designer.git] /
1 export class Trigger {
2   constructor(public open: string, public close?: string) {
3     if (!close) {
4       this.close = open;
5     }
6   }
7
8   public isManual() { return this.open === 'manual' || this.close === 'manual'; }
9 }
10
11 const DEFAULT_ALIASES = {
12   hover: ['mouseenter', 'mouseleave']
13 };
14
15 export function parseTriggers(triggers: string, aliases = DEFAULT_ALIASES): Trigger[] {
16   const trimmedTriggers = (triggers || '').trim();
17
18   if (trimmedTriggers.length === 0) {
19     return [];
20   }
21
22   const parsedTriggers = trimmedTriggers.split(/\s+/).map(trigger => trigger.split(':')).map((triggerPair) => {
23     let alias = aliases[triggerPair[0]] || triggerPair;
24     return new Trigger(alias[0], alias[1]);
25   });
26
27   const manualTriggers = parsedTriggers.filter(triggerPair => triggerPair.isManual());
28
29   if (manualTriggers.length > 1) {
30     throw 'Triggers parse error: only one manual trigger is allowed';
31   }
32
33   if (manualTriggers.length === 1 && parsedTriggers.length > 1) {
34     throw 'Triggers parse error: manual trigger can\'t be mixed with other triggers';
35   }
36
37   return parsedTriggers;
38 }
39
40 const noopFn = () => {
41   // TO DO
42 };
43
44 export function listenToTriggers(renderer: any, nativeElement: any, triggers: string, openFn, closeFn, toggleFn) {
45   const parsedTriggers = parseTriggers(triggers);
46   const listeners = [];
47
48   if (parsedTriggers.length === 1 && parsedTriggers[0].isManual()) {
49     return noopFn;
50   }
51
52   parsedTriggers.forEach((trigger: Trigger) => {
53     if (trigger.open === trigger.close) {
54       listeners.push(renderer.listen(nativeElement, trigger.open, toggleFn));
55     } else {
56       listeners.push(
57           renderer.listen(nativeElement, trigger.open, openFn), renderer.listen(nativeElement, trigger.close, closeFn));
58     }
59   });
60
61   return () => { listeners.forEach(unsubscribeFn => unsubscribeFn()); };
62 }