diff options
Diffstat (limited to 'src/containers/Profile/Profile.tsx')
| -rw-r--r-- | src/containers/Profile/Profile.tsx | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/src/containers/Profile/Profile.tsx b/src/containers/Profile/Profile.tsx new file mode 100644 index 0000000..7e929fb --- /dev/null +++ b/src/containers/Profile/Profile.tsx @@ -0,0 +1,53 @@ +import React, { useEffect, useMemo } from 'react'; +import { useHistory, useParams } from 'react-router-dom'; +import { Poll } from 'which-types'; +import { Container } from '@material-ui/core'; + +import ProfileInfo from './ProfileInfo'; +import PollsList from '../../components/PollsList/PollsList'; +import Loading from '../../components/Loading/Loading'; +import { useAuth } from '../../hooks/useAuth'; +import { useUser, useProfile } from '../../hooks/APIClient'; + + +const Profile: React.FC = () => { +  const history = useHistory(); +  const { username } = useParams(); +  const { user } = useAuth(); + +  const { data: userInfo, mutate: setUserInfo } = useUser(username); +  const { data: polls, mutate: mutatePolls, isValidating } = useProfile(username); + +  useEffect(() => { +    if (!username) { +      if (user) history.push(`/profile/${user.username}`); +      else history.push('/login'); +    } +  }, [username, history, user]); + + +  const totalVotes = useMemo(() => polls.reduce( +    (total: number, current: Poll) => { +      const { left, right } = current.contents; +      return total + left.votes + right.votes; +    }, 0 +  ), [polls]); + +  return ( +    <Container maxWidth="sm" disableGutters> +      <ProfileInfo +        userInfo={userInfo} +        setUserInfo={setUserInfo} +        savedPolls={polls.length} +        totalVotes={totalVotes} +      /> +      { +        isValidating && !polls +          ? <Loading /> +          : <PollsList polls={polls} mutate={mutatePolls} /> +      } +    </Container> +  ); +}; + +export default Profile;  |