2024-07-20 04:17:10 +02:00
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
2024-07-20 16:34:16 +02:00
|
|
|
import StorageModel, { storageKeys } from "../Model/storageModel";
|
|
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
import ChatListViewModel from "./chatListViewModel";
|
2024-07-20 04:17:10 +02:00
|
|
|
import { ChatModel } from "../Model/chatModel";
|
|
|
|
|
|
|
|
|
|
export default class ChatViewModel {
|
2024-07-20 14:16:26 +02:00
|
|
|
chatModel: ChatModel;
|
|
|
|
|
chatListViewModel: ChatListViewModel;
|
2024-07-20 16:34:16 +02:00
|
|
|
storageModel: StorageModel;
|
2024-07-20 04:17:10 +02:00
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
// state
|
2024-07-20 16:49:01 +02:00
|
|
|
index: React.State<number> = new React.State(0);
|
|
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
primaryChannel: React.State<string> = new React.State("");
|
|
|
|
|
primaryChannelInput: React.State<string> = new React.State("");
|
|
|
|
|
|
2024-07-20 16:28:00 +02:00
|
|
|
selectedPage: React.State<ChatPageType> = new React.State<ChatPageType>(
|
|
|
|
|
ChatPageType.Messages
|
|
|
|
|
);
|
|
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
// guards
|
|
|
|
|
cannotSetPrimaryChannel: React.State<boolean> = React.createProxyState(
|
|
|
|
|
[this.primaryChannel, this.primaryChannelInput],
|
|
|
|
|
() =>
|
|
|
|
|
this.primaryChannelInput.value == "" ||
|
|
|
|
|
this.primaryChannelInput.value == this.primaryChannel.value
|
|
|
|
|
);
|
|
|
|
|
|
2024-07-20 16:49:01 +02:00
|
|
|
// sorting
|
|
|
|
|
updateIndex = (): void => {
|
|
|
|
|
const index = this.chatListViewModel.getIndexOfChat(this);
|
|
|
|
|
this.index.value = index;
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
// methods
|
2024-07-20 16:34:16 +02:00
|
|
|
open = (): void => {
|
2024-07-20 14:16:26 +02:00
|
|
|
this.chatListViewModel.openChat(this);
|
2024-07-20 16:28:00 +02:00
|
|
|
};
|
2024-07-20 14:16:26 +02:00
|
|
|
|
2024-07-20 16:34:16 +02:00
|
|
|
close = (): void => {
|
2024-07-20 15:49:58 +02:00
|
|
|
this.chatListViewModel.closeChat();
|
2024-07-20 16:28:00 +02:00
|
|
|
};
|
2024-07-20 15:49:58 +02:00
|
|
|
|
2024-07-20 16:34:16 +02:00
|
|
|
// restore
|
|
|
|
|
restorePageSelection = (): void => {
|
|
|
|
|
const path: string[] = storageKeys.chatLastUsedPage(this.chatModel.id);
|
|
|
|
|
const lastUsedPage: string | null = this.storageModel.restore(path);
|
|
|
|
|
if (lastUsedPage != null) {
|
|
|
|
|
this.selectedPage.value = lastUsedPage as any;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.selectedPage.subscribeSilent((newPage) => {
|
|
|
|
|
this.storageModel.store(path, newPage);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-20 14:16:26 +02:00
|
|
|
// init
|
|
|
|
|
constructor(chatListViewModel: ChatListViewModel, chatModel: ChatModel) {
|
|
|
|
|
this.chatModel = chatModel;
|
2024-07-20 16:34:16 +02:00
|
|
|
this.storageModel = chatModel.storageModel;
|
2024-07-20 14:16:26 +02:00
|
|
|
this.chatListViewModel = chatListViewModel;
|
|
|
|
|
|
|
|
|
|
this.primaryChannel.value = chatModel.info.primaryChannel;
|
|
|
|
|
this.primaryChannelInput.value = chatModel.info.primaryChannel;
|
2024-07-20 16:34:16 +02:00
|
|
|
|
|
|
|
|
this.restorePageSelection();
|
2024-07-20 16:49:01 +02:00
|
|
|
this.updateIndex();
|
2024-07-20 14:16:26 +02:00
|
|
|
}
|
|
|
|
|
}
|
2024-07-20 16:28:00 +02:00
|
|
|
|
|
|
|
|
// types
|
|
|
|
|
export enum ChatPageType {
|
2024-07-20 16:34:16 +02:00
|
|
|
Settings = "settings",
|
|
|
|
|
Messages = "messages",
|
|
|
|
|
AllObjects = "all",
|
|
|
|
|
Kanban = "kanban",
|
|
|
|
|
Calendar = "calendar",
|
|
|
|
|
Progress = "progress",
|
2024-07-20 16:28:00 +02:00
|
|
|
}
|