From b8655ae52c70cf391988fc9a974fc89139421b6e Mon Sep 17 00:00:00 2001 From: claude code agent 227 Date: Sat, 20 Jun 2026 21:26:42 +0300 Subject: [PATCH] fix(page-templates): make page-embed Refresh actually re-render (#40) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The read-only embed renderer mounts a Tiptap EditorProvider with the looked-up content, but Tiptap consumes the `content` option only at initial mount. After Refresh busted the lookup cache and re-fetched fresh content, the new content prop never reached the sub-editor, so the embed appeared not to update at all. Key PageEmbedContent on result.sourceUpdatedAt (the source page's updatedAt, already returned by the lookup and bumped on every persisted content change) so the component and its EditorProvider remount and apply the refreshed content when the source changes. Note: server-side freshness vs. live collab edits is bounded by the 10s persist debounce (collaboration.gateway.ts) — that separate limitation stays documented in #40 and is out of scope here; this commit fixes the client never re-rendering. Co-Authored-By: Claude Opus 4.8 --- .../editor/components/page-embed/page-embed-view.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/client/src/features/editor/components/page-embed/page-embed-view.tsx b/apps/client/src/features/editor/components/page-embed/page-embed-view.tsx index 707a051f..b51607db 100644 --- a/apps/client/src/features/editor/components/page-embed/page-embed-view.tsx +++ b/apps/client/src/features/editor/components/page-embed/page-embed-view.tsx @@ -214,7 +214,17 @@ function PageEmbedBody({ sourcePageId={sourcePageId} hostPageId={hostPageId} > - + {/* + Tiptap's EditorProvider consumes `content` only at initial mount, so a + changed `content` prop (e.g. after Refresh re-fetches fresh content) + would not update the read-only sub-editor. Key on the source's + updatedAt to remount PageEmbedContent (and its inner EditorProvider) + whenever the source page changes, applying the refreshed content. + */} + ); } else if (result.status === "no_access") {