diff options
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/Fab/Fab.tsx | 23 | ||||
-rw-r--r-- | src/components/ModalScreen/ModalScreen.tsx | 80 |
2 files changed, 90 insertions, 13 deletions
diff --git a/src/components/Fab/Fab.tsx b/src/components/Fab/Fab.tsx index 7ca2893..f6b85e5 100644 --- a/src/components/Fab/Fab.tsx +++ b/src/components/Fab/Fab.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useHistory } from 'react-router-dom'; +import { useLocation, Link } from 'react-router-dom'; import { Fab as FabBase, Slide, useScrollTrigger } from '@material-ui/core/'; import { makeStyles } from '@material-ui/core/styles'; import PlusIcon from '@material-ui/icons/Add'; @@ -26,22 +26,19 @@ const useStyles = makeStyles(theme => ({ const Fab: React.FC<PropTypes> = ({ hideOnScroll = false }) => { const classes = useStyles(); - const history = useHistory(); + const location = useLocation(); const trigger = useScrollTrigger(); - const handleClick = () => { - history.push('/new'); - }; - return ( <Slide appear={false} direction="up" in={(!hideOnScroll) || !trigger}> - <FabBase - onClick={handleClick} - className={classes.root} - color="secondary" - > - <PlusIcon /> - </FabBase> + <Link to={{ pathname: '/new', state: { background: location } }}> + <FabBase + className={classes.root} + color="secondary" + > + <PlusIcon /> + </FabBase> + </Link> </Slide> ); }; diff --git a/src/components/ModalScreen/ModalScreen.tsx b/src/components/ModalScreen/ModalScreen.tsx new file mode 100644 index 0000000..81e5c5a --- /dev/null +++ b/src/components/ModalScreen/ModalScreen.tsx @@ -0,0 +1,80 @@ +import React, { useState, useCallback } from 'react'; +import { useHistory } from 'react-router-dom'; +import { + AppBar, + Dialog, + Toolbar, + Typography, + IconButton, + Divider, + Slide, + useMediaQuery, + useTheme +} from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; +import CloseIcon from '@material-ui/icons/Close'; +import { TransitionProps } from '@material-ui/core/transitions'; + +interface PropTypes { + title: string; +} + +const useStyles = makeStyles(theme => ({ + root: { + backgroundColor: theme.palette.background.default + }, + content: { + padding: theme.spacing(3, 0, 0, 0) + }, + toolbar: { + display: 'flex', + justifyContent: 'space-between' + } +})); + +const Transition = React.forwardRef(( + props: TransitionProps & { children?: React.ReactElement }, + ref: React.Ref<unknown> +) => <Slide direction="left" ref={ref} {...props} />); + +const ModalScreen: React.FC<PropTypes> = ({ title, children }) => { + const [isOpen, setIsOpen] = useState<boolean>(true); + const classes = useStyles(); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const history = useHistory(); + + const handleClose = useCallback(() => setIsOpen(false), [setIsOpen]); + const onExited = useCallback(() => history.goBack(), [history]); + + return ( + <Dialog + open={isOpen} + onExited={onExited} + TransitionComponent={Transition} + PaperProps={{ className: classes.root }} + fullScreen={isMobile} + fullWidth + > + <AppBar position="static"> + <Toolbar className={classes.toolbar}> + <IconButton onClick={handleClose}> + <CloseIcon /> + </IconButton> + <Typography variant="h6"> + { title } + </Typography> + <IconButton style={{ opacity: 0, pointerEvents: 'none' }}> + <CloseIcon /> + </IconButton> + </Toolbar> + </AppBar> + <Divider /> + <div className={classes.content}> + { children } + </div> + </Dialog> + ); +}; + +export default ModalScreen; |