diff options
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/Feed/Feed.tsx | 29 | ||||
| -rw-r--r-- | src/components/Header/Header.tsx | 68 | ||||
| -rw-r--r-- | src/components/Header/SearchBar.tsx | 31 | ||||
| -rw-r--r-- | src/components/PollCard/PollCard.tsx | 100 | 
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; +  |