Skip to content

Commit

Permalink
Merge pull request #18457 from storybookjs/tom/sb-415-return-cleanup-…
Browse files Browse the repository at this point in the history
…function-from-rendertodom

Core: Allow a teardown function to be returned from `renderToDOM`
  • Loading branch information
shilman authored Jun 20, 2022
2 parents e5c2bb6 + 661011f commit a48e03d
Show file tree
Hide file tree
Showing 12 changed files with 221 additions and 48 deletions.
2 changes: 2 additions & 0 deletions app/react/src/client/preview/render.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,6 @@ export async function renderToDOM(
}

await renderElement(element, domElement);

return () => unmountElement(domElement);
}
2 changes: 1 addition & 1 deletion examples/react-ts/.storybook/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const config: StorybookConfig = {
},
features: {
postcss: false,
// modernInlineRender: true,
modernInlineRender: true,
storyStoreV7: !global.navigator?.userAgent?.match?.('jsdom'),
buildStoriesJson: true,
babelModeV7: true,
Expand Down
45 changes: 45 additions & 0 deletions examples/react-ts/src/__snapshots__/storyshots.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -4041,6 +4041,51 @@ exports[`Storyshots Demo/Examples / Emoji Button With Args 1`] = `
</button>
`;

exports[`Storyshots Demo/button2 One 1`] = `
<button
type="button"
>
one
</button>
`;

exports[`Storyshots Demo/button2 Three 1`] = `
<button
type="button"
>
three
</button>
`;

exports[`Storyshots Demo/button2 Two 1`] = `
<button
type="button"
>
two
</button>
`;

exports[`Storyshots Demo/button3 Five 1`] = `
<button
type="button"
>
five
</button>
`;

exports[`Storyshots Demo/button3 Four 1`] = `
<button
type="button"
>
four
</button>
`;

exports[`Storyshots Docs/ButtonMdx Basic 1`] = `
<button
type="button"
Expand Down
19 changes: 13 additions & 6 deletions examples/react-ts/src/button.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { ComponentType, ButtonHTMLAttributes } from 'react';
import React, { ComponentType, ButtonHTMLAttributes, useEffect } from 'react';

export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
/**
Expand All @@ -12,8 +12,15 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
icon?: ComponentType;
}

export const Button = ({ label = 'Hello', icon: Icon, ...props }: ButtonProps) => (
<button type="button" {...props}>
{Icon ? <Icon /> : null} {label}
</button>
);
export const Button = ({ label = 'Hello', icon: Icon, ...props }: ButtonProps) => {
useEffect(() => {
const fn = () => console.log(`click ${label}`);
global.window.document.querySelector('body')?.addEventListener('click', fn);
return () => global.window.document.querySelector('body')?.removeEventListener('click', fn);
});
return (
<button type="button" {...props}>
{Icon ? <Icon /> : null} {label}
</button>
);
};
10 changes: 10 additions & 0 deletions examples/react-ts/src/button2.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Button } from './button';

export default {
component: Button,
title: 'button2',
};

export const one = { args: { label: 'one' } };
export const two = { args: { label: 'two' } };
export const three = { args: { label: 'three' } };
9 changes: 9 additions & 0 deletions examples/react-ts/src/button3.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Button } from './button';

export default {
component: Button,
title: 'button3',
};

export const four = { args: { label: 'four' } };
export const five = { args: { label: 'five' } };
3 changes: 2 additions & 1 deletion lib/preview-web/src/Preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
StoryIndex,
PromiseLike,
WebProjectAnnotations,
RenderToDOM,
} from '@storybook/store';

import { StoryRender } from './StoryRender';
Expand All @@ -45,7 +46,7 @@ export class Preview<TFramework extends AnyFramework> {

importFn?: ModuleImportFn;

renderToDOM: WebProjectAnnotations<TFramework>['renderToDOM'];
renderToDOM: RenderToDOM<TFramework>;

storyRenders: StoryRender<TFramework>[] = [];

Expand Down
5 changes: 3 additions & 2 deletions lib/preview-web/src/PreviewWeb.mockdata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
STORY_RENDER_PHASE_CHANGED,
STORY_THREW_EXCEPTION,
} from '@storybook/core-events';
import { StoryIndex } from '@storybook/store';
import { StoryIndex, TeardownRenderToDOM } from '@storybook/store';
import { RenderPhase } from './PreviewWeb';

export const componentOneExports = {
Expand All @@ -32,12 +32,13 @@ export const importFn = jest.fn(async (path) => {
return path === './src/ComponentOne.stories.js' ? componentOneExports : componentTwoExports;
});

export const teardownRenderToDOM: jest.Mock<TeardownRenderToDOM> = jest.fn();
export const projectAnnotations = {
globals: { a: 'b' },
globalTypes: {},
decorators: [jest.fn((s) => s())],
render: jest.fn(),
renderToDOM: jest.fn(),
renderToDOM: jest.fn().mockReturnValue(teardownRenderToDOM),
};
export const getProjectAnnotations = () => projectAnnotations;

Expand Down
Loading

0 comments on commit a48e03d

Please sign in to comment.