Skip to content

Commit

Permalink
Chore: Storybook mocking and examples improved (RocketChat#24969)
Browse files Browse the repository at this point in the history
* Upgrade Storybook

* Replace `ts-loader` with `babel-loader`

* Rearrange some stories

* Rearrange some stories

* Move `NotAuthorizedPage`

* Rearrange some stories

* Rearrange some stories

* Rearrange some stories

* Rearrange some stories

* Rearrange some stories

* Squashed commit of the following:

commit f0cda61
Author: Tiago Evangelista Pinto <[email protected]>
Date:   Fri Mar 25 15:45:59 2022 -0300

    fix review

commit 4113ffb
Author: Tiago Evangelista Pinto <[email protected]>
Date:   Thu Mar 24 17:34:48 2022 -0300

    fix

commit 82e14b6
Author: Tiago Evangelista Pinto <[email protected]>
Date:   Thu Mar 24 17:18:57 2022 -0300

    fix

* Rearrange some stories

* Rearrange some stories

* Improve `ServerProviderMock` with parameters

* Expand story mocking capabilities

* Move mocks

* Fix lint issues
  • Loading branch information
tassoevan authored Mar 30, 2022
1 parent fc17f0b commit 2c0061e
Show file tree
Hide file tree
Showing 286 changed files with 8,328 additions and 5,533 deletions.
1 change: 0 additions & 1 deletion .storybook/.prettierrc

This file was deleted.

1 change: 1 addition & 0 deletions .storybook/babel.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ module.exports = {
],
'@babel/preset-react',
'@babel/preset-flow',
'@babel/preset-typescript',
],
plugins: [
'@babel/plugin-proposal-class-properties',
Expand Down
62 changes: 22 additions & 40 deletions .storybook/decorators.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { DecoratorFunction } from '@storybook/addons';
import React, { ReactElement } from 'react';

import { MeteorProviderMock } from './mocks/providers';
import QueryClientProviderMock from './mocks/providers/QueryClientProviderMock';
import ServerProviderMock from './mocks/providers/ServerProviderMock';
import ModalContextMock from '../client/stories/contexts/ModalContextMock';
import QueryClientProviderMock from '../client/stories/contexts/QueryClientProviderMock';
import RouterContextMock from '../client/stories/contexts/RouterContextMock';
import ServerContextMock from '../client/stories/contexts/ServerContextMock';
import TranslationContextMock from '../client/stories/contexts/TranslationContextMock';

export const rocketChatDecorator = (storyFn: () => ReactElement): ReactElement => {
export const rocketChatDecorator: DecoratorFunction<ReactElement<unknown>> = (fn, { parameters }) => {
const linkElement = document.getElementById('theme-styles') || document.createElement('link');
if (linkElement.id !== 'theme-styles') {
require('../app/theme/client/main.css');
Expand All @@ -22,42 +25,21 @@ export const rocketChatDecorator = (storyFn: () => ReactElement): ReactElement =

return (
<QueryClientProviderMock>
<ServerProviderMock>
<MeteorProviderMock>
<style>{`
body {
background-color: white;
}
`}</style>
<div dangerouslySetInnerHTML={{ __html: icons }} />
<div className='color-primary-font-color'>{storyFn()}</div>
</MeteorProviderMock>
</ServerProviderMock>
<ServerContextMock {...parameters.serverContext}>
<TranslationContextMock {...parameters.translationContext}>
<ModalContextMock {...parameters.modalContext}>
<RouterContextMock {...parameters.routerContext}>
<style>{`
body {
background-color: white;
}
`}</style>
<div dangerouslySetInnerHTML={{ __html: icons }} />
<div className='color-primary-font-color'>{fn()}</div>
</RouterContextMock>
</ModalContextMock>
</TranslationContextMock>
</ServerContextMock>
</QueryClientProviderMock>
);
};

export const fullHeightDecorator = (storyFn: () => ReactElement): ReactElement => (
<div
style={{
display: 'flex',
flexDirection: 'column',
maxHeight: '100vh',
}}
>
{storyFn()}
</div>
);

export const centeredDecorator = (storyFn: () => ReactElement): ReactElement => (
<div
style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
minHeight: '100vh',
}}
>
{storyFn()}
</div>
);
1 change: 0 additions & 1 deletion .storybook/hooks/index.ts

This file was deleted.

15 changes: 0 additions & 15 deletions .storybook/hooks/useAutoToggle.ts

This file was deleted.

23 changes: 2 additions & 21 deletions .storybook/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,8 @@ const { resolve, relative, join } = require('path');
const webpack = require('webpack');

module.exports = {
stories: [
'../app/**/*.stories.{js,tsx}',
'../client/**/*.stories.{js,tsx}',
...(process.env.EE === 'true' ? ['../ee/**/*.stories.{js,tsx}'] : []),
],
addons: ['@storybook/addon-essentials', '@storybook/addon-postcss'],
typescript: {
reactDocgen: 'none',
},
stories: ['../app/**/*.stories.{js,tsx}', '../client/**/*.stories.{js,tsx}', '../ee/**/*.stories.{js,tsx}'],
addons: ['@storybook/addon-essentials', '@storybook/addon-interactions', '@storybook/addon-postcss'],
webpackFinal: async (config) => {
const cssRule = config.module.rules.find(({ test }) => test.test('index.css'));

Expand Down Expand Up @@ -48,18 +41,6 @@ module.exports = {
use: '@settlin/spacebars-loader',
});

config.module.rules.push({
test: /\.(ts|tsx)$/,
use: [
{
loader: 'ts-loader',
options: {
configFile: join(__dirname, '../tsconfig.webpack.json'),
},
},
],
});

config.plugins.push(
new webpack.NormalModuleReplacementPlugin(/^meteor/, require.resolve('./mocks/meteor.js')),
new webpack.NormalModuleReplacementPlugin(/(app)\/*.*\/(server)\/*/, require.resolve('./mocks/empty.ts')),
Expand Down
1 change: 1 addition & 0 deletions .storybook/mocks/meteor.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export const Template = Object.assign(
export const Blaze = {
Template,
registerHelper: () => {},
renderWithData: () => {},
};

window.Blaze = Blaze;
Expand Down
84 changes: 0 additions & 84 deletions .storybook/mocks/providers/ServerProviderMock.tsx

This file was deleted.

69 changes: 0 additions & 69 deletions .storybook/mocks/providers/index.tsx

This file was deleted.

5 changes: 4 additions & 1 deletion .storybook/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ addParameters({
page: DocsPage,
},
options: {
storySort: ([, a], [, b]): number => a.kind.localeCompare(b.kind),
storySort: {
method: 'alphabetical',
order: ['Components', '*', 'Enterprise'],
},
},
});
25 changes: 15 additions & 10 deletions client/components/BurgerMenu/BurgerBadge.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
import { Box } from '@rocket.chat/fuselage';
import { Story } from '@storybook/react';
import React, { ReactNode, ReactElement } from 'react';
import { ComponentMeta, ComponentStory } from '@storybook/react';
import React, { ReactElement } from 'react';

import { centeredDecorator } from '../../../.storybook/decorators';
import BurgerBadge from './BurgerBadge';

export default {
title: 'components/burger/BurgerBadge',
title: 'Components/Burger Menu/BurgerBadge',
component: BurgerBadge,
parameters: {
layout: 'centered',
},
decorators: [
(storyFn: () => ReactNode): ReactElement => (
<Box size={24} borderWidth='x1' borderStyle='dashed' position='relative'>
{storyFn()}
(fn): ReactElement => (
<Box size={24} backgroundColor='neutral-500' position='relative'>
{fn()}
</Box>
),
centeredDecorator,
],
};
} as ComponentMeta<typeof BurgerBadge>;

export const Basic: Story = () => <BurgerBadge>99</BurgerBadge>;
export const Default: ComponentStory<typeof BurgerBadge> = (args) => <BurgerBadge {...args} />;
Default.storyName = 'BurgerBadge';
Default.args = {
children: 99,
};
30 changes: 22 additions & 8 deletions client/components/BurgerMenu/BurgerIcon.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,32 @@
import { Story } from '@storybook/react';
import { ComponentMeta, ComponentStory } from '@storybook/react';
import React from 'react';

import { centeredDecorator } from '../../../.storybook/decorators';
import { useAutoToggle } from '../../../.storybook/hooks';
import { useAutoSequence } from '../../stories/hooks/useAutoSequence';
import BurgerIcon from './BurgerIcon';

export default {
title: 'components/burger/BurgerIcon',
title: 'Components/Burger Menu/BurgerIcon',
component: BurgerIcon,
decorators: [centeredDecorator],
parameters: {
layout: 'centered',
controls: { hideNoControlsWarning: true },
},
} as ComponentMeta<typeof BurgerIcon>;

export const Example: ComponentStory<typeof BurgerIcon> = () => {
const open = useAutoSequence([false, true]);

return <BurgerIcon open={open} />;
};

export const Normal: Story = () => <BurgerIcon />;
const Template: ComponentStory<typeof BurgerIcon> = (args) => <BurgerIcon {...args} />;

export const Open: Story = () => <BurgerIcon open />;
export const Closed = Template.bind({});
Closed.args = {
open: false,
};

export const Transitioning: Story = () => <BurgerIcon open={useAutoToggle()} />;
export const Open = Template.bind({});
Open.args = {
open: true,
};
Loading

0 comments on commit 2c0061e

Please sign in to comment.