aboutsummaryrefslogtreecommitdiff
path: root/src/components/SolutionCard/SolutionCard.tsx
diff options
context:
space:
mode:
authorEugene Sokolov <eug-vs@keemail.me>2020-03-21 17:59:48 +0300
committerGitHub <noreply@github.com>2020-03-21 17:59:48 +0300
commite89a7a79622d25561dc80a8489ae1f6022aebd73 (patch)
treee115938b26ee6019b4c349f52bd98fc34a4575e9 /src/components/SolutionCard/SolutionCard.tsx
parentfe750a9aadfb451b9537bb3cdd79581ef5120c07 (diff)
parent7f8ab6802c68c46f988ef012fdc88b09e43a9e54 (diff)
downloadchrono-cube-ui-e89a7a79622d25561dc80a8489ae1f6022aebd73.tar.gz
Merge pull request #48 from eug-vs/typescript
Migrate project to Typescript
Diffstat (limited to 'src/components/SolutionCard/SolutionCard.tsx')
-rw-r--r--src/components/SolutionCard/SolutionCard.tsx122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/components/SolutionCard/SolutionCard.tsx b/src/components/SolutionCard/SolutionCard.tsx
new file mode 100644
index 0000000..5adbff9
--- /dev/null
+++ b/src/components/SolutionCard/SolutionCard.tsx
@@ -0,0 +1,122 @@
+import React, { useState } from 'react';
+
+import {
+ Typography,
+ Card,
+ CardHeader,
+ CardContent,
+ IconButton,
+ Avatar,
+ Grid,
+ Menu,
+ MenuItem,
+} from '@material-ui/core';
+import { Solution } from '../../types';
+
+import { makeStyles } from '@material-ui/core/styles';
+import TimerIcon from '@material-ui/icons/Timer';
+import MoreVertIcon from '@material-ui/icons/MoreVert';
+import DeleteIcon from '@material-ui/icons/Delete';
+
+import { del } from '../../requests';
+
+
+const DATE_FORMAT = {
+ month: 'long',
+ day: 'numeric',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+};
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ padding: theme.spacing(1),
+ background: theme.palette.background.elevation2,
+
+ '& .MuiTypography-h3': {
+ margin: theme.spacing(2),
+ },
+ },
+ menu: {
+ '& ul': {
+ background: theme.palette.background.elevation3,
+ }
+ },
+}));
+
+
+interface PropTypes {
+ data: Solution;
+ removeThisCard: (id: number) => void;
+}
+
+
+const SolutionCard: React.FC<PropTypes> = ({ data, removeThisCard }) => {
+ const classes = useStyles();
+ const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
+
+ const author = data.author? data.author.username : 'anonymous';
+ const date = new Date(data.date);
+
+ const handleOpenMenu = (event: React.MouseEvent<HTMLButtonElement>): void => {
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = (): void => {
+ setAnchorEl(null);
+ };
+
+ const handleDelete = (): void => {
+ del(`solutions/${data.id}/`).then(() => {
+ removeThisCard(data.id);
+ });
+ handleClose();
+ };
+
+ return (
+ <Card className={classes.root}>
+ <CardHeader
+ avatar={
+ author === 'anonymous'?
+ (<Avatar/>)
+ :
+ (<Avatar>{author[0].toUpperCase()}</Avatar>)
+ }
+ title={author}
+ subheader={date.toLocaleString('default', DATE_FORMAT)}
+ action={
+ <IconButton onClick={handleOpenMenu}>
+ <MoreVertIcon />
+ </IconButton>
+ }
+ />
+ <Menu
+ anchorEl={anchorEl}
+ open={Boolean(anchorEl)}
+ keepMounted
+ onClose={handleClose}
+ className={classes.menu}
+ >
+ <MenuItem onClick={handleDelete}>
+ <DeleteIcon />
+ Delete
+ </MenuItem>
+ </Menu>
+ <CardContent>
+ <Grid container direction="row" justify="center" alignItems="center">
+ <Grid item>
+ <TimerIcon/>
+ </Grid>
+ <Grid item>
+ <Typography variant="h3" color="primary">
+ { data.result }
+ </Typography>
+ </Grid>
+ </Grid>
+ </CardContent>
+ </Card>
+ )
+};
+
+export default SolutionCard;