Skip to content

Commit

Permalink
Merge pull request #30191 from storybookjs/valentin/fix-act-running-s…
Browse files Browse the repository at this point in the history
…imultaneously

React: Force act running always in sequence
  • Loading branch information
valentinpalkovic authored Jan 7, 2025
2 parents b59cfc1 + b066e56 commit f6a6867
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
6 changes: 3 additions & 3 deletions code/renderers/react/src/__test__/portable-stories.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ describe('renders', () => {
});

it('should throw error when rendering a component with a render error', async () => {
await expect(() => ThrowsError.run()).rejects.toThrowError('Error in render');
await expect(ThrowsError.run()).rejects.toThrowError('Error in render');
});

it('should render component mounted in play function', async () => {
Expand All @@ -77,8 +77,8 @@ describe('renders', () => {
expect(screen.getByTestId('loaded-data').textContent).toEqual('loaded data');
});

it('should throw an error in play function', () => {
expect(() => MountInPlayFunctionThrow.run()).rejects.toThrowError('Error thrown in play');
it('should throw an error in play function', async () => {
await expect(MountInPlayFunctionThrow.run()).rejects.toThrowError('Error thrown in play');
});

it('should call and compose loaders data', async () => {
Expand Down
31 changes: 29 additions & 2 deletions code/renderers/react/src/renderToCanvas.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,23 @@ class ErrorBoundary extends ReactComponent<{

const Wrapper = FRAMEWORK_OPTIONS?.strictMode ? StrictMode : Fragment;

const actQueue: (() => Promise<void>)[] = [];
let isActing = false;

const processActQueue = async () => {
if (isActing || actQueue.length === 0) {
return;
}

isActing = true;
const actTask = actQueue.shift();
if (actTask) {
await actTask();
}
isActing = false;
processActQueue();
};

export async function renderToCanvas(
{
storyContext,
Expand Down Expand Up @@ -81,8 +98,18 @@ export async function renderToCanvas(
unmountElement(canvasElement);
}

await act(async () => {
await renderElement(element, canvasElement, storyContext?.parameters?.react?.rootOptions);
await new Promise<void>(async (resolve, reject) => {
actQueue.push(async () => {
try {
await act(async () => {
await renderElement(element, canvasElement, storyContext?.parameters?.react?.rootOptions);
});
resolve();
} catch (e) {
reject(e);
}
});
processActQueue();
});

return async () => {
Expand Down

0 comments on commit f6a6867

Please sign in to comment.