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.js | 88 ------------------------ src/pages/Profile/Profile.tsx | 95 ++++++++++++++++++++++++++ src/pages/Profile/Registration.tsx | 85 +++++++++++++++++++++++ src/pages/Profile/Registration/Registration.js | 80 ---------------------- 4 files changed, 180 insertions(+), 168 deletions(-) delete mode 100644 src/pages/Profile/Profile.js create mode 100644 src/pages/Profile/Profile.tsx create mode 100644 src/pages/Profile/Registration.tsx delete mode 100644 src/pages/Profile/Registration/Registration.js (limited to 'src/pages/Profile') diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js deleted file mode 100644 index 65c3734..0000000 --- a/src/pages/Profile/Profile.js +++ /dev/null @@ -1,88 +0,0 @@ -import React, { useState, useEffect } from 'react'; - -import { - Button, - makeStyles, -} from '@material-ui/core'; - -import Registration from './Registration/Registration'; -import { - Window, - ContentSection, - SmartList, -} from 'react-benzin'; - -import SolutionCard from '../../components/SolutionCard/SolutionCard'; - -import { get } from '../../requests'; - - -const useStyles = makeStyles(theme => ({ - primary: { - padding: theme.spacing(4), - }, - cell: { - padding: theme.spacing(5), - }, -})); - - -const Profile = ({ user, setUser }) => { - const classes = useStyles(); - - const [profileSolutions, setProfileSolutions] = useState([]); - - 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) => { - setProfileSolutions(profileSolutions.filter((solution => solution.id !== id))); - }; - - const renderItem = ({ 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; 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; diff --git a/src/pages/Profile/Registration.tsx b/src/pages/Profile/Registration.tsx new file mode 100644 index 0000000..30e357d --- /dev/null +++ b/src/pages/Profile/Registration.tsx @@ -0,0 +1,85 @@ +import React, {useState} from 'react'; + +import { + TextField, + Button, + Checkbox, + FormControlLabel, + Grid, +} from '@material-ui/core'; +import { User } from '../../types'; + +import { ContentSection } from 'react-benzin'; +import { get, post } from '../../requests'; + + +interface PropTypes { + setUser: (user: User) => void; +} + +const Registration: React.FC<PropTypes> = ({ setUser }) => { + + const [username, setUsername] = useState<string>(''); + const [isRememberMe, setIsRememberMe] = useState<boolean>(false); + + const handleChange = (event: React.ChangeEvent<HTMLInputElement>): void => { + setUsername(event.target.value); + }; + + const handleCheck = (event: React.ChangeEvent<HTMLInputElement>): void => { + setIsRememberMe(event.target.checked); + }; + + const handleSubmit = () => { + if (username !== '') { + post('users/', { username }) + .then(response => { + const user = response.data; + setUser(user); + if (isRememberMe) { + localStorage.setItem('userId', user.id); + } + }) + .catch(err => { + get('users/').then(response => { + const user = response.data.filter((user: User) => user.username === username)[0]; + setUser(user); + if (isRememberMe) { + localStorage.setItem('userId', user.id); + } + }); + }); + } + }; + + return ( + <ContentSection sectionName="Tell us who you are"> + <p> Choose yourself a username to track your progress and compete with others: </p> + <Grid container direction="column"> + <Grid item> + <TextField + variant="outlined" + color="secondary" + label="Username" + value={username} + onChange={handleChange} + /> + </Grid> + <Grid item> + <FormControlLabel + control={<Checkbox color="secondary" onChange={handleCheck} />} + label="Remember me" + /> + </Grid> + <Grid item> + <Button variant="contained" color="secondary" onClick={handleSubmit}> + Submit! + </Button> + </Grid> + </Grid> + </ContentSection> + ); +}; + + +export default Registration; diff --git a/src/pages/Profile/Registration/Registration.js b/src/pages/Profile/Registration/Registration.js deleted file mode 100644 index b2d5503..0000000 --- a/src/pages/Profile/Registration/Registration.js +++ /dev/null @@ -1,80 +0,0 @@ -import React, {useState} from 'react'; - -import { - TextField, - Button, - Checkbox, - FormControlLabel, - Grid, -} from '@material-ui/core'; - -import { ContentSection } from 'react-benzin'; -import { get, post } from '../../../requests'; - - -const Registration = ({ setUser }) => { - - const [username, setUsername] = useState(''); - const [isRememberMe, setIsRememberMe] = useState(false); - - const handleChange = (event) => { - setUsername(event.target.value); - }; - - const handleCheck = (event) => { - setIsRememberMe(event.target.checked); - }; - - const handleSubmit = () => { - if (username !== '') { - post('users/', { username }) - .then(response => { - const user = response.data; - setUser(user); - if (isRememberMe) { - localStorage.setItem('userId', user.id); - } - }) - .catch(err => { - get('users/').then(response => { - const user = response.data.filter(user => user.username === username)[0]; - setUser(user); - if (isRememberMe) { - localStorage.setItem('userId', user.id); - } - }); - }); - } - }; - - return ( - <ContentSection sectionName="Tell us who you are"> - <p> Choose yourself a username to track your progress and compete with others: </p> - <Grid container direction="column"> - <Grid item> - <TextField - variant="outlined" - color="secondary" - label="Username" - value={username} - onChange={handleChange} - /> - </Grid> - <Grid item> - <FormControlLabel - control={<Checkbox color="secondary" onChange={handleCheck} />} - label="Remember me" - /> - </Grid> - <Grid item> - <Button variant="contained" color="secondary" onClick={handleSubmit}> - Submit! - </Button> - </Grid> - </Grid> - </ContentSection> - ); -}; - - -export default Registration; -- cgit v1.2.3