From 5a59f56319e91a24b455937909d6900973fe19b4 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Thu, 16 Apr 2026 19:34:59 +0800 Subject: [PATCH] fix(room): revert stale edited_at if messageGet fetch fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit onMessageEdited optimistically set edited_at, then fetched the full message. If the fetch failed the "Edited" indicator persisted even though the content was stale. Fix by capturing the original edited_at and reverting it in the catch block — consistent with editMessage rollback. --- src/contexts/room-context.tsx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/contexts/room-context.tsx b/src/contexts/room-context.tsx index 09490bf..3452bab 100644 --- a/src/contexts/room-context.tsx +++ b/src/contexts/room-context.tsx @@ -500,13 +500,16 @@ export function RoomProvider({ const client = wsClientRef.current; if (!client) return; - // Optimistic update: set edited_at immediately + // Capture original edited_at for rollback if fetch fails + let rollbackEditedAt: string | null = null; setMessages((prev) => { + const msg = prev.find((m) => m.id === payload.message_id); + rollbackEditedAt = msg?.edited_at ?? null; const updated = prev.map((m) => m.id === payload.message_id ? { ...m, edited_at: payload.edited_at } : m, ); - const msg = updated.find((m) => m.id === payload.message_id); - if (msg) saveMessage(msg).catch(() => {}); + const saved = updated.find((m) => m.id === payload.message_id); + if (saved) saveMessage(saved).catch(() => {}); return updated; }); @@ -526,12 +529,19 @@ export function RoomProvider({ : m, ); // Persist to IndexedDB - const msg = merged.find((m) => m.id === payload.message_id); - if (msg) saveMessage(msg).catch(() => {}); + const saved = merged.find((m) => m.id === payload.message_id); + if (saved) saveMessage(saved).catch(() => {}); return merged; }); } catch { - // Silently ignore - the optimistic update already applied + // Revert edited_at if the fetch failed + if (rollbackEditedAt !== null) { + setMessages((prev) => + prev.map((m) => + m.id === payload.message_id ? { ...m, edited_at: rollbackEditedAt! } : m, + ), + ); + } } }, onMessageRevoked: async (payload) => {