aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorEugene Sokolov <eug-vs@keemail.me>2020-06-14 20:44:40 +0300
committerGitHub <noreply@github.com>2020-06-14 20:44:40 +0300
commit65e41d1d8a3844a6d7268340f5d88b5957e2355d (patch)
tree3d455f133b5afa1e6a1c30c4589ef3db39dd4c4e /src/components
parent99b44bc80fa3228131a05fccb13f75ff8a46b116 (diff)
parentfbe489c83e9ef4c03b87624a4dec66de61af364a (diff)
downloadwhich-ui-65e41d1d8a3844a6d7268340f5d88b5957e2355d.tar.gz
Merge pull request #33 from ilyayudovin/pages
divide src into Pages and Components directories
Diffstat (limited to 'src/components')
-rw-r--r--src/components/Feed/Feed.tsx29
-rw-r--r--src/components/Header/Header.tsx68
-rw-r--r--src/components/Header/SearchBar.tsx31
-rw-r--r--src/components/PollCard/PollCard.tsx100
4 files changed, 228 insertions, 0 deletions
diff --git a/src/components/Feed/Feed.tsx b/src/components/Feed/Feed.tsx
new file mode 100644
index 0000000..8dc3ec1
--- /dev/null
+++ b/src/components/Feed/Feed.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import { Poll } from '../../types';
+import PollCard from '../PollCard/PollCard';
+
+interface PropTypes {
+ polls: Poll[];
+}
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ position: 'relative',
+ maxWidth: theme.spacing(75),
+ margin: '0 auto'
+ }
+}));
+
+const Feed: React.FC<PropTypes> = ({ polls }) => {
+ const classes = useStyles();
+
+ return (
+ <div className={classes.root}>
+ {polls.map(poll => <PollCard poll={poll} key={poll._id} />)}
+ </div>
+ );
+};
+
+export default Feed;
+
diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx
new file mode 100644
index 0000000..0ee6b5f
--- /dev/null
+++ b/src/components/Header/Header.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import {
+ AppBar,
+ Toolbar,
+ IconButton,
+ Typography
+} from '@material-ui/core';
+import { makeStyles } from '@material-ui/core/styles';
+import AccountCircle from '@material-ui/icons/AccountCircle';
+import NotificationsIcon from '@material-ui/icons/Notifications';
+import HomeIcon from '@material-ui/icons/Home';
+
+import SearchBar from './SearchBar';
+
+interface PropTypes {
+ setPage: (newPage: string) => void;
+}
+
+const useStyles = makeStyles({
+ root: {
+ display: 'flex',
+ justifyContent: 'space-around',
+ width: '60%',
+ margin: 'auto'
+ },
+ logo: {
+ fontWeight: 'bold'
+ }
+});
+
+const Header: React.FC<PropTypes> = ({ setPage }) => {
+ const classes = useStyles();
+
+ const handleHome = (): void => {
+ setPage('feed');
+ };
+
+ const handleProfile = (): void => {
+ setPage('profile');
+ };
+
+ const handleNotifications = (): void => {};
+
+ return (
+ <AppBar position="fixed">
+ <Toolbar className={classes.root}>
+ <Typography variant="h5" className={classes.logo}>
+ Which
+ </Typography>
+ <SearchBar />
+ <div>
+ <IconButton onClick={handleHome}>
+ <HomeIcon />
+ </IconButton>
+ <IconButton onClick={handleNotifications}>
+ <NotificationsIcon />
+ </IconButton>
+ <IconButton onClick={handleProfile}>
+ <AccountCircle />
+ </IconButton>
+ </div>
+ </Toolbar>
+ </AppBar>
+ );
+};
+
+export default Header;
+
diff --git a/src/components/Header/SearchBar.tsx b/src/components/Header/SearchBar.tsx
new file mode 100644
index 0000000..182a1a4
--- /dev/null
+++ b/src/components/Header/SearchBar.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import SearchIcon from '@material-ui/icons/Search';
+import { InputBase } from '@material-ui/core';
+import { makeStyles } from '@material-ui/core/styles';
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ background: 'rgba(255, 255, 255, 0.5)',
+ borderRadius: '2px',
+ padding: theme.spacing(0.5),
+ display: 'flex',
+ alignItems: 'center'
+ }
+}));
+
+const SearchBar: React.FC = () => {
+ const classes = useStyles();
+
+ return (
+ <div className={classes.root}>
+ <SearchIcon />
+ <InputBase
+ placeholder="Search..."
+ />
+ </div>
+ );
+};
+
+
+export default SearchBar;
+
diff --git a/src/components/PollCard/PollCard.tsx b/src/components/PollCard/PollCard.tsx
new file mode 100644
index 0000000..8995a30
--- /dev/null
+++ b/src/components/PollCard/PollCard.tsx
@@ -0,0 +1,100 @@
+import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import {
+ Card,
+ CardActionArea,
+ CardMedia,
+ Avatar,
+ CardHeader
+} from '@material-ui/core/';
+import { Poll } from '../../types';
+
+interface PropTypes {
+ poll: Poll;
+}
+
+interface PercentageBarPropTypes {
+ value: number;
+ which: 'left' | 'right';
+}
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ maxWidth: theme.spacing(75),
+ height: theme.spacing(63),
+ margin: '20px auto'
+ },
+ images: {
+ height: theme.spacing(50),
+ width: theme.spacing(38)
+ },
+ imagesBlock: {
+ display: 'flex'
+ },
+ percentage: {
+ position: 'absolute',
+ color: 'white',
+ top: '86%',
+ fontSize: 20,
+ textShadow: '0 0 3px black'
+ },
+ percentageLeft: {
+ left: 30
+ },
+ percentageRight: {
+ right: 30
+ }
+}));
+
+
+const PercentageBar: React.FC<PercentageBarPropTypes> = ({ value, which }) => {
+ const classes = useStyles();
+ const positionClassName = which === 'left' ? 'percentageLeft' : 'percentageRight';
+
+ return (
+ <div className={`${classes.percentage} ${classes[positionClassName]}`}>
+ {value}
+ %
+ </div>
+ );
+};
+
+
+const PollCard: React.FC<PropTypes> = ({ poll }) => {
+ const classes = useStyles();
+ const { author, contents } = poll;
+
+ const leftPercentage = Math.round(100 * (contents.left.votes / (contents.left.votes + contents.right.votes)));
+ const rightPercentage = 100 - leftPercentage;
+
+
+ return (
+ <Card className={classes.root}>
+ <CardHeader
+ avatar={(
+ <Avatar aria-label="avatar" src={author.avatarUrl} alt={author.name[0].toUpperCase()} />
+ )}
+ title={author.name}
+ />
+ <div className={classes.imagesBlock}>
+ <CardActionArea>
+ <CardMedia
+ className={classes.images}
+ image={contents.left.url}
+ />
+ <PercentageBar value={leftPercentage} which="left" />
+ </CardActionArea>
+ <CardActionArea>
+ <CardMedia
+ className={classes.images}
+ image={contents.right.url}
+ />
+ <PercentageBar value={rightPercentage} which="right" />
+ </CardActionArea>
+ </div>
+ </Card>
+ );
+};
+
+export default PollCard;
+