From 146947a665dbc1d2960d2062a22a106de0c71062 Mon Sep 17 00:00:00 2001
From: eug-vs <eug-vs@keemail.me>
Date: Sat, 21 Mar 2020 15:44:40 +0300
Subject: chore: migrate profile page to Typescript :label:

---
 src/pages/Profile/Profile.tsx | 95 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)
 create mode 100644 src/pages/Profile/Profile.tsx

(limited to 'src/pages/Profile/Profile.tsx')

diff --git a/src/pages/Profile/Profile.tsx b/src/pages/Profile/Profile.tsx
new file mode 100644
index 0000000..bbf55f1
--- /dev/null
+++ b/src/pages/Profile/Profile.tsx
@@ -0,0 +1,95 @@
+import React, { useState, useEffect } from 'react';
+
+import {
+  Button,
+  makeStyles,
+} from '@material-ui/core';
+
+import Registration from './Registration';
+import {
+  Window,
+  ContentSection,
+  SmartList,
+} from 'react-benzin';
+import { User, Solution, RenderPropTypes } from '../../types';
+
+import SolutionCard from '../../components/SolutionCard/SolutionCard';
+
+import { get } from '../../requests';
+
+
+const useStyles = makeStyles(theme => ({
+  primary: {
+    padding: theme.spacing(4),
+  },
+  cell: {
+    padding: theme.spacing(5),
+  },
+}));
+
+
+interface PropTypes {
+  user: User;
+  setUser: (user: User) => void;
+}
+
+
+const Profile: React.FC<PropTypes> = ({ user, setUser }) => {
+  const classes = useStyles();
+
+  const [profileSolutions, setProfileSolutions] = useState<Solution[]>([]);
+
+  const handleLogout = () => {
+    setUser({ username: 'anonymous', id: null });
+    localStorage.clear();
+  };
+
+  useEffect(() => {
+    get(`solutions/?author=${user.id}`).then(response => {
+      setProfileSolutions(response.data.reverse());
+    });
+  }, [user]);
+
+  const removeSolution = (id: number): void => {
+    setProfileSolutions(profileSolutions.filter((solution => solution.id !== id)));
+  };
+
+  const renderItem: React.FC<RenderPropTypes> = ({ index, style }) => {
+    return (
+      <div style={style} className={classes.cell}>
+        <SolutionCard data={profileSolutions[index]} removeThisCard={removeSolution} />
+      </div>
+    );
+  };
+
+  return (
+    <>
+      <Window type="primary">
+        <div className={classes.primary}>
+          { user.id? (
+            <ContentSection sectionName={`Welcome back, ${user.username}!`}>
+              <p> Total amount of solutions: {profileSolutions.length} </p>
+              <p> You can always log out from your account! </p>
+              <Button variant="contained" color="secondary" onClick={handleLogout}>
+                Logout
+              </Button>
+            </ContentSection>
+          ): (
+            <Registration setUser={setUser} />
+          )
+          }
+        </div>
+      </Window>
+      <Window type="secondary" name="History">
+        <SmartList
+          itemSize={270}
+          itemCount={profileSolutions.length}
+          renderItem={renderItem}
+        />
+      </Window>
+    </>
+  )
+};
+
+
+export default Profile;
-- 
cgit v1.2.3


From 0267191d92814e753b966ce3bdfbd9b804b313d7 Mon Sep 17 00:00:00 2001
From: eug-vs <eug-vs@keemail.me>
Date: Sat, 21 Mar 2020 16:05:52 +0300
Subject: fix: add missing types

---
 src/pages/Profile/Profile.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/pages/Profile/Profile.tsx')

diff --git a/src/pages/Profile/Profile.tsx b/src/pages/Profile/Profile.tsx
index bbf55f1..83acb30 100644
--- a/src/pages/Profile/Profile.tsx
+++ b/src/pages/Profile/Profile.tsx
@@ -39,7 +39,7 @@ const Profile: React.FC<PropTypes> = ({ user, setUser }) => {
 
   const [profileSolutions, setProfileSolutions] = useState<Solution[]>([]);
 
-  const handleLogout = () => {
+  const handleLogout = (): void => {
     setUser({ username: 'anonymous', id: null });
     localStorage.clear();
   };
-- 
cgit v1.2.3

