homebox/frontend/composables/use-events.ts

39 lines
1,023 B
TypeScript
Raw Normal View History

export enum EventTypes {
// ClearStores event is used to inform the stores that _all_ the data they are using
// is now out of date and they should refresh - This is used when the user makes large
// changes to the data such as bulk actions or importing a CSV file
InvalidStores,
}
export type EventFn = () => void;
export interface IEventBus {
on(event: EventTypes, fn: EventFn, key: string): void;
off(event: EventTypes, key: string): void;
emit(event: EventTypes): void;
}
class EventBus implements IEventBus {
private listeners: Record<EventTypes, Record<string, EventFn>> = {
[EventTypes.InvalidStores]: {},
};
on(event: EventTypes, fn: EventFn, key: string): void {
this.listeners[event][key] = fn;
}
off(event: EventTypes, key: string): void {
delete this.listeners[event][key];
}
emit(event: EventTypes): void {
Object.values(this.listeners[event]).forEach(fn => fn());
}
}
const bus = new EventBus();
export function useEventBus(): IEventBus {
return bus;
}