From 5d680f59bd4e650b75eeeb6201212ad8f674215e Mon Sep 17 00:00:00 2001 From: Richard Joo Date: Tue, 19 May 2026 13:19:52 -0600 Subject: [PATCH] Fix SeoPanel pending draft flush --- packages/admin/src/components/SeoPanel.tsx | 7 ++++++- packages/admin/tests/components/SeoPanel.test.tsx | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/admin/src/components/SeoPanel.tsx b/packages/admin/src/components/SeoPanel.tsx index 4eda843bf..84725e87d 100644 --- a/packages/admin/src/components/SeoPanel.tsx +++ b/packages/admin/src/components/SeoPanel.tsx @@ -80,8 +80,13 @@ export function SeoPanel({ contentKey, seo, onChange }: SeoPanelProps) { }, []); const flushPendingDraft = React.useCallback(() => { + const nextDraft = currentDraftRef.current; + const nextSnapshot = serializeDraft(nextDraft); clearPendingTextFlush(); - emitChange(currentDraftRef.current); + if (nextSnapshot === lastEmittedSnapshotRef.current) { + return; + } + emitChange(nextDraft); }, [clearPendingTextFlush, emitChange]); React.useEffect(() => { diff --git a/packages/admin/tests/components/SeoPanel.test.tsx b/packages/admin/tests/components/SeoPanel.test.tsx index 4972aabdb..a58291e10 100644 --- a/packages/admin/tests/components/SeoPanel.test.tsx +++ b/packages/admin/tests/components/SeoPanel.test.tsx @@ -265,14 +265,16 @@ describe("SeoPanel", () => { await userEvent.click(screen.getByRole("button", { name: "Hide panel" })); - expect(onChange).toHaveBeenCalledWith({ + const expectedSeo = { title: "SEO title", description: null, canonical: null, noIndex: false, - }); + }; + expect(onChange).toHaveBeenCalledWith(expectedSeo); await new Promise((resolve) => setTimeout(resolve, 700)); expect(onChange).toHaveBeenCalledTimes(1); + expect(onChange.mock.lastCall?.[0]).toEqual(expectedSeo); }); });