aboutsummaryrefslogtreecommitdiff
path: root/src/pages
diff options
context:
space:
mode:
authorEugene Sokolov <eug-vs@keemail.me>2020-06-14 20:44:40 +0300
committerGitHub <noreply@github.com>2020-06-14 20:44:40 +0300
commit65e41d1d8a3844a6d7268340f5d88b5957e2355d (patch)
tree3d455f133b5afa1e6a1c30c4589ef3db39dd4c4e /src/pages
parent99b44bc80fa3228131a05fccb13f75ff8a46b116 (diff)
parentfbe489c83e9ef4c03b87624a4dec66de61af364a (diff)
downloadwhich-ui-65e41d1d8a3844a6d7268340f5d88b5957e2355d.tar.gz
Merge pull request #33 from ilyayudovin/pages
divide src into Pages and Components directories
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/AuthPage/AuthPage.tsx14
-rw-r--r--src/pages/AuthPage/SignInForm.tsx54
-rw-r--r--src/pages/FeedPage/FeedPage.tsx19
-rw-r--r--src/pages/ProfilePage/ProfileInfo.tsx63
-rw-r--r--src/pages/ProfilePage/ProfilePage.tsx32
5 files changed, 182 insertions, 0 deletions
diff --git a/src/pages/AuthPage/AuthPage.tsx b/src/pages/AuthPage/AuthPage.tsx
new file mode 100644
index 0000000..d9c43d3
--- /dev/null
+++ b/src/pages/AuthPage/AuthPage.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import { User } from '../../types';
+import SignInForm from './SignInForm';
+
+interface PropTypes {
+ setUser: (newUser: User | undefined) => void;
+}
+
+const AuthPage: React.FC<PropTypes> = ({ setUser }) => {
+ return <SignInForm setUser={setUser} />;
+};
+
+export default AuthPage;
+
diff --git a/src/pages/AuthPage/SignInForm.tsx b/src/pages/AuthPage/SignInForm.tsx
new file mode 100644
index 0000000..6e27535
--- /dev/null
+++ b/src/pages/AuthPage/SignInForm.tsx
@@ -0,0 +1,54 @@
+import React, { useRef } from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+import TextField from '@material-ui/core/TextField';
+import Button from '@material-ui/core/Button';
+import { User } from '../../types';
+import { get } from '../../requests';
+
+interface PropTypes {
+ setUser: (newUser: User) => void;
+}
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ '& > *': {
+ margin: theme.spacing(1),
+ width: '25ch'
+ },
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ textAlign: 'center'
+ }
+}));
+
+const SignInForm: React.FC<PropTypes> = ({ setUser }) => {
+ const classes = useStyles();
+ const inputRef = useRef<HTMLInputElement>();
+
+ const onClick = () => {
+ const username = inputRef.current?.value;
+ if (username) {
+ get(`/users?name=${username}`).then(response => {
+ const user = response.data[0];
+ setUser(user);
+ localStorage.setItem('userId', user._id);
+ });
+ }
+ };
+
+ return (
+ <form className={classes.root} noValidate autoComplete="off">
+ <h1>Sign In</h1>
+ <TextField inputRef={inputRef} id="standard-basic" label="Login" />
+ <TextField
+ id="standard-password-input"
+ label="Password"
+ type="password"
+ />
+ <Button variant="contained" onClick={onClick}>submit</Button>
+ </form>
+ );
+};
+
+export default SignInForm;
diff --git a/src/pages/FeedPage/FeedPage.tsx b/src/pages/FeedPage/FeedPage.tsx
new file mode 100644
index 0000000..03bacfd
--- /dev/null
+++ b/src/pages/FeedPage/FeedPage.tsx
@@ -0,0 +1,19 @@
+import React, { useState, useEffect } from 'react';
+import { Poll } from '../../types';
+import Feed from '../../components/Feed/Feed';
+import { get } from '../../requests';
+
+const FeedPage: React.FC = () => {
+ const [polls, setPolls] = useState<Poll[]>([]);
+
+ useEffect(() => {
+ get('/polls').then(response => {
+ setPolls(response.data);
+ });
+ }, []);
+
+ return <Feed polls={polls} />;
+};
+
+export default FeedPage;
+
diff --git a/src/pages/ProfilePage/ProfileInfo.tsx b/src/pages/ProfilePage/ProfileInfo.tsx
new file mode 100644
index 0000000..c2f242a
--- /dev/null
+++ b/src/pages/ProfilePage/ProfileInfo.tsx
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Avatar } from '@material-ui/core/';
+import { makeStyles } from '@material-ui/core/styles';
+import Button from '@material-ui/core/Button/Button';
+import { User } from '../../types';
+
+interface PropTypes {
+ user: User | undefined;
+ logOut: () => void;
+}
+
+const useStyles = makeStyles({
+ avatar: {
+ margin: '0 auto',
+ width: 150,
+ height: 150,
+ marginBottom: 10
+ },
+ name: {
+ fontSize: 20,
+ textAlign: 'center'
+ },
+ profileMenu: {
+ display: 'flex',
+ width: '100%',
+ height: 50,
+ borderBottom: '1px solid lightgray',
+ margin: '50px 0'
+ },
+ menuButton: {
+ width: 200,
+ height: 50,
+ paddingTop: 15,
+ textAlign: 'center'
+ }
+});
+
+const ProfileInfo: React.FC<PropTypes> = ({ user, logOut }) => {
+ const classes = useStyles();
+
+ return (
+ <div>
+ <Avatar className={classes.avatar} src={user?.avatarUrl} />
+ <div className={classes.name}>
+ {user?.name}
+ </div>
+ <div className={classes.profileMenu}>
+ <div style={{ borderBottom: '1px solid green', color: 'green' }} className={classes.menuButton}>
+ Polls
+ </div>
+ <div className={classes.menuButton}>
+ Followers
+ </div>
+ <div className={classes.menuButton}>
+ Following
+ </div>
+ </div>
+ <Button variant="contained" onClick={logOut}>Log Out</Button>
+ </div>
+ );
+};
+
+export default ProfileInfo;
diff --git a/src/pages/ProfilePage/ProfilePage.tsx b/src/pages/ProfilePage/ProfilePage.tsx
new file mode 100644
index 0000000..1dd71d3
--- /dev/null
+++ b/src/pages/ProfilePage/ProfilePage.tsx
@@ -0,0 +1,32 @@
+import React, { useState } from 'react';
+import { User, Poll } from '../../types';
+import ProfileInfo from './ProfileInfo';
+import Feed from '../../components/Feed/Feed';
+import { get } from '../../requests';
+
+interface PropTypes {
+ logOut: () => void;
+ id: string;
+}
+
+const ProfilePage: React.FC<PropTypes> = ({ logOut, id }) => {
+ const [userInfo, setUserInfo] = useState<User>();
+ const [polls, setPolls] = useState<Poll[]>([]);
+
+ get(`/users/${id}`).then(response => {
+ setUserInfo(response.data);
+ });
+
+ get(`/profiles/${id}`).then(response => {
+ setPolls(response.data);
+ });
+
+ return (
+ <>
+ <ProfileInfo user={userInfo} logOut={logOut} />
+ <Feed polls={polls} />
+ </>
+ );
+};
+
+export default ProfilePage;