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>(
state => ({ currentNetwork: networkSelector(state) }),
(state) => ({ currentNetwork: networkSelector(state) }),
null,
)(EtherscanLink)

View File

@ -14,6 +14,7 @@ import Row from '~/components/layout/Row'
import Spacer from '~/components/Spacer'
import { border, sm, md } from '~/theme/variables'
import Provider from './Provider'
import SafeListHeader from './SafeListHeader'
const logo = require('../assets/gnosis-safe-logo.svg')
@ -58,8 +59,9 @@ const Layout = openHoc(({
</Link>
</Col>
<Divider />
<Spacer />
<SafeListHeader />
<Divider />
<Spacer />
<Provider open={open} toggle={toggle} info={providerInfo}>
{(providerRef) => (
<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 { ConnectedRouter } from 'connected-react-router'
import { hot } from 'react-hot-loader/root'
import Sidebar from '~/components/Sidebar'
import PageFrame from '../layout/PageFrame'
import Loader from '../Loader'
import { history, store } from '~/store'
@ -22,7 +21,6 @@ const Root = () => (
<PageFrame>
<Suspense fallback={<Loader />}>
<AppRoutes />
<Sidebar />
</Suspense>
</PageFrame>
</ConnectedRouter>

View File

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

View File

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

View File

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

View File

@ -11,3 +11,8 @@ export const safesListSelector: Selector<GlobalState, {}, List<Safe>> = createSe
safesMapSelector,
(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,
},
},
MuiSvgIcon: {
colorSecondary: {
color: secondaryText,
}
},
MuiTab: {
root: {
fontFamily: 'Averta, monospace',