aboutsummaryrefslogtreecommitdiff
path: root/src/containers/Profile/Profile.tsx
diff options
context:
space:
mode:
authorEugene Sokolov <eug-vs@keemail.me>2020-08-10 13:51:11 +0300
committerGitHub <noreply@github.com>2020-08-10 13:51:11 +0300
commit823c82383424616bc7c2562e2a763321edb6050c (patch)
tree1d5220d68ab8ebb392c87038f2fc24cc72b28775 /src/containers/Profile/Profile.tsx
parent70d20b76f042a519e8e164279dfa31b5ce027d44 (diff)
parent78218c0f3427ad79de003ac59cffb99b08f0ae7d (diff)
downloadwhich-ui-823c82383424616bc7c2562e2a763321edb6050c.tar.gz
Merge pull request #74 from which-ecosystem/fetching
SWR feat. crazy refactor
Diffstat (limited to 'src/containers/Profile/Profile.tsx')
-rw-r--r--src/containers/Profile/Profile.tsx53
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;