From ce35c870d4122971830f68990531d426f7a7266e Mon Sep 17 00:00:00 2001 From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com> Date: Wed, 27 Oct 2021 14:49:58 -0500 Subject: [PATCH] Let Storybook stories fetch theme --- .storybook/StorybookThemeContext.d.ts | 7 ++++ .storybook/StorybookThemeContext.js | 7 ++++ .storybook/config.js | 42 ++++++++++++++------ ts/components/conversation/Image.stories.tsx | 36 +++++++---------- 4 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 .storybook/StorybookThemeContext.d.ts create mode 100644 .storybook/StorybookThemeContext.js diff --git a/.storybook/StorybookThemeContext.d.ts b/.storybook/StorybookThemeContext.d.ts new file mode 100644 index 000000000..b26b6f44f --- /dev/null +++ b/.storybook/StorybookThemeContext.d.ts @@ -0,0 +1,7 @@ +// Copyright 2021 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import type { Context } from 'react'; +import type { ThemeType } from '../ts/types/Util'; + +export const StorybookThemeContext: Context; diff --git a/.storybook/StorybookThemeContext.js b/.storybook/StorybookThemeContext.js new file mode 100644 index 000000000..59a7300f1 --- /dev/null +++ b/.storybook/StorybookThemeContext.js @@ -0,0 +1,7 @@ +// Copyright 2021 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { createContext } from 'react'; +import { ThemeType } from '../ts/types/Util'; + +export const StorybookThemeContext = createContext(ThemeType.light); diff --git a/.storybook/config.js b/.storybook/config.js index 44d351f97..2230765ff 100644 --- a/.storybook/config.js +++ b/.storybook/config.js @@ -8,7 +8,9 @@ import classnames from 'classnames'; import * as styles from './styles.scss'; import messages from '../_locales/en/messages.json'; import { I18n } from '../sticker-creator/util/i18n'; +import { ThemeType } from '../ts/types/Util'; import { ClassyProvider } from '../ts/components/PopperRootContext'; +import { StorybookThemeContext } from './StorybookThemeContext'; const optionsConfig = { display: 'inline-radio', @@ -31,6 +33,8 @@ const makeThemeKnob = pane => ) ); +const parseThemeString = str => (str === '' ? ThemeType.light : ThemeType.dark); + const makeModeKnob = pane => persistKnob(`${pane}-pane-mode`)(localValue => optionsKnob( @@ -46,19 +50,21 @@ addDecorator(withKnobs({ escapeHTML: false })); addDecorator((storyFn /* , context */) => { const contents = storyFn(); - const firstPaneTheme = makeThemeKnob('First'); + const firstPaneThemeString = makeThemeKnob('First'); + const firstPaneTheme = parseThemeString(firstPaneThemeString); const firstPaneMode = makeModeKnob('First'); const secondPane = persistKnob('second-pane-active')(localValue => boolean('Second Pane Active', localValue !== 'false', 'Second Pane') ); - const secondPaneTheme = makeThemeKnob('Second'); + const secondPaneThemeString = makeThemeKnob('Second'); + const secondPaneTheme = parseThemeString(secondPaneThemeString); const secondPaneMode = makeModeKnob('Second'); // Adding it to the body as well so that we can cover modals and other // components that are rendered outside of this decorator container - if (firstPaneTheme === '') { + if (firstPaneThemeString === '') { document.body.classList.remove('dark-theme'); } else { document.body.classList.add('dark-theme'); @@ -76,18 +82,30 @@ addDecorator((storyFn /* , context */) => { return (
- -
- {contents} -
-
+ + +
+ {contents} +
+
+
{secondPane ? (
- {contents} + + {contents} +
) : null}
diff --git a/ts/components/conversation/Image.stories.tsx b/ts/components/conversation/Image.stories.tsx index b243e28fc..3b425598f 100644 --- a/ts/components/conversation/Image.stories.tsx +++ b/ts/components/conversation/Image.stories.tsx @@ -1,4 +1,4 @@ -// Copyright 2020 Signal Messenger, LLC +// Copyright 2020-2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import * as React from 'react'; @@ -11,9 +11,10 @@ import { pngUrl } from '../../storybook/Fixtures'; import type { Props } from './Image'; import { Image } from './Image'; import { IMAGE_PNG } from '../../types/MIME'; -import { ThemeType } from '../../types/Util'; +import type { ThemeType } from '../../types/Util'; import { setupI18n } from '../../util/setupI18n'; import enMessages from '../../../_locales/en/messages.json'; +import { StorybookThemeContext } from '../../../.storybook/StorybookThemeContext'; import { fakeAttachment } from '../../test-both/helpers/fakeAttachment'; @@ -63,7 +64,7 @@ const createProps = (overrideProps: Partial = {}): Props => ({ softCorners: boolean('softCorners', overrideProps.softCorners || false), tabIndex: number('tabIndex', overrideProps.tabIndex || 0), theme: text('theme', overrideProps.theme || 'light') as ThemeType, - url: text('url', overrideProps.url || pngUrl), + url: text('url', 'url' in overrideProps ? overrideProps.url || null : pngUrl), width: number('width', overrideProps.width || 100), }); @@ -196,26 +197,19 @@ story.add('Blurhash', () => { return ; }); -story.add('undefined blurHash (light)', () => { - const defaultProps = createProps(); - const props = { - ...defaultProps, - blurHash: undefined, - theme: ThemeType.light, +story.add('undefined blurHash', () => { + const Wrapper = () => { + const theme = React.useContext(StorybookThemeContext); + const props = createProps({ + blurHash: undefined, + theme, + url: undefined, + }); + + return ; }; - return ; -}); - -story.add('undefined blurHash (dark)', () => { - const defaultProps = createProps(); - const props = { - ...defaultProps, - blurHash: undefined, - theme: ThemeType.dark, - }; - - return ; + return ; }); story.add('Missing Image', () => {