implement reply view

This commit is contained in:
marlon-erler
2026-09-23 15:15:55 +02:00
parent d236d9d45b
commit d39567087e
6 changed files with 40 additions and 4 deletions
+21
View File
@@ -28,6 +28,23 @@
overflow: auto; overflow: auto;
} }
#message-page .reply-header {
width: 100%;
padding-left: var(--content-padding);
gap: var(--gap-in-controls);
display: flex;
align-items: center;
justify-content: space-between;
background: var(--surface);
}
#message-page .reply-header span {
width: 100%;
flex: 1;
}
/* composer */ /* composer */
#message-page #composer { #message-page #composer {
display: flex; display: flex;
@@ -259,6 +276,10 @@
gap: 5px; gap: 5px;
} }
#message-page[reply-view] :is(.reply-link, .inline-reply) {
display: none;
}
.message-bubble > .message-reaction-row { .message-bubble > .message-reaction-row {
padding: var(--gap-between-tiles); padding: var(--gap-between-tiles);
display: none !important; display: none !important;
+3 -1
View File
@@ -72,8 +72,10 @@ export function MessagePage(
ViewController.setFocusWithDelay(); ViewController.setFocusWithDelay();
}); });
const isInReplyView = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>messagePageViewModel.replyViewSelectedMessage.value != undefined);
return ( return (
<div id="message-page"> <div id="message-page" toggle:reply-view={isInReplyView}>
<div class="pane-wrapper"> <div class="pane-wrapper">
<div class="pane"> <div class="pane">
<div class="toolbar"> <div class="toolbar">
+1 -1
View File
@@ -6,7 +6,7 @@ export function ReplyLink(coreViewModel: CoreViewModel, chatMessageViewModel: Ch
const isHidden = React.createProxyState([chatMessageViewModel.replyCount], ()=>chatMessageViewModel.replyCount.value == 0); const isHidden = React.createProxyState([chatMessageViewModel.replyCount], ()=>chatMessageViewModel.replyCount.value == 0);
function select() { function select() {
chatMessageViewModel.messagePageViewModel.replyViewSelectedMessage.value = chatMessageViewModel; chatMessageViewModel.messagePageViewModel.setReplyView(chatMessageViewModel);
} }
return ( return (
+4 -2
View File
@@ -5,7 +5,8 @@ import MessagePageViewModel from "../../ViewModel/Pages/messagePageViewModel";
export function ReplyViewHeader(coreViewModel: CoreViewModel, messagePageViewModel: MessagePageViewModel) { export function ReplyViewHeader(coreViewModel: CoreViewModel, messagePageViewModel: MessagePageViewModel) {
const isHidden = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>messagePageViewModel.replyViewSelectedMessage.value == undefined); const isHidden = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>messagePageViewModel.replyViewSelectedMessage.value == undefined);
const label = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>coreViewModel.translations.chatPage.message.replyHeaderLabel(messagePageViewModel.replyViewSelectedMessage.value.sender)); const label = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>messagePageViewModel.replyViewSelectedMessage.value == undefined ? "" : coreViewModel.translations.chatPage.message.replyHeaderLabel(messagePageViewModel.replyViewSelectedMessage.value.sender));
const message = React.createProxyState([messagePageViewModel.replyViewSelectedMessage], ()=>messagePageViewModel.replyViewSelectedMessage.value == undefined ? "" : messagePageViewModel.replyViewSelectedMessage.value.body.value);
return ( return (
<div <div
@@ -13,8 +14,9 @@ export function ReplyViewHeader(coreViewModel: CoreViewModel, messagePageViewMod
toggle:hidden={isHidden} toggle:hidden={isHidden}
> >
<b class="ellipsis" subscribe:innerText={label}></b> <b class="ellipsis" subscribe:innerText={label}></b>
<span class="secondary ellipsis" subscribe:innerText={message}></span>
<button <button
class="primary square" class="standard square"
on:click={messagePageViewModel.resetReplyView} on:click={messagePageViewModel.resetReplyView}
> >
<span class="icon">close</span> <span class="icon">close</span>
@@ -154,12 +154,14 @@ export default class ChatMessageViewModel {
let hideForReplyView: boolean = false; let hideForReplyView: boolean = false;
const updateHiding = () => { const updateHiding = () => {
console.log(hideForReactions, hideForReplyView);
this.isHidden.value = hideForReactions || hideForReplyView; this.isHidden.value = hideForReactions || hideForReplyView;
} }
this.messagePageViewModel.reactionFilter.subscribe((content) => { this.messagePageViewModel.reactionFilter.subscribe((content) => {
if (content == undefined) { if (content == undefined) {
hideForReactions = false; hideForReactions = false;
updateHiding();
return; return;
} }
@@ -46,6 +46,8 @@ export default class MessagePageViewModel extends Context {
replyId = this.replyingMessage.value.chatMessage.id; replyId = this.replyingMessage.value.chatMessage.id;
} }
this.chatViewModel.chatModel.sendMessage(body, replyId); this.chatViewModel.chatModel.sendMessage(body, replyId);
if (this.replyViewSelectedMessage.value != undefined) return;
this.replyingMessage.value = undefined; this.replyingMessage.value = undefined;
}; };
@@ -133,8 +135,15 @@ export default class MessagePageViewModel extends Context {
this.searchViewModel.search(""); this.searchViewModel.search("");
}; };
setReplyView = (message: ChatMessageViewModel): void => {
this.replyViewSelectedMessage.value = message;
this.revokeReactionFilter();
this.setReply(message);
}
resetReplyView = (): void => { resetReplyView = (): void => {
this.replyViewSelectedMessage.value = undefined; this.replyViewSelectedMessage.value = undefined;
this.resetReply();
} }
setFocus = (): void => { setFocus = (): void => {