mirror of
https://github.com/meshtastic/web.git
synced 2026-04-19 13:27:33 -04:00
* fixed tsc errors * fixed tsc errors * fixed tsc errors * fixing tsc errors * fixing more tsc errors * fixing more tsc errors * fixed tsc errors * fixing tsc errors * fixing PR issues * commented out tsc check * completing tsc fixes * updating lockfile * removed react-hooks
55 lines
1.3 KiB
TypeScript
55 lines
1.3 KiB
TypeScript
export type EventMap = {
|
|
"dialog:unsafeRoles": {
|
|
action: "confirm" | "dismiss";
|
|
};
|
|
};
|
|
|
|
export type EventName = keyof EventMap;
|
|
export type EventCallback<T extends EventName> = (data: EventMap[T]) => void;
|
|
|
|
class EventBus {
|
|
private listeners: { [K in EventName]?: Array<EventCallback<K>> } = {};
|
|
|
|
public on<T extends EventName>(
|
|
event: T,
|
|
callback: EventCallback<T>,
|
|
): () => void {
|
|
if (!this.listeners[event]) {
|
|
this.listeners[event] = [];
|
|
}
|
|
|
|
this.listeners[event]?.push(callback);
|
|
|
|
return () => {
|
|
this.off(event, callback);
|
|
};
|
|
}
|
|
|
|
public off<T extends EventName>(event: T, callback: EventCallback<T>): void {
|
|
if (!this.listeners[event]) return;
|
|
|
|
const callbackIndex = this.listeners[event]?.indexOf(callback);
|
|
if (callbackIndex !== undefined && callbackIndex > -1) {
|
|
this.listeners[event]?.splice(callbackIndex, 1);
|
|
}
|
|
}
|
|
|
|
public offAll<T extends EventName>(event?: T): void {
|
|
if (event) {
|
|
this.listeners[event] = [];
|
|
} else {
|
|
this.listeners = {};
|
|
}
|
|
}
|
|
|
|
public emit<T extends EventName>(event: T, data: EventMap[T]): void {
|
|
if (!this.listeners[event]) return;
|
|
|
|
this.listeners[event]?.forEach((callback) => {
|
|
callback(data);
|
|
});
|
|
}
|
|
}
|
|
|
|
export const eventBus = new EventBus();
|