diff --git a/packages/react-native-fantom/src/__tests__/Fantom-itest.js b/packages/react-native-fantom/src/__tests__/Fantom-itest.js index 3eb82e160c52..46b0304d3ca5 100644 --- a/packages/react-native-fantom/src/__tests__/Fantom-itest.js +++ b/packages/react-native-fantom/src/__tests__/Fantom-itest.js @@ -155,6 +155,22 @@ describe('Fantom', () => { }, ); }); + + it('throws when trying to render a root outside of a task', () => { + const root = Fantom.createRoot(); + + expect(() => { + root.render(); + }).toThrow( + 'Unexpected call to `render` outside of the event loop. Please call `render` within a `runTask` callback.', + ); + + expect(() => { + Fantom.runTask(() => { + root.render(); + }); + }).not.toThrow(); + }); }); describe('getRenderedOutput', () => { diff --git a/packages/react-native-fantom/src/index.js b/packages/react-native-fantom/src/index.js index 327227d743bf..ddca12d3264e 100644 --- a/packages/react-native-fantom/src/index.js +++ b/packages/react-native-fantom/src/index.js @@ -57,7 +57,13 @@ class Root { globalSurfaceIdCounter += 10; } - render(element: MixedElement) { + render(element: MixedElement): void { + if (!flushingQueue) { + throw new Error( + 'Unexpected call to `render` outside of the event loop. Please call `render` within a `runTask` callback.', + ); + } + if (!this.#hasRendered) { NativeFantom.startSurface( this.#surfaceId,