make sidebar toggleable

This commit is contained in:
Mikhail Mikheev 2019-09-17 15:19:39 +04:00
parent 49ba6d3bd3
commit ceb44ab206
9 changed files with 100 additions and 19 deletions

View File

@ -26,6 +26,6 @@ const EtherscanLink = ({ type, value, currentNetwork }: EtherscanLinkProps) => (
) )
export default connect<Object, Object, ?Function, ?Object>( export default connect<Object, Object, ?Function, ?Object>(
state => ({ currentNetwork: networkSelector(state) }), (state) => ({ currentNetwork: networkSelector(state) }),
null, null,
)(EtherscanLink) )(EtherscanLink)

View File

@ -14,6 +14,7 @@ import Row from '~/components/layout/Row'
import Spacer from '~/components/Spacer' import Spacer from '~/components/Spacer'
import { border, sm, md } from '~/theme/variables' import { border, sm, md } from '~/theme/variables'
import Provider from './Provider' import Provider from './Provider'
import SafeListHeader from './SafeListHeader'
const logo = require('../assets/gnosis-safe-logo.svg') const logo = require('../assets/gnosis-safe-logo.svg')
@ -58,8 +59,9 @@ const Layout = openHoc(({
</Link> </Link>
</Col> </Col>
<Divider /> <Divider />
<Spacer /> <SafeListHeader />
<Divider /> <Divider />
<Spacer />
<Provider open={open} toggle={toggle} info={providerInfo}> <Provider open={open} toggle={toggle} info={providerInfo}>
{(providerRef) => ( {(providerRef) => (
<Popper open={open} anchorEl={providerRef.current} placement="bottom-end"> <Popper open={open} anchorEl={providerRef.current} placement="bottom-end">

View File

@ -0,0 +1,60 @@
// @flow
import * as React from 'react'
import { connect } from 'react-redux'
import { makeStyles } from '@material-ui/core/styles'
import IconButton from '@material-ui/core/IconButton'
import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
import Paragraph from '~/components/layout/Paragraph'
import Col from '~/components/layout/Col'
import {
xs, sm, md, border,
} from '~/theme/variables'
import { safesCountSelector } from '~/routes/safeList/store/selectors'
import { SidebarContext } from '~/components/Sidebar'
const useStyles = makeStyles({
container: {
flexGrow: 0,
padding: `0 ${md}`,
},
counter: {
background: border,
padding: xs,
borderRadius: '3px',
marginLeft: sm,
lineHeight: 'normal',
},
icon: {
marginLeft: sm,
},
})
type Props = {
safesCount: number,
}
const { useContext } = React
const SafeListHeader = ({ safesCount }: Props) => {
const classes = useStyles()
const { toggleSidebar } = useContext(SidebarContext)
return (
<Col start="xs" middle="xs" className={classes.container}>
Safes
{' '}
<Paragraph size="xs" className={classes.counter}>
{safesCount}
</Paragraph>
<IconButton onClick={toggleSidebar} className={classes.icon} aria-label="Expand Safe List">
<ExpandMoreIcon color="secondary" />
</IconButton>
</Col>
)
}
export default connect<Object, Object, ?Function, ?Object>(
// $FlowFixMe
(state) => ({ safesCount: safesCountSelector(state) }),
null,
)(SafeListHeader)

View File

@ -6,7 +6,6 @@ import React, { Suspense } from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { ConnectedRouter } from 'connected-react-router' import { ConnectedRouter } from 'connected-react-router'
import { hot } from 'react-hot-loader/root' import { hot } from 'react-hot-loader/root'
import Sidebar from '~/components/Sidebar'
import PageFrame from '../layout/PageFrame' import PageFrame from '../layout/PageFrame'
import Loader from '../Loader' import Loader from '../Loader'
import { history, store } from '~/store' import { history, store } from '~/store'
@ -22,7 +21,6 @@ const Root = () => (
<PageFrame> <PageFrame>
<Suspense fallback={<Loader />}> <Suspense fallback={<Loader />}>
<AppRoutes /> <AppRoutes />
<Sidebar />
</Suspense> </Suspense>
</PageFrame> </PageFrame>
</ConnectedRouter> </ConnectedRouter>

View File

@ -3,7 +3,12 @@ import React, { useState } from 'react'
import Drawer from '@material-ui/core/Drawer' import Drawer from '@material-ui/core/Drawer'
import useSidebarStyles from './style' import useSidebarStyles from './style'
const Sidebar = () => { export const SidebarContext = React.createContext({
isOpen: false,
toggleSidebar: () => {},
})
const Sidebar = ({ children }) => {
const [isOpen, setIsOpen] = useState<boolean>(true) const [isOpen, setIsOpen] = useState<boolean>(true)
const classes = useSidebarStyles() const classes = useSidebarStyles()
@ -12,6 +17,7 @@ const Sidebar = () => {
} }
return ( return (
<SidebarContext.Provider value={{ isOpen, toggleSidebar }}>
<Drawer <Drawer
className={classes.sidebar} className={classes.sidebar}
open={isOpen} open={isOpen}
@ -21,6 +27,8 @@ const Sidebar = () => {
<div className={classes.headerPlaceholder} /> <div className={classes.headerPlaceholder} />
Wop Wop
</Drawer> </Drawer>
{children}
</SidebarContext.Provider>
) )
} }

View File

@ -4,7 +4,7 @@ import { border } from '~/theme/variables'
const style = { const style = {
height: '100%', height: '100%',
borderRight: `solid 1px ${border}`, borderRight: `solid 2px ${border}`,
} }
const Divider = () => <div style={style} /> const Divider = () => <div style={style} />

View File

@ -1,7 +1,8 @@
// @flow // @flow
import React from 'react' import * as React from 'react'
import Footer from '~/components/Footer' import Footer from '~/components/Footer'
import Header from '~/components/Header' import Header from '~/components/Header'
import SidebarProvider from '~/components/Sidebar'
import { SharedSnackbarProvider } from '~/components/SharedSnackBar' import { SharedSnackbarProvider } from '~/components/SharedSnackBar'
import styles from './index.scss' import styles from './index.scss'
@ -12,9 +13,11 @@ type Props = {
const PageFrame = ({ children }: Props) => ( const PageFrame = ({ children }: Props) => (
<SharedSnackbarProvider> <SharedSnackbarProvider>
<div className={styles.frame}> <div className={styles.frame}>
<SidebarProvider>
<Header /> <Header />
{children} {children}
<Footer /> <Footer />
</SidebarProvider>
</div> </div>
</SharedSnackbarProvider> </SharedSnackbarProvider>
) )

View File

@ -11,3 +11,8 @@ export const safesListSelector: Selector<GlobalState, {}, List<Safe>> = createSe
safesMapSelector, safesMapSelector,
(safes: Map<string, Safe>): List<Safe> => safes.toList(), (safes: Map<string, Safe>): List<Safe> => safes.toList(),
) )
export const safesCountSelector: Selector<GlobalState, {}, number> = createSelector(
safesMapSelector,
(safes: Map<string, Safe>): number => safes.size,
)

View File

@ -206,6 +206,11 @@ export default createMuiTheme({
color: primary, color: primary,
}, },
}, },
MuiSvgIcon: {
colorSecondary: {
color: secondaryText,
}
},
MuiTab: { MuiTab: {
root: { root: {
fontFamily: 'Averta, monospace', fontFamily: 'Averta, monospace',