import React from 'react'; import PropTypes from 'prop-types'; import { Global, createGlobal, styled } from '@storybook/theming'; import memoize from 'memoizerific'; import sizeMe from 'react-sizeme'; import { Route } from '@storybook/router'; import { Mobile } from './components/layout/mobile'; import { Desktop } from './components/layout/desktop'; import Nav from './containers/nav'; import Preview from './containers/preview'; import Panel from './containers/panel'; import Notifications from './containers/notifications'; import SettingsPages from './settings'; const createProps = memoize(1)(() => ({ Nav, Preview, Panel, Notifications, pages: [ { key: 'settings', render: () => <SettingsPages />, // eslint-disable-next-line react/prop-types route: ({ children }) => ( <Route path="/settings" startsWith> {children} </Route> ), }, ], })); const View = styled.div({ position: 'fixed', overflow: 'hidden', height: '100vh', width: '100vw', }); const App = React.memo(({ viewMode, layout, size: { width, height } }) => { const props = createProps(); let content; if (!width || !height) { content = ( <div> {width} x {height} </div> ); } else if (width < 600) { content = <Mobile {...props} viewMode={viewMode} options={layout} />; } else { content = <Desktop {...props} viewMode={viewMode} options={layout} {...{ width, height }} />; } return ( <View> <Global styles={createGlobal} /> {content} </View> ); }); App.propTypes = { viewMode: PropTypes.oneOf(['story', 'info']), layout: PropTypes.shape({}).isRequired, size: PropTypes.shape({ width: PropTypes.number, height: PropTypes.number, }).isRequired, }; App.defaultProps = { viewMode: undefined, }; const SizedApp = sizeMe({ monitorHeight: true })(App); App.displayName = 'App'; export default SizedApp;