From 1ff312d236bc8ad9cad02bd421d0e8e3a00a47e2 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:42:27 +1100 Subject: [PATCH] Fix edit related bugs (#1477) * fix missing empty line on edit * fix edit save after adding formatting to plaintext * fix reading edit content with wrong key --- src/app/components/editor/input.ts | 3 ++ src/app/organisms/room/RoomTimeline.tsx | 10 +++--- .../organisms/room/message/MessageEditor.tsx | 31 ++++++++++++------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 91386a8..5860df0 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -138,6 +138,7 @@ const parseBlockquoteNode = (node: Element): BlockQuoteElement => { } if (isTag(child)) { if (child.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } @@ -202,6 +203,7 @@ const parseListNode = (node: Element): OrderedListElement | UnorderedListElement } if (isTag(child)) { if (child.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } @@ -260,6 +262,7 @@ export const domToEditorInput = (domNodes: ChildNode[]): Descendant[] => { } if (isTag(node)) { if (node.name === 'br') { + lineHolder.push({ text: '' }); appendLine(); return; } diff --git a/src/app/organisms/room/RoomTimeline.tsx b/src/app/organisms/room/RoomTimeline.tsx index 0852ecf..2cfbd65 100644 --- a/src/app/organisms/room/RoomTimeline.tsx +++ b/src/app/organisms/room/RoomTimeline.tsx @@ -615,6 +615,8 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (document.hasFocus()) { scrollToBottomRef.current.count += 1; scrollToBottomRef.current.smooth = true; + } else if (!unreadInfo) { + setUnreadInfo(getRoomUnreadInfo(room)); } setTimeline((ct) => ({ ...ct, @@ -919,7 +921,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli if (!replyEvt) return; const editedReply = getEditedEvent(replyId, replyEvt, room.getUnfilteredTimelineSet()); const { body, formatted_body: formattedBody }: Record = - editedReply?.getContent()['m.new.content'] ?? replyEvt.getContent(); + editedReply?.getContent()['m.new_content'] ?? replyEvt.getContent(); const senderId = replyEvt.getSender(); if (senderId && typeof body === 'string') { setReplyDraft({ @@ -982,7 +984,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderText: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; return ( @@ -1002,7 +1004,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderEmote: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody } = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); const senderId = mEvent.getSender() ?? ''; const senderDisplayName = @@ -1027,7 +1029,7 @@ export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimeli renderNotice: (mEventId, mEvent, timelineSet) => { const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet); const { body, formatted_body: customBody }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); if (typeof body !== 'string') return null; return ( diff --git a/src/app/organisms/room/message/MessageEditor.tsx b/src/app/organisms/room/message/MessageEditor.tsx index 385042e..776e1d4 100644 --- a/src/app/organisms/room/message/MessageEditor.tsx +++ b/src/app/organisms/room/message/MessageEditor.tsx @@ -53,16 +53,22 @@ export const MessageEditor = as<'div', MessageEditorProps>( const [autocompleteQuery, setAutocompleteQuery] = useState>(); - const getPrevBodyAndFormattedBody = useCallback(() => { + const getPrevBodyAndFormattedBody = useCallback((): [ + string | undefined, + string | undefined + ] => { const evtId = mEvent.getId()!; const evtTimeline = room.getTimelineForEvent(evtId); const editedEvent = evtTimeline && getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet()); const { body, formatted_body: customHtml }: Record = - editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent(); + editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent(); - return [body, customHtml]; + return [ + typeof body === 'string' ? body : undefined, + typeof customHtml === 'string' ? customHtml : undefined, + ]; }, [room, mEvent]); const [saveState, save] = useAsyncCallback( @@ -78,14 +84,17 @@ export const MessageEditor = as<'div', MessageEditorProps>( const [prevBody, prevCustomHtml] = getPrevBodyAndFormattedBody(); if (plainText === '') return undefined; - if ( - typeof prevCustomHtml === 'string' && - trimReplyFromFormattedBody(prevCustomHtml) === customHtml - ) { - return undefined; - } - if (!prevCustomHtml && typeof prevBody === 'string' && prevBody === plainText) { - return undefined; + if (prevBody) { + if (prevCustomHtml && trimReplyFromFormattedBody(prevCustomHtml) === customHtml) { + return undefined; + } + if ( + !prevCustomHtml && + prevBody === plainText && + customHtmlEqualsPlainText(customHtml, plainText) + ) { + return undefined; + } } const newContent: IContent = {