From be2da0a331420b58b55c4287e52cb3f124601a5d Mon Sep 17 00:00:00 2001 From: Alberto Defendi <1369-ahl-berto@users.noreply.gitlab.inf.unibz.it> Date: Wed, 19 May 2021 15:47:44 +0200 Subject: [PATCH] Move dashboard components to dedicated folder. --- .../AuthUser/Dashboard/Dashboard.tsx | 14 + .../AuthUser/Dashboard/HomePage/HomePage.tsx | 104 +++++++ .../Dashboard/HomePage/MapElement.tsx | 122 +++++++++ .../AuthUser/Dashboard/HomePage/NavBar.tsx | 69 +++++ .../Dashboard/HomePage/NavBarLogin.tsx | 56 ++++ .../AuthUser/Dashboard/HomePage/Numbers.tsx | 137 ++++++++++ .../AuthUser/Dashboard/HomePage/Steps.tsx | 132 +++++++++ .../Dashboard/ProfilePage/ProfilePage.md | 5 + .../ProfilePage/ProfilePage.test.tsx | 10 + .../Dashboard/ProfilePage/ProfilePage.tsx | 23 ++ .../Reservation/Reservation.tsx | 60 ++++ .../ReservationPage/ReservationPage.test.tsx | 10 + .../ReservationPage/ReservationPage.tsx | 257 ++++++++++++++++++ 13 files changed, 999 insertions(+) create mode 100644 src/components/AuthUser/Dashboard/Dashboard.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/HomePage.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/MapElement.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/NavBar.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/NavBarLogin.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/Numbers.tsx create mode 100644 src/components/AuthUser/Dashboard/HomePage/Steps.tsx create mode 100644 src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.md create mode 100644 src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.test.tsx create mode 100644 src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.tsx create mode 100644 src/components/AuthUser/Dashboard/ReservationPage/Reservation/Reservation.tsx create mode 100644 src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.test.tsx create mode 100644 src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.tsx diff --git a/src/components/AuthUser/Dashboard/Dashboard.tsx b/src/components/AuthUser/Dashboard/Dashboard.tsx new file mode 100644 index 0000000..6f3b00a --- /dev/null +++ b/src/components/AuthUser/Dashboard/Dashboard.tsx @@ -0,0 +1,14 @@ +import React, { FC } from 'react'; +import Container from '@material-ui/core/Container'; +import { Route, useRouteMatch } from 'react-router-dom'; +import { NonAuthRoutes } from 'api/routes'; +import { HomePage } from './HomePage/HomePage'; + +export const Dashboard: FC = () => { + const { path } = useRouteMatch(); + return ( + <Container maxWidth="sm"> + <Route path={`${path}/home`} component={HomePage} /> + </Container> + ); +}; diff --git a/src/components/AuthUser/Dashboard/HomePage/HomePage.tsx b/src/components/AuthUser/Dashboard/HomePage/HomePage.tsx new file mode 100644 index 0000000..99b3448 --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/HomePage.tsx @@ -0,0 +1,104 @@ +import React, { FC } from 'react'; +import { createStyles, Theme, makeStyles } from '@material-ui/core/styles'; +import Drawer from '@material-ui/core/Drawer'; +import AppBar from '@material-ui/core/AppBar'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import Toolbar from '@material-ui/core/Toolbar'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; + +const drawerWidth = 240; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + root: { + display: 'flex', + }, + appBar: { + zIndex: theme.zIndex.drawer + 1, + }, + drawer: { + width: drawerWidth, + flexShrink: 0, + }, + drawerPaper: { + width: drawerWidth, + }, + drawerContainer: { + overflow: 'auto', + }, + content: { + flexGrow: 1, + padding: theme.spacing(3), + }, + }), +); + +export const HomePage: FC = () => { + const classes = useStyles(); + + return ( + <div className={classes.root}> + <CssBaseline /> + <AppBar position="fixed" className={classes.appBar}> + <Toolbar> + <Typography variant="h6" noWrap> + Moveaid + </Typography> + </Toolbar> + </AppBar> + <Drawer + className={classes.drawer} + variant="permanent" + classes={{ + paper: classes.drawerPaper, + }} + > + <Toolbar /> + <div className={classes.drawerContainer}> + <List> + {['Reservation'].map((text) => ( + <ListItem button key={text}> + <ListItemText primary={text} /> + </ListItem> + ))} + </List> + </div> + </Drawer> + <main className={classes.content}> + <Toolbar /> + <Typography paragraph> + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Rhoncus + dolor purus non enim praesent elementum facilisis leo vel. Risus at + ultrices mi tempus imperdiet. Semper risus in hendrerit gravida rutrum + quisque non tellus. Convallis convallis tellus id interdum velit + laoreet id donec ultrices. Odio morbi quis commodo odio aenean sed + adipiscing. Amet nisl suscipit adipiscing bibendum est ultricies + integer quis. Cursus euismod quis viverra nibh cras. Metus vulputate + eu scelerisque felis imperdiet proin fermentum leo. Mauris commodo + quis imperdiet massa tincidunt. Cras tincidunt lobortis feugiat + vivamus at augue. At augue eget arcu dictum varius duis at consectetur + lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa sapien + faucibus et molestie ac. + </Typography> + <Typography paragraph> + Consequat mauris nunc congue nisi vitae suscipit. Fringilla est + ullamcorper eget nulla facilisi etiam dignissim diam. Pulvinar + elementum integer enim neque volutpat ac tincidunt. Ornare suspendisse + sed nisi lacus sed viverra tellus. Purus sit amet volutpat consequat + mauris. Elementum eu facilisis sed odio morbi. Euismod lacinia at quis + risus sed vulputate odio. Morbi tincidunt ornare massa eget egestas + purus viverra accumsan in. In hendrerit gravida rutrum quisque non + tellus orci ac. Pellentesque nec nam aliquam sem et tortor. Habitant + morbi tristique senectus et. Adipiscing elit duis tristique + sollicitudin nibh sit. Ornare aenean euismod elementum nisi quis + eleifend. Commodo viverra maecenas accumsan lacus vel facilisis. Nulla + posuere sollicitudin aliquam ultrices sagittis orci a. + </Typography> + </main> + </div> + ); +}; diff --git a/src/components/AuthUser/Dashboard/HomePage/MapElement.tsx b/src/components/AuthUser/Dashboard/HomePage/MapElement.tsx new file mode 100644 index 0000000..89f7d3c --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/MapElement.tsx @@ -0,0 +1,122 @@ +/* eslint-disable react/jsx-props-no-spreading */ +import * as React from 'react'; + +export const MapElement: React.FC = (props: React.SVGProps<SVGSVGElement>) => ( + <svg + data-name="Layer 1" + xmlns="http://www.w3.org/2000/svg" + width={425} + height={364.74} + viewBox="0 0 923.8 753.71" + {...props} + > + <title>map</title> + <ellipse + cx={1007.29} + cy={789.73} + rx={19.99} + ry={48.53} + transform="rotate(-45 849.945 919.851)" + fill="#fff" + opacity={0.1} + /> + <ellipse cx={872.63} cy={705.7} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={688.53} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={671.36} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={654.19} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={637.02} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={619.85} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={872.63} cy={602.68} rx={10.73} ry={14.05} fill="#3f3d56" /> + <path + d="M912.8 485.18a51.13 51.13 0 004-5.88l-28.2-4.63 30.5.22a51.54 51.54 0 001-40.73l-40.91 21.23 37.71-27.74a51.41 51.41 0 10-84.9 57.53 51.16 51.16 0 00-5.86 9.37l36.6 19-39-13.1a51.45 51.45 0 008.29 48.27 51.4 51.4 0 1080.8 0 51.41 51.41 0 000-63.56z" + fill="#fff" + /> + <path + d="M821 516.96a51.16 51.16 0 0011 31.78 51.4 51.4 0 1080.8 0c6.89-8.74-91.8-37.55-91.8-31.78z" + opacity={0.1} + /> + <path + fill="#444053" + d="M846.97 0v720l-244-34-296.61 60.51-2.39.49-236-65V56l245-56 268 56 10.19-2.15L846.97 0z" + /> + <path + fill="#fff" + d="M805.97 39.32v644.21l-218.31-30.42-265.39 54.14-2.14.43-211.16-58.15V89.42l219.22-50.1 239.78 50.1 9.12-1.92 228.88-48.18z" + /> + <path + opacity={0.1} + d="M602.97 686l-296.61 60.51L312.97 0l268 56 10.19-2.15L602.97 686z" + /> + <g + opacity={0.3} + fill="none" + stroke="#444053" + strokeMiterlimit={10} + strokeWidth={3} + > + <path d="M573.35 138l.12 209.5h87v-86h149l17.5-22.44M88.97 204.5h323.5l20-9h8v202h140l6 18v91h108V619M483.2 619V397.5M826.97 559.66H483.2M740.87 138v481M87.97 517.14h739M177.91 619V138M349.69 138v481M88.97 259.5l571.5 2M255.3 138.87V619" /> + <path d="M87.97 370.82h261.72L483.2 517.14M512.12 138v259.5M483.2 443.98h343.77" /> + </g> + <path fill="#fff" d="M585.97 442h-101v-44l95.5-.5 6 17-.5 27.5z" /> + <path + d="M535.97 214a55.28 55.28 0 00-55.28 55.28c0 30.53 55.28 129.72 55.28 129.72s55.28-99.15 55.28-129.72A55.28 55.28 0 00535.97 214zm0 78.86a24.32 24.32 0 1124.32-24.32 24.32 24.32 0 01-24.32 24.31z" + fill="#fff" + /> + <path + d="M535.97 214a55.28 55.28 0 00-55.28 55.28c0 30.53 55.28 129.72 55.28 129.72s55.28-99.15 55.28-129.72A55.28 55.28 0 00535.97 214zm0 78.86a24.32 24.32 0 1124.32-24.32 24.32 24.32 0 01-24.32 24.31z" + opacity={0.1} + /> + <path + d="M535.97 222a55.28 55.28 0 00-55.28 55.28c0 30.53 55.28 129.72 55.28 129.72s55.28-99.15 55.28-129.72A55.28 55.28 0 00535.97 222zm0 78.86a24.32 24.32 0 1124.32-24.32 24.32 24.32 0 01-24.32 24.31z" + fill="#fff" + /> + <ellipse + cx={649.86} + cy={806.61} + rx={33.45} + ry={13.78} + transform="rotate(-23.3 403.328 1104.861)" + fill="#fff" + opacity={0.1} + /> + <ellipse cx={511.39} cy={727.97} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={716.13} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={704.3} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={692.47} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={680.63} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={668.8} rx={7.4} ry={9.68} fill="#3f3d56" /> + <ellipse cx={511.39} cy={656.97} rx={7.4} ry={9.68} fill="#3f3d56" /> + <path + d="M483.7 575.98a36.12 36.12 0 01-2.76-4l19.44-3.2-21 .16a35.54 35.54 0 01-.68-28.07l28.2 14.58-26-19.12a35.43 35.43 0 1158.51 39.65 35.55 35.55 0 014 6.46l-25.21 13.11 26.9-9a35.45 35.45 0 01-5.71 33.27 35.43 35.43 0 11-55.69 0 35.44 35.44 0 010-43.81z" + fill="#fff" + /> + <path + d="M546.97 597.85a35.28 35.28 0 01-7.58 21.91 35.43 35.43 0 11-55.69 0c-4.75-6 63.27-25.85 63.27-21.91z" + opacity={0.1} + /> + <ellipse + cx={186.29} + cy={767.73} + rx={19.99} + ry={48.53} + transform="rotate(-45 28.942 897.852)" + fill="#fff" + opacity={0.1} + /> + <ellipse cx={51.63} cy={683.7} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={666.53} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={649.36} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={632.19} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={615.02} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={597.85} rx={10.73} ry={14.05} fill="#3f3d56" /> + <ellipse cx={51.63} cy={580.68} rx={10.73} ry={14.05} fill="#3f3d56" /> + <path + d="M91.8 463.18a51.13 51.13 0 004-5.88l-28.2-4.63 30.5.22a51.54 51.54 0 001-40.73l-40.91 21.23 37.71-27.74A51.41 51.41 0 1011 463.18a51.16 51.16 0 00-5.86 9.37l36.6 19-39-13.1a51.45 51.45 0 008.29 48.27 51.4 51.4 0 1080.8 0 51.41 51.41 0 000-63.56z" + fill="#fff" + /> + <path + d="M0 494.96a51.16 51.16 0 0011 31.78 51.4 51.4 0 1080.8 0C98.69 518 0 489.19 0 494.96z" + opacity={0.1} + /> + </svg> +); diff --git a/src/components/AuthUser/Dashboard/HomePage/NavBar.tsx b/src/components/AuthUser/Dashboard/HomePage/NavBar.tsx new file mode 100644 index 0000000..3d61c75 --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/NavBar.tsx @@ -0,0 +1,69 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Tabs, Tab } from '@material-ui/core'; +import HomeIcon from '@material-ui/icons/Home'; +import ImportContactsIcon from '@material-ui/icons/ImportContacts'; +import AccountCircleIcon from '@material-ui/icons/AccountCircle'; + +const useStyles = makeStyles(() => ({ + tabs: { + color: 'white', + paddingLeft: '25px', + paddingRight: '25px', + paddingTop: '8px', + paddingBottom: '35px', + width: '100%', + flexWrap: 'wrap', + }, + tabPan: { + paddingLeft: '56px', + paddingRight: '56px', + }, + tabIcon: { + paddingRight: '10px', + fontSize: '38px', + }, + rightAlign: { + marginLeft: 'auto', + }, +})); + +export const NavBar: FC = () => { + const classes = useStyles(); + + const [value, setValue] = React.useState(0); + + const handleChange = ( + event: React.ChangeEvent<unknown>, + newValue: number, + ): void => { + setValue(newValue); + }; + + return ( + <Tabs + variant="scrollable" + scrollButtons="on" + onChange={handleChange} + value={value} + className={classes.tabs} + TabIndicatorProps={{ style: { display: 'none' } }} + > + <Tab + label="HomePage" + icon={<HomeIcon className={classes.tabIcon} />} + className={classes.tabPan} + /> + <Tab + label="Reservation" + icon={<ImportContactsIcon className={classes.tabIcon} />} + className={`${classes.tabPan} ${classes.rightAlign}`} + /> + <Tab + label="Profile" + className={classes.tabPan} + icon={<AccountCircleIcon className={classes.tabIcon} />} + /> + </Tabs> + ); +}; diff --git a/src/components/AuthUser/Dashboard/HomePage/NavBarLogin.tsx b/src/components/AuthUser/Dashboard/HomePage/NavBarLogin.tsx new file mode 100644 index 0000000..92d0045 --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/NavBarLogin.tsx @@ -0,0 +1,56 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Tabs, Tab } from '@material-ui/core'; +import LockIcon from '@material-ui/icons/Lock'; + +const useStyles = makeStyles(() => ({ + tabs: { + color: 'white', + paddingLeft: '25px', + paddingRight: '25px', + paddingTop: '8px', + paddingBottom: '35px', + }, + tabPan: { + paddingLeft: '56px', + paddingRight: '56px', + }, + tabIcon: { + paddingRight: '10px', + fontSize: '38px', + }, + rightAlign: { + marginLeft: 'auto', + backgroundColor: '#FFFFFF', + }, +})); + +export const NavBarLogin: FC = () => { + const classes = useStyles(); + + const [value, setValue] = React.useState(0); + + const handleChange = ( + event: React.ChangeEvent<unknown>, + newValue: number, + ): void => { + setValue(newValue); + }; + + return ( + <Tabs + textColor="primary" + onChange={handleChange} + value={value} + className={classes.tabs} + TabIndicatorProps={{ style: { display: 'none' } }} + > + <Tab label="" className={classes.tabPan} /> + <Tab + label="Login" + icon={<LockIcon className={classes.tabIcon} />} + className={`${classes.tabPan} ${classes.rightAlign}`} + /> + </Tabs> + ); +}; diff --git a/src/components/AuthUser/Dashboard/HomePage/Numbers.tsx b/src/components/AuthUser/Dashboard/HomePage/Numbers.tsx new file mode 100644 index 0000000..20f38c8 --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/Numbers.tsx @@ -0,0 +1,137 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Grid, Typography, CardContent, Card, Hidden } from '@material-ui/core'; +import LocalTaxiIcon from '@material-ui/icons/LocalTaxi'; +import LocationCityIcon from '@material-ui/icons/LocationCity'; +import PeopleIcon from '@material-ui/icons/People'; + +const useStyles = makeStyles(() => ({ + root: { + minHeight: '100vh', + backgroundImage: `url(${'/assets/bg3.png'})`, + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + }, + rightAlign: { + marginLeft: 'auto', + }, + whiteText: { + color: 'white', + }, + imageIcon: { + maxHeight: '50%', + }, + paddingBottom: { + paddingBottom: '65px', + }, + paddingTop: { + paddingTop: '65px', + }, + bodyIcon: { + fontSize: '90px', + paddingBottom: '10px', + paddingTop: '10px', + }, + contIcon: { + width: '100%', + left: '0', + right: '0', + }, + noShadow: { + border: 'none', + boxShadow: 'none', + backgroundColor: 'transparent', + }, +})); + +export const Numbers: FC = () => { + const classes = useStyles(); + + return ( + <Grid item container alignItems="stretch" style={{ paddingTop: '20px' }}> + <Grid item xs={1} lg={2} /> + + <Grid item xs={4} lg={2} component={Card} className={classes.noShadow}> + <CardContent> + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <LocalTaxiIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h4" align="center"> + 300 + </Typography> + + <Typography variant="h6" align="center"> + Rides Offered + </Typography> + </CardContent> + </Grid> + + <Grid item xs={2} lg={1} /> + + <Grid item xs={4} lg={2} component={Card} className={classes.noShadow}> + <CardContent> + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <LocationCityIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h4" align="center"> + 25000 + </Typography> + + <Typography variant="h6" align="center"> + Kilometers + </Typography> + </CardContent> + </Grid> + + <Grid item xs={1} /> + + <Hidden lgUp> + <Grid item xs={4} /> + </Hidden> + + <Grid item xs={4} lg={2} component={Card} className={classes.noShadow}> + <CardContent> + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <PeopleIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h4" align="center"> + 225 + </Typography> + + <Typography variant="h6" align="center"> + People who used our service + </Typography> + </CardContent> + </Grid> + + <Grid item xs={4} lg={2} /> + </Grid> + ); +}; diff --git a/src/components/AuthUser/Dashboard/HomePage/Steps.tsx b/src/components/AuthUser/Dashboard/HomePage/Steps.tsx new file mode 100644 index 0000000..2452c59 --- /dev/null +++ b/src/components/AuthUser/Dashboard/HomePage/Steps.tsx @@ -0,0 +1,132 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Grid, Typography, CardContent, Card, Hidden } from '@material-ui/core'; +import VpnKeyIcon from '@material-ui/icons/VpnKey'; +import BookmarkIcon from '@material-ui/icons/Bookmark'; +import RoomIcon from '@material-ui/icons/Room'; + +const useStyles = makeStyles(() => ({ + bodyIcon: { + fontSize: '90px', + paddingBottom: '10px', + paddingTop: '10px', + }, + paddingBot: { + paddingBottom: '40px', + }, + noShadow: { + border: 'none', + boxShadow: 'none', + backgroundColor: 'transparent', + }, +})); + +export const Steps: FC = () => { + const classes = useStyles(); + + return ( + <Grid item container alignItems="stretch"> + <Grid item xs={1} lg={2} /> + + <Grid item xs={10} lg={2} component={Card} className={classes.paddingBot}> + <CardContent> + <Typography variant="h4" align="center"> + STEP 1 + </Typography> + + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <VpnKeyIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h6"> + Log In or Register an account on the site. Fill all the fields + related to your personal information. + </Typography> + </CardContent> + </Grid> + + <Grid item xs={1} /> + + <Hidden lgUp> + <Grid + item + xs={12} + component={Card} + className={`${classes.paddingBot} ${classes.noShadow}`} + /> + <Grid item xs={1} /> + </Hidden> + + <Grid item xs={10} lg={2} component={Card} className={classes.paddingBot}> + <CardContent> + <Typography variant="h4" align="center"> + STEP 2 + </Typography> + + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <BookmarkIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h6"> + Book in the reservation section a free ride at least 48h than your + appointment + </Typography> + </CardContent> + </Grid> + + <Grid item xs={1} /> + <Hidden lgUp> + <Grid + item + xs={12} + component={Card} + className={`${classes.paddingBot} ${classes.noShadow}`} + /> + <Grid item xs={1} /> + </Hidden> + + <Grid item xs={10} lg={2} component={Card} className={classes.paddingBot}> + <CardContent> + <Typography variant="h4" align="center"> + STEP 3 + </Typography> + + <Grid + container + spacing={0} + direction="column" + alignItems="center" + justify="center" + > + <Grid item xs={12}> + <RoomIcon color="primary" className={classes.bodyIcon} /> + </Grid> + </Grid> + + <Typography variant="h6"> + Wait your free drive compfortably at home and reach the place you + have booked in the reservation easily! + </Typography> + </CardContent> + </Grid> + + <Grid item xs={1} lg={2} /> + </Grid> + ); +}; diff --git a/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.md b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.md new file mode 100644 index 0000000..d696537 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.md @@ -0,0 +1,5 @@ +Profile page for all type of users + +```js +<ProfilePage /> +``` \ No newline at end of file diff --git a/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.test.tsx b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.test.tsx new file mode 100644 index 0000000..8b51893 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.test.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ProfilePage } from './ProfilePage'; + +describe('<ProfilePage />', () => { + it('renders without crashing', () => { + const wrapper = render(<ProfilePage />); + expect(wrapper.queryByTestId('ProfilePage')).toBeTruthy(); + }); +}); diff --git a/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.tsx b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.tsx new file mode 100644 index 0000000..bf86148 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ProfilePage/ProfilePage.tsx @@ -0,0 +1,23 @@ +import React, { FC } from 'react'; +import Button from '@material-ui/core/Button'; +import axios from 'axios'; +import { NonAuthRoutes } from 'api/routes'; +import { useHistory } from 'react-router-dom'; + +export const ProfilePage: FC = () => { + const history = useHistory(); + + const logout = (): void => { + axios + .post('/api/web/login/logout') + .then(() => history.replace(NonAuthRoutes.home)); + }; + + return ( + <div data-testid="ProfilePage"> + <Button variant="outlined" color="default" onClick={logout}> + Logout + </Button> + </div> + ); +}; diff --git a/src/components/AuthUser/Dashboard/ReservationPage/Reservation/Reservation.tsx b/src/components/AuthUser/Dashboard/ReservationPage/Reservation/Reservation.tsx new file mode 100644 index 0000000..7bdcd17 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ReservationPage/Reservation/Reservation.tsx @@ -0,0 +1,60 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, +} from '@material-ui/core'; + +const useStyles = makeStyles(() => ({ + noShadow: { + border: 'none', + boxShadow: 'none', + backgroundColor: 'transparent', + }, +})); + +function createData( + name: string, + value: string, +): { name: string; value: string } { + return { name, value }; +} + +const rows = [ + createData('From:', 'Via Di Quel Bozen, 45, 39037'), + createData('Date:', '29 / 07 / 2021'), + createData('Time:', '12:15'), + createData('To:', 'Via del Krankenhaus, 7, 39037'), +]; + +export const Reservation: FC = () => { + const classes = useStyles(); + + return ( + <TableContainer component={Paper}> + <Table aria-label="simple table"> + <TableHead> + <TableRow> + <TableCell>DriveToHospital </TableCell> + </TableRow> + </TableHead> + + <TableBody> + {rows.map((row) => ( + <TableRow key={row.name}> + <TableCell component="th" scope="row"> + {row.name} + </TableCell> + <TableCell align="right">{row.value}</TableCell> + </TableRow> + ))} + </TableBody> + </Table> + </TableContainer> + ); +}; diff --git a/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.test.tsx b/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.test.tsx new file mode 100644 index 0000000..628b7b5 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.test.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ReservationPage } from './ReservationPage'; + +describe('<ReservationPage />', () => { + it('renders without crashing', () => { + const wrapper = render(<ReservationPage />); + expect(wrapper.queryByTestId('Reservation')).toBeTruthy(); + }); +}); diff --git a/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.tsx b/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.tsx new file mode 100644 index 0000000..9e176c0 --- /dev/null +++ b/src/components/AuthUser/Dashboard/ReservationPage/ReservationPage.tsx @@ -0,0 +1,257 @@ +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { + CssBaseline, + Grid, + Typography, + Hidden, + createMuiTheme, + responsiveFontSizes, + MuiThemeProvider, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + TextField, + Button, +} from '@material-ui/core'; +import AddIcon from '@material-ui/icons/Add'; +import Fab from '@material-ui/core/Fab'; + +import { Reservation } from 'components/AuthUser/Dashboard/ReservationPage/Reservation/Reservation'; +import { NavBar } from '../HomePage/NavBar'; + +let themeResp = createMuiTheme(); +themeResp = responsiveFontSizes(themeResp); + +const useStyles = makeStyles(() => ({ + root: { + minHeight: '36vh', + backgroundImage: `url(${'/assets/bg7.png'})`, + backgroundRepeat: 'no-repeat', + backgroundSize: 'cover', + }, + rightAlign: { + marginLeft: 'auto', + }, + whiteText: { + color: 'white', + }, + imageIcon: { + maxHeight: '50%', + }, + paddingBottom: { + paddingBottom: '65px', + }, + paddingTop: { + paddingTop: '65px', + }, + bodyIcon: { + fontSize: '90px', + paddingBottom: '10px', + paddingTop: '10px', + }, + contIcon: { + width: '100%', + left: '0', + right: '0', + }, + noShadow: { + border: 'none', + boxShadow: 'none', + backgroundColor: 'transparent', + }, + extendedIcon: { + fontSize: '50px', + }, + fab: { + margin: '10px 90px 80px 10px', + bottom: '0', + right: '0', + position: 'fixed', + padding: '45px', + }, + fabSmall: { + margin: '10px 45px 70px 10px', + bottom: '0', + right: '0', + position: 'fixed', + padding: '35px', + }, +})); + +export const ReservationPage: FC = () => { + const classes = useStyles(); + + const [open, setOpen] = React.useState(false); + + const handleClickOpen = (): void => { + setOpen(true); + }; + + const handleClose = (): void => { + setOpen(false); + }; + + return ( + <div data-testid="Reservation"> + <Grid container direction="column" className={classes.paddingBottom}> + <div className={classes.root}> + <CssBaseline /> + + <Grid item> + <NavBar /> + </Grid> + + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + > + <DialogTitle id="form-dialog-title"> + Book New Reservation + </DialogTitle> + <DialogContent> + <DialogContentText> + Write here below the details of your next reservation + </DialogContentText> + <TextField + autoFocus + margin="dense" + id="name" + label="Name Reservation" + type="text" + fullWidth + /> + <TextField + autoFocus + margin="dense" + id="name" + label="Date" + type="date" + fullWidth + InputLabelProps={{ shrink: true }} + /> + <TextField + autoFocus + margin="dense" + id="name" + label="Department Time" + type="time" + fullWidth + InputLabelProps={{ shrink: true }} + /> + <TextField + autoFocus + margin="dense" + id="name" + label="Destination" + type="text" + fullWidth + /> + </DialogContent> + <DialogActions> + <Button onClick={handleClose} color="primary"> + Cancel + </Button> + <Button onClick={handleClose} color="primary" variant="contained"> + Subscribe + </Button> + </DialogActions> + </Dialog> + + <MuiThemeProvider theme={themeResp}> + <Grid item container className={classes.paddingBottom}> + <Grid item xs={1} md={2} lg={2} /> + + <Grid item xs={10} md={6} lg={4}> + <Typography variant="h2" className={classes.whiteText}> + Plan Here Your + </Typography> + <Typography variant="h1" className={classes.whiteText}> + RESERVATIONS + </Typography> + </Grid> + + <Grid item xs={1} /> + </Grid> + </MuiThemeProvider> + </div> + + <Hidden mdDown> + <Fab + color="primary" + size="large" + aria-label="add" + className={classes.fab} + onClick={handleClickOpen} + > + <AddIcon className={classes.extendedIcon} /> + </Fab> + </Hidden> + + <Hidden lgUp> + <Fab + color="primary" + size="small" + aria-label="add" + className={classes.fabSmall} + > + <AddIcon /> + </Fab> + </Hidden> + + <Grid item container className={classes.paddingTop}> + <Grid item xs={2} /> + <Grid item xs={8}> + <Typography variant="h3">Your Next Reservations</Typography> + </Grid> + <Grid item xs={2} /> + </Grid> + + <Grid item container style={{ paddingTop: '20px' }}> + <Grid item xs={1} lg={2} /> + <Grid item xs={10} lg={8}> + <Reservation /> + </Grid> + <Grid item xs={1} lg={2} /> + </Grid> + + <Grid item container style={{ paddingTop: '20px' }}> + <Grid item xs={1} lg={2} /> + <Grid item xs={10} lg={8}> + <Reservation /> + </Grid> + <Grid item xs={1} lg={2} /> + </Grid> + + <Grid item container style={{ paddingTop: '20px' }}> + <Grid item xs={1} lg={2} /> + <Grid item xs={10} lg={8}> + <Reservation /> + </Grid> + <Grid item xs={1} lg={2} /> + </Grid> + + <Grid item container className={classes.paddingTop}> + <Grid item xs={2} /> + <Grid item xs={8}> + <Typography variant="h3" align="right"> + Your Past Reservations + </Typography> + </Grid> + <Grid item xs={2} /> + </Grid> + + <Grid item container style={{ paddingTop: '20px' }}> + <Grid item xs={1} lg={2} /> + <Grid item xs={10} lg={8}> + <Reservation /> + </Grid> + <Grid item xs={1} lg={2} /> + </Grid> + </Grid> + </div> + ); +}; -- GitLab