fchat-rising/chat/preview/event-bus.ts

98 lines
2.7 KiB
TypeScript
Raw Normal View History

2021-01-20 20:52:33 +00:00
// import Vue from 'vue';
import _ from 'lodash';
2021-02-03 01:55:10 +00:00
// import log from 'electron-log'; //tslint:disable-line:match-default-export-name
2020-03-15 16:23:39 +00:00
import { Character } from '../../site/character_page/interfaces';
import { Message } from '../common';
import { Conversation } from '../interfaces';
2019-07-07 01:37:15 +00:00
import ChannelConversation = Conversation.ChannelConversation;
2021-02-03 01:55:10 +00:00
2020-11-27 06:12:47 +00:00
import { NoteCheckerCount } from '../../site/note-checker';
2019-07-07 01:37:15 +00:00
/**
* 'imagepreview-dismiss': {url: string}
* 'imagepreview-show': {url: string}
* 'imagepreview-toggle-stickyness': {url: string}
* 'character-data': {character: Character}
* 'character-score': {character: Character, score: number, isFiltered: boolean}
2019-07-07 01:37:15 +00:00
* 'private-message': {message: Message}
* 'channel-ad': {message: Message, channel: Conversation, profile: ComplexCharacter | undefined}
2019-07-07 01:37:15 +00:00
* 'channel-message': {message: Message, channel: Conversation}
* 'select-conversation': { conversation: Conversation }
2023-03-12 05:43:58 +00:00
* 'note-counts-update': {},
* 'character-memo': { character: string, memo: CharacterMemo }
2019-07-07 01:37:15 +00:00
*/
2019-07-06 16:49:19 +00:00
export interface EventBusEvent {
// tslint:disable: no-any
[key: string]: any;
}
2019-07-07 01:37:15 +00:00
export interface ChannelMessageEvent extends EventBusEvent {
message: Message;
channel: ChannelConversation;
}
// tslint:disable-next-line no-empty-interface
export interface ChannelAdEvent extends ChannelMessageEvent {}
export interface CharacterDataEvent {
character: Character;
}
export interface SelectConversationEvent extends EventBusEvent {
2022-08-13 01:38:13 +00:00
conversation: Conversation | null;
}
2021-01-20 20:52:33 +00:00
export type EventCallback = (data: any) => void | Promise<void>;
2020-11-27 06:12:47 +00:00
// tslint:disable-next-line no-empty-interface
export interface NoteCountsUpdate extends EventBusEvent, NoteCheckerCount {}
2021-01-20 20:52:33 +00:00
class EventBusManager {
private eventCallbacks: Record<string, EventCallback[]> = {};
$on(eventName: string, callback: EventCallback): void {
this.$off(eventName, callback);
if (!(eventName in this.eventCallbacks)) {
this.eventCallbacks[eventName] = [];
}
this.eventCallbacks[eventName].push(callback);
}
$off(eventName: string, callback: EventCallback): void {
if (!(eventName in this.eventCallbacks)) {
return;
}
this.eventCallbacks[eventName] = _.filter(
this.eventCallbacks[eventName],
(cb) => (cb !== callback)
);
}
$emit(eventName: string, eventData: EventBusEvent): void {
2021-02-03 01:55:10 +00:00
// const d = Date.now();
2021-01-20 20:52:33 +00:00
_.each(this.eventCallbacks[eventName] || [], (cb) => (cb(eventData)));
2021-02-03 01:55:10 +00:00
// log.silly('event.bus.emit', { eventName, eventData, time: (Date.now() - d) / 1000 });
2021-01-20 20:52:33 +00:00
}
clear(): void {
this.eventCallbacks = {};
}
2021-01-20 20:52:33 +00:00
}
2020-11-27 06:12:47 +00:00
2021-01-20 20:52:33 +00:00
export const EventBus = new EventBusManager();
// export const EventBus = new Vue();
2019-06-08 02:26:01 +00:00