2024-07-20 21:10:06 +02:00
|
|
|
import "./messagePage.css";
|
|
|
|
|
|
2024-07-20 17:19:10 +02:00
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
2024-07-21 01:12:35 +02:00
|
|
|
import { ChatMessageViewModelToView } from "../Components/chatMessage";
|
2024-07-22 21:07:44 +02:00
|
|
|
import MessagePageViewModel from "../../ViewModel/Pages/messagePageViewModel";
|
2024-07-20 21:15:06 +02:00
|
|
|
import { translations } from "../translations";
|
2024-07-20 17:19:10 +02:00
|
|
|
|
2024-07-22 21:07:44 +02:00
|
|
|
export function MessagePage(messagePageViewModel: MessagePageViewModel) {
|
2026-04-01 08:29:39 +00:00
|
|
|
messagePageViewModel.loadData();
|
2024-07-22 21:07:44 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
const messageContainer = (
|
|
|
|
|
<div
|
|
|
|
|
id="message-container"
|
|
|
|
|
children:append={[
|
|
|
|
|
messagePageViewModel.chatMessageViewModels,
|
|
|
|
|
ChatMessageViewModelToView,
|
|
|
|
|
]}
|
|
|
|
|
></div>
|
|
|
|
|
);
|
2024-07-21 01:12:35 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
function scrollDown() {
|
|
|
|
|
messageContainer.scrollTop = messageContainer.scrollHeight;
|
|
|
|
|
}
|
|
|
|
|
function scrollDownIfApplicable() {
|
|
|
|
|
const scrollFromBottom =
|
|
|
|
|
messageContainer.scrollHeight -
|
|
|
|
|
(messageContainer.scrollTop + messageContainer.offsetHeight);
|
|
|
|
|
if (scrollFromBottom > 400) return;
|
2024-07-21 01:12:35 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
scrollDown();
|
|
|
|
|
}
|
|
|
|
|
messagePageViewModel.chatMessageViewModels.subscribeSilent(
|
|
|
|
|
scrollDownIfApplicable,
|
|
|
|
|
);
|
|
|
|
|
setTimeout(() => scrollDown(), 100);
|
2024-07-21 01:12:35 +02:00
|
|
|
|
2026-04-01 08:29:39 +00:00
|
|
|
return (
|
|
|
|
|
<div id="message-page">
|
|
|
|
|
<div class="pane-wrapper">
|
|
|
|
|
<div class="pane">
|
|
|
|
|
<div class="toolbar">
|
|
|
|
|
<span class="title">
|
|
|
|
|
{translations.chatPage.message.messagesHeadline}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="content">
|
|
|
|
|
{messageContainer}
|
|
|
|
|
<div id="composer">
|
|
|
|
|
<div class="content-width-constraint">
|
|
|
|
|
<div class="input-width-constraint">
|
|
|
|
|
<input
|
|
|
|
|
bind:value={
|
|
|
|
|
messagePageViewModel.composingMessage
|
|
|
|
|
}
|
|
|
|
|
on:enter={
|
|
|
|
|
messagePageViewModel.sendMessage
|
|
|
|
|
}
|
|
|
|
|
placeholder={
|
|
|
|
|
translations.chatPage.message
|
|
|
|
|
.composerInputPlaceholder
|
|
|
|
|
}
|
|
|
|
|
></input>
|
|
|
|
|
<button
|
|
|
|
|
class="primary"
|
|
|
|
|
aria-label={
|
|
|
|
|
translations.chatPage.message
|
|
|
|
|
.sendMessageButtonAudioLabel
|
|
|
|
|
}
|
|
|
|
|
on:click={
|
|
|
|
|
messagePageViewModel.sendMessage
|
|
|
|
|
}
|
|
|
|
|
toggle:disabled={
|
|
|
|
|
messagePageViewModel.cannotSendMessage
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<span class="icon">send</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2024-07-23 12:43:30 +02:00
|
|
|
</div>
|
2024-07-21 01:53:25 +02:00
|
|
|
</div>
|
2024-07-20 21:15:06 +02:00
|
|
|
</div>
|
2026-04-01 08:29:39 +00:00
|
|
|
);
|
2024-07-20 17:19:10 +02:00
|
|
|
}
|