diff --git a/dist/index.js b/dist/index.js index 14a1d33d..861f64ce 100644 --- a/dist/index.js +++ b/dist/index.js @@ -314,6 +314,22 @@ function createTimestamp() { return (/* @__PURE__ */ new Date()).toISOString(); } + var HandlerManager = class { + handlers = /* @__PURE__ */ new Set(); + // manage + addHandler = (handler) => { + this.handlers.add(handler); + }; + deleteHandler = (handler) => { + this.handlers.delete(handler); + }; + // trigger + trigger = (item) => { + for (const handler of this.handlers) { + handler(item); + } + }; + }; function stringify(data) { return JSON.stringify(data, null, 4); } @@ -531,8 +547,7 @@ storageModel; chatModel; fileModel; - boardHandler = () => { - }; + boardHandlerManager = new HandlerManager(); // paths getBasePath = () => { return this.fileModel.getModelContainerPath("taskModel"); @@ -576,9 +591,9 @@ return boardInfoFileContent; }; updateBoard = (boardInfoFileContent) => { - this.boardHandler(boardInfoFileContent); this.storeBoard(boardInfoFileContent); this.chatModel.sendMessage("", boardInfoFileContent); + this.boardHandlerManager.trigger(boardInfoFileContent); }; storeBoard = (boardInfoFileContent) => { this.fileModel.addFileContent(boardInfoFileContent); @@ -642,16 +657,12 @@ this.storageModel.removeRecursively(taskFilePath); this.storageModel.removeRecursively(taskReferencePath); }; - // other - setBoardHandler = (handler) => { - this.boardHandler = handler; - }; // init constructor(storageModel2, chatModel, fileModel) { this.chatModel = chatModel; this.fileModel = fileModel; this.storageModel = storageModel2; - fileModel.setFileContentHandler(this.handleFileContent); + fileModel.fileContentHandlerManager.addHandler(this.handleFileContent); } // utility static createBoardInfoFileContent = (fileId, name, color) => { @@ -705,8 +716,7 @@ chatModel; storageModel; taskModel; - fileContentHandler = () => { - }; + fileContentHandlerManager = new HandlerManager(); // paths getBasePath = () => { return StorageModel.getPath( @@ -740,7 +750,7 @@ const didStore = this.storeFileContent(fileContent); if (didStore == false) return; this.taskModel.handleFileContent(fileContent); - this.fileContentHandler(fileContent); + this.fileContentHandlerManager.trigger(fileContent); }; // methods addFileContent = (fileContent) => { @@ -788,10 +798,6 @@ ); return fileContent; }; - // other - setFileContentHandler = (handler) => { - this.fileContentHandler = handler; - }; // init constructor(chatModel, storageModel2) { this.chatModel = chatModel; @@ -911,8 +917,7 @@ id; info; color; - chatMessageHandler = () => { - }; + chatMessageHandlerManager = new HandlerManager(); get secondaryChannels() { return this.info.secondaryChannels.sort(localeCompare); } @@ -970,7 +975,7 @@ if (chatMessage.body != "") { const messagePath = this.getMessagePath(chatMessage.id); this.storageModel.writeStringifiable(messagePath, chatMessage); - this.chatMessageHandler(chatMessage); + this.chatMessageHandlerManager.trigger(chatMessage); } this.fileModel.handleStringifiedFileContent(chatMessage.stringifiedFile); }; @@ -1020,10 +1025,6 @@ const dirPath = this.getBasePath(); this.storageModel.removeRecursively(dirPath); }; - // other - setMessageHandler = (handler) => { - this.chatMessageHandler = handler; - }; // load loadInfo = () => { const info = this.storageModel.readStringifiable( @@ -1439,9 +1440,11 @@ // init constructor(taskModel, storageModel2) { this.taskModel = taskModel; - taskModel.setBoardHandler((boardInfoFileContent) => { - this.showBoard(boardInfoFileContent); - }); + taskModel.boardHandlerManager.addHandler( + (boardInfoFileContent) => { + this.showBoard(boardInfoFileContent); + } + ); } }; @@ -1492,7 +1495,7 @@ ); this.messagePageViewModel = new MessagePageViewModel(this); this.settingsPageViewModel = new SettingsPageViewModel(this); - chatModel.setMessageHandler((chatMessage) => { + chatModel.chatMessageHandlerManager.addHandler((chatMessage) => { this.messagePageViewModel.showChatMessage(chatMessage); }); this.loadPageSelection(); diff --git a/src/Model/Chat/chatModel.ts b/src/Model/Chat/chatModel.ts index 3d3272ce..a489db3a 100644 --- a/src/Model/Chat/chatModel.ts +++ b/src/Model/Chat/chatModel.ts @@ -1,14 +1,18 @@ // this file is responsible for managing chats. -import { DATA_VERSION, ValidObject } from "../Utility/typeSafety"; -import FileModel, { FileContent } from "../Files/fileModel"; -import StorageModel, { filePaths } from "../Global/storageModel"; import { + DATA_VERSION, + ValidObject, +} from "../Utility/typeSafety"; +import FileModel, { FileContent } from "../Files/fileModel"; +import { + HandlerManager, createTimestamp, localeCompare, parseValidObject, stringify, } from "../Utility/utility"; +import StorageModel, { filePaths } from "../Global/storageModel"; import { decryptString, encryptString } from "../Utility/crypto"; import ChatListModel from "./chatListModel"; @@ -30,7 +34,7 @@ export default class ChatModel { info: ChatInfo; color: Color; - chatMessageHandler: (chatMessage: ChatMessage) => void = () => {}; + chatMessageHandlerManager: HandlerManager = new HandlerManager(); get secondaryChannels(): string[] { return this.info.secondaryChannels.sort(localeCompare); @@ -104,7 +108,7 @@ export default class ChatModel { if (chatMessage.body != "") { const messagePath: string[] = this.getMessagePath(chatMessage.id); this.storageModel.writeStringifiable(messagePath, chatMessage); - this.chatMessageHandler(chatMessage); + this.chatMessageHandlerManager.trigger(chatMessage); } // file @@ -173,11 +177,6 @@ export default class ChatModel { this.storageModel.removeRecursively(dirPath); }; - // other - setMessageHandler = (handler: (chatMessage: ChatMessage) => void): void => { - this.chatMessageHandler = handler; - }; - // load loadInfo = (): void => { const info: ChatInfo | null = this.storageModel.readStringifiable( diff --git a/src/Model/Files/fileModel.ts b/src/Model/Files/fileModel.ts index b3639668..7076d98e 100644 --- a/src/Model/Files/fileModel.ts +++ b/src/Model/Files/fileModel.ts @@ -1,12 +1,13 @@ // this file is responsible for managing files within chats. import { DATA_VERSION, ValidObject } from "../Utility/typeSafety"; -import StorageModel, { filePaths } from "../Global/storageModel"; import { + HandlerManager, createTimestamp, parseValidObject, stringify, } from "../Utility/utility"; +import StorageModel, { filePaths } from "../Global/storageModel"; import ChatModel from "../Chat/chatModel"; import TaskModel from "./taskModel"; @@ -18,7 +19,7 @@ export default class FileModel { taskModel: TaskModel; - fileContentHandler: (fileContent: FileContent) => void = () => {}; + fileContentHandlerManager: HandlerManager> = new HandlerManager(); // paths getBasePath = (): string[] => { @@ -63,7 +64,7 @@ export default class FileModel { if (didStore == false) return; this.taskModel.handleFileContent(fileContent); - this.fileContentHandler(fileContent); + this.fileContentHandlerManager.trigger(fileContent); }; // methods @@ -133,11 +134,6 @@ export default class FileModel { ); return fileContent; }; - - // other - setFileContentHandler = (handler: (fileContent: FileContent) => void): void => { - this.fileContentHandler = handler; - }; // init constructor(chatModel: ChatModel, storageModel: StorageModel) { diff --git a/src/Model/Files/taskModel.ts b/src/Model/Files/taskModel.ts index 2f443a4e..25327036 100644 --- a/src/Model/Files/taskModel.ts +++ b/src/Model/Files/taskModel.ts @@ -8,6 +8,7 @@ import FileModel, { FileContent } from "./fileModel"; import ChatModel from "../Chat/chatModel"; import { Color } from "../../colors"; +import { HandlerManager } from "../Utility/utility"; import StorageModel from "../Global/storageModel"; import { v4 } from "uuid"; @@ -16,7 +17,8 @@ export default class TaskModel { chatModel: ChatModel; fileModel: FileModel; - boardHandler: (boardInfoFileContent: BoardInfoFileContent) => void = () => {}; + boardHandlerManager: HandlerManager = + new HandlerManager(); // paths getBasePath = (): string[] => { @@ -78,9 +80,9 @@ export default class TaskModel { }; updateBoard = (boardInfoFileContent: BoardInfoFileContent): void => { - this.boardHandler(boardInfoFileContent); this.storeBoard(boardInfoFileContent); this.chatModel.sendMessage("", boardInfoFileContent); + this.boardHandlerManager.trigger(boardInfoFileContent); }; storeBoard = (boardInfoFileContent: BoardInfoFileContent): void => { @@ -163,13 +165,6 @@ export default class TaskModel { this.storageModel.removeRecursively(taskReferencePath); }; - // other - setBoardHandler = ( - handler: (boardInfoFileContent: BoardInfoFileContent) => void - ): void => { - this.boardHandler = handler; - }; - // init constructor( storageModel: StorageModel, @@ -181,7 +176,7 @@ export default class TaskModel { this.storageModel = storageModel; // handlers - fileModel.setFileContentHandler(this.handleFileContent); + fileModel.fileContentHandlerManager.addHandler(this.handleFileContent); } // utility diff --git a/src/Model/Utility/utility.ts b/src/Model/Utility/utility.ts index 8b3a9f5a..37ff00c0 100644 --- a/src/Model/Utility/utility.ts +++ b/src/Model/Utility/utility.ts @@ -5,6 +5,29 @@ export function createTimestamp(): string { return new Date().toISOString(); } +// handlers +export type Handler = (item: T) => void; + +export class HandlerManager { + handlers: Set> = new Set(); + + // manage + addHandler = (handler: Handler): void => { + this.handlers.add(handler); + }; + + deleteHandler = (handler: Handler): void => { + this.handlers.delete(handler); + }; + + // trigger + trigger = (item: T): void => { + for (const handler of this.handlers) { + handler(item); + } + }; +} + // string export function stringify(data: any): string { return JSON.stringify(data, null, 4); diff --git a/src/ViewModel/Chat/chatViewModel.ts b/src/ViewModel/Chat/chatViewModel.ts index 02cbad1b..e9ebab07 100644 --- a/src/ViewModel/Chat/chatViewModel.ts +++ b/src/ViewModel/Chat/chatViewModel.ts @@ -74,7 +74,7 @@ export default class ChatViewModel { this.settingsPageViewModel = new SettingsPageViewModel(this); // handlers - chatModel.setMessageHandler((chatMessage: ChatMessage) => { + chatModel.chatMessageHandlerManager.addHandler((chatMessage: ChatMessage) => { this.messagePageViewModel.showChatMessage(chatMessage); }); diff --git a/src/ViewModel/Pages/taskPageViewModel.ts b/src/ViewModel/Pages/taskPageViewModel.ts index e568787d..3e19c415 100644 --- a/src/ViewModel/Pages/taskPageViewModel.ts +++ b/src/ViewModel/Pages/taskPageViewModel.ts @@ -70,8 +70,10 @@ export default class TaskPageViewModel { this.taskModel = taskModel; // handlers - taskModel.setBoardHandler((boardInfoFileContent: BoardInfoFileContent) => { - this.showBoard(boardInfoFileContent); - }); + taskModel.boardHandlerManager.addHandler( + (boardInfoFileContent: BoardInfoFileContent) => { + this.showBoard(boardInfoFileContent); + } + ); } }