-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsugar.ts
57 lines (55 loc) · 1.98 KB
/
sugar.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
51
52
53
54
55
56
57
/**
* Executes a callback if a fragment with a specific name is loaded
* @param name - the name of the fragment
* @param callback - the callback to be executed
* @returns - deregister callback function - analogous to removeEventListener
*/
export function onLoaded(
name: string,
callback: CallableFunction,
options?: AddEventListenerOptions | boolean | undefined,
) {
const eventName = 'collage-fragment-loaded';
const cb = ({ detail }: Partial<CustomEvent>) => {
const iframe = document.querySelector(`iframe[name="${detail}"]`);
const fragment = iframe?.closest('collage-fragment');
const fragmentName = fragment?.getAttribute('name');
if (fragmentName === name) {
callback();
}
};
document.addEventListener(eventName, cb, options);
return () => document.removeEventListener(eventName, cb, options);
}
/**
* Executes a callback if the context of this fragment is updated
* @param callback - the callback to be executed
* @returns - deregister callback function - analogous to removeEventListener
*/
export function onUpdated(
callback: CallableFunction,
options?: AddEventListenerOptions | boolean | undefined,
) {
const eventName = 'collage-context-updated';
const cb = ({ detail }: Partial<CustomEvent>) => { callback(detail); };
document.addEventListener(eventName, cb, options);
return () => document.removeEventListener(eventName, cb, options);
}
/**
* Executes a callback if the config of this fragment is updated
* @param callback - the callback to be executed
* @returns - deregister callback function - analogous to removeEventListener
*/
export function onConfigUpdated(
callback: CallableFunction,
options?: AddEventListenerOptions | boolean | undefined,
) {
const eventName = 'collage-context-updated';
const cb = ({ detail }: Partial<CustomEvent>) => {
if (detail.config) {
callback(detail);
}
};
document.addEventListener(eventName, cb, options);
return () => document.removeEventListener(eventName, cb, options);
}