From 2f86aa4d1e7f0ef12be15b0032cf86632a21e900 Mon Sep 17 00:00:00 2001 From: Steve Rubin Date: Tue, 22 Sep 2026 08:06:53 -0700 Subject: [PATCH 1/2] fix(types): accept nullable block-skeleton scroll refs React 19 no longer includes null implicitly in RefObject. Make null explicit in the public and hook options, matching the existing runtime fallback and remaining compatible with React 18. --- src/component/base/DraftEditorProps.ts | 2 +- src/component/base/__tests__/DraftEditor.react-test.tsx | 7 +++++-- src/component/hooks/useDraftEditorBlockSkeleton.ts | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/component/base/DraftEditorProps.ts b/src/component/base/DraftEditorProps.ts index d8b67695a..484c7b369 100644 --- a/src/component/base/DraftEditorProps.ts +++ b/src/component/base/DraftEditorProps.ts @@ -28,7 +28,7 @@ import {BlockNode} from '../../model/immutable/BlockNode'; export type DraftEditorBlockSkeletonOptions = Readonly<{ enabled: boolean; - scrollContainerRef: RefObject; + scrollContainerRef: RefObject; onBlockSkeletonsRendered?: () => void; }>; diff --git a/src/component/base/__tests__/DraftEditor.react-test.tsx b/src/component/base/__tests__/DraftEditor.react-test.tsx index 3d6f94c01..8827f53a7 100644 --- a/src/component/base/__tests__/DraftEditor.react-test.tsx +++ b/src/component/base/__tests__/DraftEditor.react-test.tsx @@ -78,12 +78,15 @@ test('must has editorKey same as props', () => { expect(editorInstance?.getEditorKey()).toBe('hash'); }); -test('promotes intersecting skeleton blocks to full rendering', () => { +test.each([true, false])('promotes blocks; null ref: %s', nullRef => { const originalIntersectionObserver = globalThis.IntersectionObserver; let observerCallback: IntersectionObserverCallback | undefined; let observerCount = 0; const observedElements: Element[] = []; const renderedSkeletonCounts: number[] = []; + const scrollContainerRef: React.RefObject = { + current: nullRef ? null : container, + }; class MockIntersectionObserver implements IntersectionObserver { readonly root = container; @@ -120,7 +123,7 @@ test('promotes intersecting skeleton blocks to full rendering', () => { container.querySelectorAll('[data-block-skeleton]').length, ); }, - scrollContainerRef: {current: container}, + scrollContainerRef, }} />, ); diff --git a/src/component/hooks/useDraftEditorBlockSkeleton.ts b/src/component/hooks/useDraftEditorBlockSkeleton.ts index 8f5946abf..66256ca24 100644 --- a/src/component/hooks/useDraftEditorBlockSkeleton.ts +++ b/src/component/hooks/useDraftEditorBlockSkeleton.ts @@ -11,7 +11,7 @@ type Options = Readonly<{ editorState: EditorState; contentsElement: HTMLElement | null; onBlockSkeletonsRendered?: () => void; - scrollContainerRef?: RefObject; + scrollContainerRef?: RefObject; }>; const OBSERVER_MARGIN = '500px 0px'; From ae3488a9a92470eb43741470787be4bef96beaf1 Mon Sep 17 00:00:00 2001 From: Steve Rubin Date: Tue, 22 Sep 2026 09:08:04 -0700 Subject: [PATCH 2/2] chore(release): bump version to 0.11.6-descript.41 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4e4241488..01b20a6d3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@descript/draft-js", "description": "A React framework for building text editors.", - "version": "0.11.6-descript.40", + "version": "0.11.6-descript.41", "packageManager": "pnpm@10.28.1", "keywords": [ "draftjs",