From 92f0d3c662d3fe984b2cf97ed3cc9efb87707cde Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Sat, 20 Jul 2024 04:43:16 +0200 Subject: [PATCH] add chatListModel --- dist/index.js | 18 ++++++++++++- src/Model/chatListModel.ts | 54 ++++++++++++++++++++++++++++++++++++++ src/Model/chatModel.ts | 32 ++++++++++++---------- 3 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 src/Model/chatListModel.ts diff --git a/dist/index.js b/dist/index.js index 05c9162b..3f532b12 100644 --- a/dist/index.js +++ b/dist/index.js @@ -333,9 +333,23 @@ const key = _StorageModel.pathComponentsToKey(...pathComponents); return localStorage.getItem(key); }; - remove = (pathComponents) => { + remove = (pathComponents, shouldInitialize = true) => { const key = _StorageModel.pathComponentsToKey(...pathComponents); localStorage.removeItem(key); + if (shouldInitialize == true) { + this.initializeTree(); + } + }; + removeRecursive = (pathComponentsOfEntityToDelete) => { + a: for (const key of Object.keys(localStorage)) { + const pathComponentsOfCurrentEntity = _StorageModel.keyToPathComponents(key); + for (let i = 0; i < pathComponentsOfEntityToDelete.length; i++) { + if (!pathComponentsOfCurrentEntity[i]) continue a; + if (pathComponentsOfCurrentEntity[i] != pathComponentsOfEntityToDelete[i]) + continue a; + } + this.remove(pathComponentsOfCurrentEntity, false); + } this.initializeTree(); }; list = (pathComponents) => { @@ -363,6 +377,7 @@ } // utility initializeTree = () => { + console.log("initializing tree"); this.storageEntryTree = {}; for (const key of Object.keys(localStorage)) { const components = _StorageModel.keyToPathComponents(key); @@ -405,6 +420,7 @@ previousObjectStatuses: [DATA_VERSION, "history", "object-statuses"], previousObjectFilters: [DATA_VERSION, "history", "object-filters"], // chat etc + chats: [DATA_VERSION, "chat"], chatInfo: (id) => [DATA_VERSION, "chat", id, "info"], chatMessages: (id) => [DATA_VERSION, "chat", id, "messages"], chatObjects: (id) => [DATA_VERSION, "chat", id, "objects"], diff --git a/src/Model/chatListModel.ts b/src/Model/chatListModel.ts new file mode 100644 index 00000000..2d6e048a --- /dev/null +++ b/src/Model/chatListModel.ts @@ -0,0 +1,54 @@ +import StorageModel, { storageKeys } from "./storageModel"; + +import { ChatModel } from "./chatModel"; +import { v4 } from "uuid"; + +export default class ChatListModel { + storageModel: StorageModel; + + // data + chatModels = new Map(); + + // store & add + addChatModel(chatModel: ChatModel) { + this.chatModels.set(chatModel.id, chatModel); + } + + createChat = (primaryChannel: string): void => { + const id: string = v4(); + + const chatModel = new ChatModel(this.storageModel, id); + chatModel.setPrimaryChannel(primaryChannel); + + this.addChatModel(chatModel); + }; + + deleteChat = (chatId: string): void => { + const chat = this.chatModels.get(chatId); + if (!chat) return; + + chat.remove(); + this.untrackChat(chatId); + }; + + untrackChat = (chatId: string): void => { + const chat = this.chatModels.get(chatId); + if (!chat) return; + + this.chatModels.delete(chatId); + }; + + // restore + loadChats = (): void => { + const chatDir = storageKeys.chats; + for (const chatId of chatDir) { + const chatModel = new ChatModel(this.storageModel, chatId); + this.addChatModel(chatModel); + } + }; + + // init + constructor(storageModel: StorageModel) { + this.storageModel = storageModel; + } +} diff --git a/src/Model/chatModel.ts b/src/Model/chatModel.ts index 0ce48473..8a55a48f 100644 --- a/src/Model/chatModel.ts +++ b/src/Model/chatModel.ts @@ -71,6 +71,13 @@ export class ChatModel { this.storageModel.storeStringifiable(objectPath, object); } + // remove + remove = () => { + this.unloadData(); + const dirPath = [...storageKeys.chats, this.id]; + this.storageModel.removeRecursive(dirPath); + } + // restore restoreInfo(): void { const info: any = this.storageModel.restoreStringifiable(this.infoPath); @@ -104,30 +111,27 @@ export class ChatModel { } } + // memory + loadData(): void { + this.restoreMessages(); + this.restoreObjects(); + } + + unloadData(): void { + this.messages.clear(); + this.objects.clear(); + } + // init constructor(storageModel: StorageModel, chatId: string) { this.id = chatId; this.storageModel = storageModel; this.restoreInfo(); - this.restoreMessages(); - this.restoreObjects(); } } // creation methods -export function createChat( - storageModel: StorageModel, - primaryChannel: string -): ChatModel { - const id: string = v4(); - - const chatModel = new ChatModel(storageModel, id); - chatModel.setPrimaryChannel(primaryChannel); - - return chatModel; -} - export function generateChatInfo(primaryChannel: string): ChatInfo { return { primaryChannel,