diff --git a/dist/index.js b/dist/index.js index 891b8ef8..d86426a6 100644 --- a/dist/index.js +++ b/dist/index.js @@ -617,21 +617,22 @@ // boards createBoard = (name) => { const boardInfoFileContent = _BoardModel.createBoardInfoFileContent(v4_default(), name, "standard" /* Standard */); - this.updateBoard(boardInfoFileContent); return boardInfoFileContent; }; updateBoard = (boardInfoFileContent) => { this.storeBoard(boardInfoFileContent); - this.chatModel.sendMessage("", boardInfoFileContent); this.boardHandlerManager.trigger(boardInfoFileContent); }; storeBoard = (boardInfoFileContent) => { - this.fileModel.addFileContent(boardInfoFileContent); + this.fileModel.storeFileContent(boardInfoFileContent); const boardDirectoryPath = this.getBoardDirectoryPath( boardInfoFileContent.fileId ); this.storageModel.write(boardDirectoryPath, ""); }; + updateBoardAndSend = (boardInfoFileContent) => { + this.chatModel.sendMessage("", boardInfoFileContent); + }; deleteBoard = (boardId) => { const boardFilePath = this.getBoardFilePath(boardId); const boardDirectoryPath = this.getBoardDirectoryPath(boardId); @@ -661,20 +662,17 @@ }; updateTask = (taskFileContent) => { this.storeTask(taskFileContent); - this.chatModel.sendMessage("", taskFileContent); }; storeTask = (taskFileContent) => { - this.fileModel.addFileContent(taskFileContent); + this.fileModel.storeFileContent(taskFileContent); const taskReferencePath = this.getTaskReferencePath( taskFileContent.boardId, taskFileContent.fileId ); - console.log("storing", taskReferencePath); this.storageModel.write(taskReferencePath, ""); }; listTaskIds = (boardId) => { const taskContainerPath = this.getTaskContainerPath(boardId); - console.log("listing", taskContainerPath); const fileIds = this.storageModel.list(taskContainerPath); return fileIds; }; @@ -783,7 +781,7 @@ this.fileContentHandlerManager.trigger(fileContent); }; // methods - addFileContent = (fileContent) => { + addFileContentAndSend = (fileContent) => { this.handleFileContent(fileContent); this.chatModel.sendMessage("", fileContent); }; @@ -1097,7 +1095,6 @@ this.loadInfo(); this.loadColor(); this.subscribe(); - connectionModel2.setMessageSentHandler(this.handleMessageSent); this.fileModel = new FileModel(this, this.storageModel); } // utility @@ -1162,15 +1159,29 @@ chatModels = /* @__PURE__ */ new Set(); // handlers messageHandler = (data) => { + const channel = data.messageChannel; + const body = data.messageBody; + if (channel == void 0) return; + if (body == void 0) return; + this.routeMessageToCorrectChatModel( + channel, + (chatModel) => chatModel.handleMessage(body) + ); + }; + messageSentHandler = (chatMessage) => { + const channel = chatMessage.channel; + this.routeMessageToCorrectChatModel( + channel, + (chatModel) => chatModel.handleMessageSent(chatMessage) + ); + }; + // methods + routeMessageToCorrectChatModel = (channel, fn) => { + const allChannels = channel.split("/"); for (const chatModel of this.chatModels) { - const channel = data.messageChannel; - const body = data.messageBody; - if (channel == void 0) return; - if (body == void 0) return; - const allChannels = channel.split("/"); for (const channel2 of allChannels) { if (channel2 != chatModel.info.primaryChannel) continue; - chatModel.handleMessage(body); + fn(chatModel); break; } } @@ -1216,7 +1227,10 @@ this.settingsModel = settingsModel2; this.connectionModel = connectionModel2; this.loadChats(); - connectionModel2.setMessageHandler(this.messageHandler); + connectionModel2.messageHandlerManager.addHandler(this.messageHandler); + connectionModel2.messageSentHandlerManager.addHandler( + this.messageSentHandler + ); } }; @@ -1633,22 +1647,17 @@ [this.newBoardNameInput], () => this.newBoardNameInput.value == "" ); - // handlers - handleFileContent = (fileContent) => { - if (checkMatchesObjectStructure(fileContent, BoardInfoFileContentReference) == false) - return; - this.showBoardInList(fileContent); - }; // methods createBoard = () => { if (this.cannotCreateBoard.value == true) return; const boardInfoFileContent = this.boardModel.createBoard(this.newBoardNameInput.value); this.newBoardNameInput.value = ""; this.showBoardInList(boardInfoFileContent); + this.boardModel.updateBoardAndSend(boardInfoFileContent); this.updateIndices(); }; updateBoard = (boardInfoFileContent) => { - this.boardModel.updateBoard(boardInfoFileContent); + this.boardModel.updateBoardAndSend(boardInfoFileContent); this.updateIndices(); }; deleteBoard = (boardInfoFileContent) => { @@ -2033,7 +2042,7 @@ } // src/View/Components/chatMessage.tsx - function ChatMessage(chatMessageViewModel) { + function ChatMessage2(chatMessageViewModel) { const statusIcon = createProxyState( [chatMessageViewModel.status], () => { @@ -2073,7 +2082,7 @@ ); } var ChatMessageViewModelToView = (chatMessageViewModel) => { - return ChatMessage(chatMessageViewModel); + return ChatMessage2(chatMessageViewModel); }; // src/View/ChatPages/messagePage.tsx @@ -2689,20 +2698,17 @@ get address() { return this.udn.ws?.url; } - connectionChangeHandler = () => { - }; - messageHandler = () => { - }; - messageSentHandler = () => { - }; + connectionChangeHandlerManager = new HandlerManager(); + messageHandlerManager = new HandlerManager(); + messageSentHandlerManager = new HandlerManager(); channelsToSubscribe = /* @__PURE__ */ new Set(); // handlers handleMessage = (data) => { - this.messageHandler(data); + this.messageHandlerManager.trigger(data); }; handleConnectionChange = () => { console.log("connection status:", this.isConnected, this.address); - this.connectionChangeHandler(); + this.connectionChangeHandlerManager.trigger(); if (this.isConnected == false) return; if (!this.address) return; this.connectMailbox(); @@ -2732,7 +2738,7 @@ return mailboxFilePath; }; requestNewMailbox = () => { - console.trace("requesting mailbox"); + console.log("requesting mailbox"); this.udn.requestMailbox(); }; connectMailbox = () => { @@ -2807,7 +2813,7 @@ chatMessage.channel, stringifiedBody ); - if (isSent) this.messageSentHandler(chatMessage); + if (isSent) this.messageSentHandlerManager.trigger(chatMessage); return isSent; }; // storage @@ -2841,16 +2847,6 @@ const dirPath = this.getPreviousAddressPath(); return this.storageModel.list(dirPath); } - // other - setConnectionChangeHandler = (handler) => { - this.connectionChangeHandler = handler; - }; - setMessageHandler = (handler) => { - this.messageHandler = handler; - }; - setMessageSentHandler = (handler) => { - this.messageSentHandler = handler; - }; // init constructor(storageModel2) { this.udn = new UDNFrontend(); @@ -2944,7 +2940,9 @@ constructor(connectionModel2) { this.connectionModel = connectionModel2; this.updatePreviousAddresses(); - connectionModel2.setConnectionChangeHandler(this.connectionChangeHandler); + connectionModel2.connectionChangeHandlerManager.addHandler( + this.connectionChangeHandler + ); } }; diff --git a/src/Model/Chat/chatListModel.ts b/src/Model/Chat/chatListModel.ts index bb5c7216..ea8418c6 100644 --- a/src/Model/Chat/chatListModel.ts +++ b/src/Model/Chat/chatListModel.ts @@ -1,6 +1,6 @@ +import ChatModel, { ChatMessage } from "./chatModel"; import StorageModel, { filePaths } from "../Global/storageModel"; -import ChatModel from "./chatModel"; import ConnectionModel from "../Global/connectionModel"; import { Message } from "udn-frontend"; import SettingsModel from "../Global/settingsModel"; @@ -16,16 +16,35 @@ export default class ChatListModel { // handlers messageHandler = (data: Message): void => { - for (const chatModel of this.chatModels) { - const channel: string | undefined = data.messageChannel; - const body: string | undefined = data.messageBody; - if (channel == undefined) return; - if (body == undefined) return; + const channel: string | undefined = data.messageChannel; + const body: string | undefined = data.messageBody; + if (channel == undefined) return; + if (body == undefined) return; - const allChannels = channel.split("/"); + this.routeMessageToCorrectChatModel(channel, (chatModel: ChatModel) => + chatModel.handleMessage(body) + ); + }; + + messageSentHandler = (chatMessage: ChatMessage): void => { + const channel: string = chatMessage.channel; + + this.routeMessageToCorrectChatModel(channel, (chatModel: ChatModel) => + chatModel.handleMessageSent(chatMessage) + ); + }; + + // methods + routeMessageToCorrectChatModel = ( + channel: string, + fn: (chatModel: ChatModel) => void + ): void => { + const allChannels = channel.split("/"); + + for (const chatModel of this.chatModels) { for (const channel of allChannels) { if (channel != chatModel.info.primaryChannel) continue; - chatModel.handleMessage(body); + fn(chatModel); break; } } @@ -83,6 +102,9 @@ export default class ChatListModel { this.connectionModel = connectionModel; this.loadChats(); - connectionModel.setMessageHandler(this.messageHandler); + connectionModel.messageHandlerManager.addHandler(this.messageHandler); + connectionModel.messageSentHandlerManager.addHandler( + this.messageSentHandler + ); } } diff --git a/src/Model/Chat/chatModel.ts b/src/Model/Chat/chatModel.ts index 57f24391..9b079cf7 100644 --- a/src/Model/Chat/chatModel.ts +++ b/src/Model/Chat/chatModel.ts @@ -236,8 +236,6 @@ export default class ChatModel { this.loadColor(); this.subscribe(); - connectionModel.setMessageSentHandler(this.handleMessageSent); - this.fileModel = new FileModel(this, this.storageModel); } diff --git a/src/Model/Files/boardModel.ts b/src/Model/Files/boardModel.ts index 0e85bbdb..6f40fa47 100644 --- a/src/Model/Files/boardModel.ts +++ b/src/Model/Files/boardModel.ts @@ -83,19 +83,17 @@ export default class BoardModel { createBoard = (name: string): BoardInfoFileContent => { const boardInfoFileContent: BoardInfoFileContent = BoardModel.createBoardInfoFileContent(v4(), name, Color.Standard); - this.updateBoard(boardInfoFileContent); return boardInfoFileContent; }; updateBoard = (boardInfoFileContent: BoardInfoFileContent): void => { this.storeBoard(boardInfoFileContent); - this.chatModel.sendMessage("", boardInfoFileContent); this.boardHandlerManager.trigger(boardInfoFileContent); }; storeBoard = (boardInfoFileContent: BoardInfoFileContent): void => { // store info - this.fileModel.addFileContent(boardInfoFileContent); + this.fileModel.storeFileContent(boardInfoFileContent); // add to list const boardDirectoryPath: string[] = this.getBoardDirectoryPath( @@ -104,6 +102,10 @@ export default class BoardModel { this.storageModel.write(boardDirectoryPath, ""); }; + updateBoardAndSend = (boardInfoFileContent: BoardInfoFileContent): void => { + this.chatModel.sendMessage("", boardInfoFileContent); + }; + deleteBoard = (boardId: string): void => { const boardFilePath: string[] = this.getBoardFilePath(boardId); const boardDirectoryPath: string[] = this.getBoardDirectoryPath(boardId); @@ -139,25 +141,22 @@ export default class BoardModel { updateTask = (taskFileContent: TaskFileContent): void => { this.storeTask(taskFileContent); - this.chatModel.sendMessage("", taskFileContent); }; storeTask = (taskFileContent: TaskFileContent): void => { // store info - this.fileModel.addFileContent(taskFileContent); + this.fileModel.storeFileContent(taskFileContent); // add to board const taskReferencePath: string[] = this.getTaskReferencePath( taskFileContent.boardId, taskFileContent.fileId ); - console.log("storing", taskReferencePath); this.storageModel.write(taskReferencePath, ""); }; listTaskIds = (boardId: string): string[] => { const taskContainerPath: string[] = this.getTaskContainerPath(boardId); - console.log("listing", taskContainerPath); const fileIds: string[] = this.storageModel.list(taskContainerPath); return fileIds; }; diff --git a/src/Model/Files/fileModel.ts b/src/Model/Files/fileModel.ts index 213dd16c..ee1e4352 100644 --- a/src/Model/Files/fileModel.ts +++ b/src/Model/Files/fileModel.ts @@ -68,7 +68,7 @@ export default class FileModel { }; // methods - addFileContent = (fileContent: FileContent): void => { + addFileContentAndSend = (fileContent: FileContent): void => { this.handleFileContent(fileContent); this.chatModel.sendMessage("", fileContent); }; diff --git a/src/Model/Global/connectionModel.ts b/src/Model/Global/connectionModel.ts index 8c677f51..3b93f6b7 100644 --- a/src/Model/Global/connectionModel.ts +++ b/src/Model/Global/connectionModel.ts @@ -1,11 +1,10 @@ // this file is responsible for managing UDN connections. import { ChatMessage, ChatMessageReference } from "../Chat/chatModel"; +import { Handler, HandlerManager, stringify } from "../Utility/utility"; import StorageModel, { filePaths } from "./storageModel"; import UDNFrontend, { Message } from "udn-frontend"; -import { stringify } from "../Utility/utility"; - export default class ConnectionModel { udn: UDNFrontend; storageModel: StorageModel; @@ -19,20 +18,20 @@ export default class ConnectionModel { return this.udn.ws?.url; } - connectionChangeHandler: () => void = () => {}; - messageHandler: (data: Message) => void = () => {}; - messageSentHandler: (chatMessage: ChatMessage) => void = () => {}; + connectionChangeHandlerManager: HandlerManager = new HandlerManager(); + messageHandlerManager: HandlerManager = new HandlerManager(); + messageSentHandlerManager: HandlerManager = new HandlerManager(); channelsToSubscribe: Set = new Set(); // handlers handleMessage = (data: Message): void => { - this.messageHandler(data); + this.messageHandlerManager.trigger(data); }; handleConnectionChange = (): void => { console.log("connection status:", this.isConnected, this.address); - this.connectionChangeHandler(); + this.connectionChangeHandlerManager.trigger(); if (this.isConnected == false) return; if (!this.address) return; @@ -70,7 +69,7 @@ export default class ConnectionModel { }; requestNewMailbox = (): void => { - console.trace("requesting mailbox"); + console.log("requesting mailbox"); this.udn.requestMailbox(); }; @@ -167,7 +166,7 @@ export default class ConnectionModel { chatMessage.channel, stringifiedBody ); - if (isSent) this.messageSentHandler(chatMessage); + if (isSent) this.messageSentHandlerManager.trigger(chatMessage); return isSent; }; @@ -210,22 +209,7 @@ export default class ConnectionModel { const dirPath = this.getPreviousAddressPath(); return this.storageModel.list(dirPath); } - - // other - setConnectionChangeHandler = (handler: () => void): void => { - this.connectionChangeHandler = handler; - }; - - setMessageHandler = (handler: (data: Message) => void): void => { - this.messageHandler = handler; - }; - - setMessageSentHandler = ( - handler: (chatMessage: ChatMessage) => void - ): void => { - this.messageSentHandler = handler; - }; - + // init constructor(storageModel: StorageModel) { // create frontend diff --git a/src/ViewModel/Global/connectionViewModel.ts b/src/ViewModel/Global/connectionViewModel.ts index 0f1ea882..5b74efce 100644 --- a/src/ViewModel/Global/connectionViewModel.ts +++ b/src/ViewModel/Global/connectionViewModel.ts @@ -81,6 +81,8 @@ export default class ConnectionViewModel { this.connectionModel = connectionModel; this.updatePreviousAddresses(); - connectionModel.setConnectionChangeHandler(this.connectionChangeHandler); + connectionModel.connectionChangeHandlerManager.addHandler( + this.connectionChangeHandler + ); } } diff --git a/src/ViewModel/Pages/boardViewModel.ts b/src/ViewModel/Pages/boardViewModel.ts index e06f69f3..93ccddbf 100644 --- a/src/ViewModel/Pages/boardViewModel.ts +++ b/src/ViewModel/Pages/boardViewModel.ts @@ -3,11 +3,9 @@ import * as React from "bloatless-react"; import BoardModel, { BoardInfoFileContent, TaskFileContent, - TaskFileContentReference, } from "../../Model/Files/boardModel"; import { Color } from "../../colors"; -import FileModel from "../../Model/Files/fileModel"; import StorageModel from "../../Model/Global/storageModel"; import TaskPageViewModel from "./taskPageViewModel"; import TaskViewModel from "./taskViewModel"; diff --git a/src/ViewModel/Pages/taskPageViewModel.ts b/src/ViewModel/Pages/taskPageViewModel.ts index 8f4cd543..88498490 100644 --- a/src/ViewModel/Pages/taskPageViewModel.ts +++ b/src/ViewModel/Pages/taskPageViewModel.ts @@ -1,16 +1,11 @@ import * as React from "bloatless-react"; -import BoardModel, { - BoardInfoFileContent, - BoardInfoFileContentReference, -} from "../../Model/Files/boardModel"; -import FileModel, { FileContent } from "../../Model/Files/fileModel"; +import BoardModel, { BoardInfoFileContent } from "../../Model/Files/boardModel"; import BoardViewModel from "./boardViewModel"; import ChatViewModel from "../Chat/chatViewModel"; import { IndexManager } from "../../Model/Utility/utility"; import StorageModel from "../../Model/Global/storageModel"; -import { checkMatchesObjectStructure } from "../../Model/Utility/typeSafety"; export default class TaskPageViewModel { storageModel: StorageModel; @@ -51,17 +46,6 @@ export default class TaskPageViewModel { () => this.newBoardNameInput.value == "" ); - // handlers - handleFileContent = (fileContent: FileContent): void => { - if ( - checkMatchesObjectStructure(fileContent, BoardInfoFileContentReference) == - false - ) - return; - const boardInfo: BoardInfoFileContent = fileContent as BoardInfoFileContent; - this.showBoardInList(boardInfo); - }; - // methods createBoard = (): void => { if (this.cannotCreateBoard.value == true) return; @@ -71,11 +55,12 @@ export default class TaskPageViewModel { this.newBoardNameInput.value = ""; this.showBoardInList(boardInfoFileContent); + this.boardModel.updateBoardAndSend(boardInfoFileContent); this.updateIndices(); }; updateBoard = (boardInfoFileContent: BoardInfoFileContent): void => { - this.boardModel.updateBoard(boardInfoFileContent); + this.boardModel.updateBoardAndSend(boardInfoFileContent); this.updateIndices(); }; diff --git a/src/ViewModel/Pages/taskViewModel.ts b/src/ViewModel/Pages/taskViewModel.ts index 9daae9b4..2718868f 100644 --- a/src/ViewModel/Pages/taskViewModel.ts +++ b/src/ViewModel/Pages/taskViewModel.ts @@ -2,7 +2,6 @@ import * as React from "bloatless-react"; import BoardModel, { TaskFileContent, - TaskFileContentReference, } from "../../Model/Files/boardModel"; import BoardViewModel from "./boardViewModel";