import React, { useState, useEffect } from 'react' import { DevSettings } from 'react-native' import { loadString, saveString } from '../app/utils/storage' /** * Toggle Storybook mode, in __DEV__ mode only. * * In non-__DEV__ mode, or when Storybook isn't toggled on, * renders its children. * * The mode flag is persisted in async storage, which means it * persists across reloads/restarts - this is handy when developing * new components in Storybook. */ export function ToggleStorybook(props) { const [showStorybook, setShowStorybook] = useState(false) const [StorybookUIRoot, setStorybookUIRoot] = useState(null) useEffect(() => { if (__DEV__ && DevSettings) { // Load the setting from storage if it's there loadString('devStorybook').then((storedSetting) => { // Set the initial value setShowStorybook(storedSetting === 'on') // Add our toggle command to the menu DevSettings.addMenuItem('Toggle Storybook', () => { setShowStorybook((show) => { // On toggle, flip the current value show = !show // Write it back to storage saveString('devStorybook', show ? 'on' : 'off') // Return it to change the local state return show }) }) // Load the storybook UI once setStorybookUIRoot(() => require('./storybook').StorybookUIRoot) }) } }, []) if (showStorybook) { return StorybookUIRoot ? : null } else { return props.children } }