2024-07-22 21:07:44 +02:00
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
|
|
|
|
import { ChatMessage } from "../../Model/Chat/chatModel";
|
|
|
|
|
import ChatMessageViewModel from "../Chat/chatMessageViewModel";
|
|
|
|
|
import ChatViewModel from "../Chat/chatViewModel";
|
2024-07-25 16:02:49 +02:00
|
|
|
import CoreViewModel from "../Global/coreViewModel";
|
2024-07-22 21:07:44 +02:00
|
|
|
|
|
|
|
|
export default class MessagePageViewModel {
|
2026-04-01 08:29:39 +00:00
|
|
|
chatViewModel: ChatViewModel;
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// state
|
|
|
|
|
chatMessageViewModels: React.MapState<ChatMessageViewModel> =
|
|
|
|
|
new React.MapState();
|
|
|
|
|
composingMessage: React.State<string> = new React.State("");
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// guards
|
|
|
|
|
cannotSendMessage: React.State<boolean>;
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// methods
|
|
|
|
|
sendMessage = (): void => {
|
|
|
|
|
if (this.cannotSendMessage.value == true) return;
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
this.sendMessageFromBody(this.composingMessage.value);
|
|
|
|
|
this.composingMessage.value = "";
|
|
|
|
|
};
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
sendMessageFromBody = (body: string): void => {
|
|
|
|
|
this.chatViewModel.chatModel.sendMessage(body);
|
|
|
|
|
};
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
decryptMessage = async (
|
|
|
|
|
messageViewModel: ChatMessageViewModel,
|
|
|
|
|
): Promise<void> => {
|
|
|
|
|
const chatMessage: ChatMessage = messageViewModel.chatMessage;
|
|
|
|
|
await this.chatViewModel.chatModel.decryptMessage(chatMessage);
|
|
|
|
|
this.chatViewModel.chatModel.addMessage(chatMessage);
|
|
|
|
|
messageViewModel.loadData();
|
|
|
|
|
};
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// view
|
|
|
|
|
showChatMessage = (chatMessage: ChatMessage): void => {
|
|
|
|
|
const chatMessageViewModel = new ChatMessageViewModel(
|
|
|
|
|
this.coreViewModel,
|
|
|
|
|
this,
|
|
|
|
|
chatMessage,
|
|
|
|
|
chatMessage.sender ==
|
|
|
|
|
this.chatViewModel.settingsViewModel.username.value,
|
|
|
|
|
);
|
2024-07-23 00:25:28 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
const existingChatMessageViewModel: ChatMessageViewModel | undefined =
|
|
|
|
|
this.chatMessageViewModels.value.get(chatMessage.id);
|
|
|
|
|
if (existingChatMessageViewModel != undefined) {
|
|
|
|
|
existingChatMessageViewModel.body.value = chatMessage.body;
|
|
|
|
|
existingChatMessageViewModel.status.value = chatMessage.status;
|
|
|
|
|
} else {
|
|
|
|
|
this.chatMessageViewModels.set(
|
|
|
|
|
chatMessage.id,
|
|
|
|
|
chatMessageViewModel,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
2024-07-23 00:25:28 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// load
|
|
|
|
|
loadData = (): void => {
|
|
|
|
|
this.chatMessageViewModels.clear();
|
|
|
|
|
for (const chatMessage of this.chatViewModel.chatModel.messages) {
|
|
|
|
|
this.showChatMessage(chatMessage);
|
|
|
|
|
}
|
|
|
|
|
};
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
// init
|
|
|
|
|
constructor(
|
|
|
|
|
public coreViewModel: CoreViewModel,
|
|
|
|
|
chatViewModel: ChatViewModel,
|
|
|
|
|
) {
|
|
|
|
|
this.chatViewModel = chatViewModel;
|
2024-07-25 16:02:49 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
this.cannotSendMessage = React.createProxyState(
|
|
|
|
|
[
|
|
|
|
|
this.chatViewModel.settingsViewModel.username,
|
|
|
|
|
this.composingMessage,
|
|
|
|
|
],
|
|
|
|
|
() =>
|
|
|
|
|
this.chatViewModel.settingsViewModel.username.value == "" ||
|
|
|
|
|
this.composingMessage.value == "",
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-07-22 21:07:44 +02:00
|
|
|
}
|