From 80627997d1d10a6f5d4fd960383024f59d7f08ac Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 29 Nov 2025 10:56:31 +0200 Subject: [PATCH] fix(type_widgets): read-only text sometimes rendering wrong blob --- apps/client/src/widgets/react/hooks.tsx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index 34a7c9ed8..f9e5d073d 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -461,27 +461,31 @@ export function useNoteLabelInt(note: FNote | undefined | null, labelName: Filte export function useNoteBlob(note: FNote | null | undefined, componentId?: string): FBlob | null | undefined { const [ blob, setBlob ] = useState(); + const requestIdRef = useRef(0); - function refresh() { - note?.getBlob().then(setBlob); + async function refresh() { + const requestId = ++requestIdRef.current; + const newBlob = await note?.getBlob(); + + // Only update if this is the latest request. + if (requestId === requestIdRef.current) { + setBlob(newBlob); + } } - useEffect(refresh, [ note?.noteId ]); + useEffect(() => { refresh() }, [ note?.noteId ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { if (!note) return; // Check if the note was deleted. if (loadResults.getEntityRow("notes", note.noteId)?.isDeleted) { + requestIdRef.current++; // invalidate pending results setBlob(null); return; } - // Check if a revision occurred. - if (loadResults.hasRevisionForNote(note.noteId)) { - refresh(); - } - - if (loadResults.isNoteContentReloaded(note.noteId, componentId)) { + if (loadResults.hasRevisionForNote(note.noteId) || + loadResults.isNoteContentReloaded(note.noteId, componentId)) { refresh(); } });