This package is meant for dispatching events between modules (siblings) and cross instances (parent|adjunct)
Base on the native node/web js event system, but the dispatcher is
async
for easier handling ofcancelable
events.NOTE that creating a
cancelable
event without awaiting resolution, will not respect thepreventDefault
behavior!
const configurator = (config) => {
/** disable propagation of all events */
delete config.event.onBubble
/** pre-handle all events before dispatch */
config.event.onDispatch = (e: FrameworkEvent) => {
if(!allow_event(e)){
e.preventDefault();
}
}
}
import { ModuleEvent } from '@equinor/fusion-framework-module-event';
/** declare event type for code completion */
declare module '@equinor/fusion-framework-module-event' {
interface ModuleEventMap {
'someEvent': FrameworkEvent<FrameworkEventInit<MyDataObject, MySource>>;
}
}
import { ModuleEvent } from '@equinor/fusion-framework-module-event';
type CustomFrameworkEventInit = FrameworkEventInit<MyDataObject, MySource>;
class MyCustomEvent extends FrameworkEvent<CustomFrameworkEventInit, 'myCustomEvent'> {
constructor(init: CustomFrameworkEventInit) { /** logic */ }
}
/** declare event type for code completion */
declare module '@equinor/fusion-framework-module-event' {
interface ModuleEventMap {
'myCustomEvent': MyCustomEvent;
}
}
const teardown = modules.event.addEventListener('someEvent', (event) => console.log(event));
// remove event listener
teardown();
// simple
const event = await modules.event.dispatchEvent(
'myEvent',
{
detail: 'some detail',
canBubble: false,
cancelable: true
}
);
// alternative
const event = new MyCustomFrameworkEvent(
'myCustomEvent',
{
detail: 'some detail',
canBubble: false,
cancelable: true
}
);
await modules.event.dispatchEvent(myEvent);
if(!event.defaultPrevent){
doSomeAction();
}
note that when subscribing to events, it does not allow side-effects, like
preventDefault
andstopPropagation
const subscription = modules.event.subscribe(console.log);
subscription.add(
modules.event.subscribe({
next: (event) => console.log(event),
error: (err) => console.error(err),
complete: () => 'event provider disposed'
})
);
// when unmount
subscription.unsubscribe();