From 082e5642aa7bbf19214a2d690de8d37d40855ab0 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 22 Oct 2024 20:00:15 +0300 Subject: [PATCH] web/timeline: mark thread replies --- web/src/ui/composer/MessageComposer.tsx | 7 ++++++- web/src/ui/timeline/ReplyBody.css | 6 ++++++ web/src/ui/timeline/ReplyBody.tsx | 10 ++++++---- web/src/ui/timeline/TimelineEvent.tsx | 8 ++++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/web/src/ui/composer/MessageComposer.tsx b/web/src/ui/composer/MessageComposer.tsx index 997e575..b6cda62 100644 --- a/web/src/ui/composer/MessageComposer.tsx +++ b/web/src/ui/composer/MessageComposer.tsx @@ -255,7 +255,12 @@ const MessageComposer = ({ room, scrollToBottomRef, setReplyToRef }: MessageComp setState={setState} setAutocomplete={setAutocomplete} />} - {replyToEvt && } + {replyToEvt && } {loadingMedia &&
} {state.media && }
diff --git a/web/src/ui/timeline/ReplyBody.css b/web/src/ui/timeline/ReplyBody.css index c1950d4..03af9f4 100644 --- a/web/src/ui/timeline/ReplyBody.css +++ b/web/src/ui/timeline/ReplyBody.css @@ -27,6 +27,12 @@ blockquote.reply-body { color: #666; } + &.thread > div.reply-sender > span.event-sender::after { + content: " (thread)"; + font-size: .75rem; + color: #666; + } + > div.reply-sender { display: flex; align-items: center; diff --git a/web/src/ui/timeline/ReplyBody.tsx b/web/src/ui/timeline/ReplyBody.tsx index 3534845..d5e6857 100644 --- a/web/src/ui/timeline/ReplyBody.tsx +++ b/web/src/ui/timeline/ReplyBody.tsx @@ -25,15 +25,17 @@ import "./ReplyBody.css" interface ReplyBodyProps { room: RoomStateStore event: MemDBEvent + isThread: boolean onClose?: (evt: React.MouseEvent) => void } interface ReplyIDBodyProps { room: RoomStateStore eventID: EventID + isThread: boolean } -export const ReplyIDBody = ({ room, eventID }: ReplyIDBodyProps) => { +export const ReplyIDBody = ({ room, eventID, isThread }: ReplyIDBodyProps) => { const event = useRoomEvent(room, eventID) if (!event) { // This caches whether the event is requested or not, so it doesn't need to be wrapped in an effect. @@ -42,7 +44,7 @@ export const ReplyIDBody = ({ room, eventID }: ReplyIDBodyProps) => { Reply to unknown event
{eventID} } - return + return } const onClickReply = (evt: React.MouseEvent) => { @@ -62,13 +64,13 @@ const onClickReply = (evt: React.MouseEvent) => { } } -export const ReplyBody = ({ room, event, onClose }: ReplyBodyProps) => { +export const ReplyBody = ({ room, event, onClose, isThread }: ReplyBodyProps) => { const memberEvt = useRoomState(room, "m.room.member", event.sender) const memberEvtContent = memberEvt?.content as MemberEventContent | undefined const BodyType = getBodyType(event, true) return
diff --git a/web/src/ui/timeline/TimelineEvent.tsx b/web/src/ui/timeline/TimelineEvent.tsx index 5ee9fb1..2d4159a 100644 --- a/web/src/ui/timeline/TimelineEvent.tsx +++ b/web/src/ui/timeline/TimelineEvent.tsx @@ -92,7 +92,7 @@ const TimelineEvent = ({ room, evt, prevEvt, setReplyToRef }: TimelineEventProps const fullTime = fullTimeFormatter.format(eventTS) const shortTime = formatShortTime(eventTS) const editTime = editEventTS ? `Edited at ${fullTimeFormatter.format(editEventTS)}` : null - const replyTo = (evt.orig_content ?? evt.content)["m.relates_to"]?.["m.in_reply_to"]?.event_id + const replyTo = evt.content["m.relates_to"]?.["m.in_reply_to"]?.event_id const mainEvent =
{shortTime}
- {isEventID(replyTo) && BodyType !== HiddenEvent ? : null} + {isEventID(replyTo) && BodyType !== HiddenEvent ? : null}