import { EVENT } from '../constants'; export type EventType = string | number | symbol; export type Handler = (args: T) => void; export interface EventManager { on(event: E, handler: Handler): EventManager; off(event: E, handler?: Handler): EventManager; emit(event: E, args?: T): EventManager; } function createEventManager(): EventManager { const eventList = new Map>(); return { on(event: E, handler: Handler) { //eslint-disable-next-line @typescript-eslint/no-unused-expressions eventList.has(event) ? eventList.get(event)?.add(handler) : eventList.set(event, new Set([handler])); return this; }, off(event: E, handler?: Handler) { handler ? eventList.get(event)!.delete(handler) : eventList.delete(event); return this; }, emit(event: E, args: T) { if (process.env.NODE !== 'production') { const currentEv = (event as unknown) as number; if (!eventList.has(event) && currentEv !== EVENT.HIDE_ALL) { console.error( `It seems that the menu you are trying to display is not renderer or you have a menu id mismatch.`, `You used the menu id: ${event}` ); } } eventList.has(event) && eventList.get(event)!.forEach((handler: Handler) => { handler(args); }); return this; }, }; } export const eventManager = createEventManager();