import "./messagePage.css"; import { ViewController } from "../viewController"; import { CommonKeys, getKeySymbol } from "../keystrokes"; import { MessageFilterModal } from "../Modals/messageFilterModal"; import { ReplyPreview } from "../Components/replyPreview"; import { ChatMessage } from "../Components/chatMessage"; import * as React from "../../react"; import MessagePageViewModel from "../../ViewModel/Pages/messagePageViewModel"; import CoreViewModel from "../../ViewModel/Global/coreViewModel"; import ChatMessageViewModel from "../../ViewModel/Chat/chatMessageViewModel"; export function MessagePage( coreViewModel: CoreViewModel, messagePageViewModel: MessagePageViewModel, ) { messagePageViewModel.loadData(); const ChatMessageViewModelToView: React.StateItemConverter< ChatMessageViewModel > = (chatMessageViewModel: ChatMessageViewModel) => { return ChatMessage(coreViewModel, chatMessageViewModel); }; const messageContainer = (
); const persistenceId = messagePageViewModel.chatViewModel.chatModel.id; const replyPreview = ViewController.inlineReplies.setState( persistenceId, () => React.createProxyState( [messagePageViewModel.replyingMessage], () => { if (messagePageViewModel.replyingMessage.value == undefined) return
; return ReplyPreview( coreViewModel, messagePageViewModel.replyingMessage.value, ); }, ), ); function scrollDown(hard: boolean = false) { if (hard) { messageContainer.setAttribute("scroll-hard", ""); } messageContainer.scrollTop = messageContainer.scrollHeight; messageContainer.removeAttribute("scroll-hard"); } function scrollDownIfApplicable() { const scrollFromBottom = messageContainer.scrollHeight - (messageContainer.scrollTop + messageContainer.offsetHeight); if (scrollFromBottom > 400) return; scrollDown(); } messagePageViewModel.filteredMessageViewModels.subscribeSilent( scrollDownIfApplicable, ); React.bulkSubscribe( [ messagePageViewModel.reactionFilter, messagePageViewModel.searchViewModel.appliedQuery, ], scrollDown, ); messagePageViewModel.replyViewSelectedMessage.subscribeSilent( (selectedMessage) => { if (selectedMessage != undefined) return; setTimeout(scrollDown, 100); }, ); setTimeout(() => scrollDown(true), 100); messagePageViewModel.focusSetter.subscribeSilent(() => { ViewController.setFocusWithDelay(); }); const isInReplyView = React.createProxyState( [messagePageViewModel.replyViewSelectedMessage], () => messagePageViewModel.replyViewSelectedMessage.value != undefined, ); const title = React.createProxyState( [messagePageViewModel.isReplyViewActive], () => messagePageViewModel.isReplyViewActive.value ? coreViewModel.translations.chatPage.message.replyHeaderLabel( messagePageViewModel.replyViewSelectedMessage.value!.body .value, ) : coreViewModel.translations.chatPage.message.messagesHeadline, ); return (
{messageContainer}
{MessageFilterModal( coreViewModel, messagePageViewModel, ChatMessageViewModelToView, )}
); }