-
-
Notifications
You must be signed in to change notification settings - Fork 282
/
Copy pathdispatch.ts
34 lines (34 loc) · 953 Bytes
/
dispatch.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
export function dispatch<T extends any = any>(
element: Element,
eventType: string,
detail?: T,
eventInit: EventInit = { bubbles: true },
/** This is an internal thing used by SMUI to duplicate some SMUI events as MDC events. */
duplicateEventForMDC = false,
) {
if (typeof Event === 'undefined') {
throw new Error('Event not defined.');
}
if (!element) {
throw new Error('Tried to dipatch event without element.');
}
const event: CustomEvent<T> = new CustomEvent(eventType, {
...eventInit,
detail,
});
element?.dispatchEvent(event);
if (duplicateEventForMDC && eventType.startsWith('SMUI')) {
const duplicateEvent: CustomEvent<T> = new CustomEvent(
eventType.replace(/^SMUI/g, () => 'MDC'),
{
...eventInit,
detail,
},
);
element?.dispatchEvent(duplicateEvent);
if (duplicateEvent.defaultPrevented) {
event.preventDefault();
}
}
return event;
}