Fix edit related bugs (#1477)
authorAjay Bura <32841439+ajbura@users.noreply.github.com>
Mon, 23 Oct 2023 10:42:27 +0000 (21:42 +1100)
committerGitHub <noreply@github.com>
Mon, 23 Oct 2023 10:42:27 +0000 (21:42 +1100)
* 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
src/app/organisms/room/RoomTimeline.tsx
src/app/organisms/room/message/MessageEditor.tsx

index 91386a87777153723db822a58444532233be5593..5860df04f730b393142ec83794b696224a97fcef 100644 (file)
@@ -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;
       }
index 0852ecf7a4fde98600c9fcecef7ca09eff8c77e2..2cfbd6584ddbcc4c77bfd9ef30557d823b41f042 100644 (file)
@@ -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<string, string> =
-        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<string, unknown> =
-        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<string, unknown> =
-        editedEvent?.getContent()['m.new.content'] ?? mEvent.getContent();
+        editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent();
 
       if (typeof body !== 'string') return null;
       return (
index 385042ec1ec8cb7df4e978ba4eddd68283549b03..776e1d4d8ce428302b867aa46acec12b4ba090e9 100644 (file)
@@ -53,16 +53,22 @@ export const MessageEditor = as<'div', MessageEditorProps>(
     const [autocompleteQuery, setAutocompleteQuery] =
       useState<AutocompleteQuery<AutocompletePrefix>>();
 
-    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<string, unknown> =
-        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 = {