From 4aca700168130d6193e52f332fe8a63512db8f44 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 18 Jun 2020 17:24:43 +0200 Subject: [PATCH 01/38] installed material-ui and first setup of navbar --- package-lock.json | 13 ++++ package.json | 2 + public/index.html | 28 ++------ src/App.js | 1 + src/components/Navigation/index.js | 101 +++++++++++++++++++++++------ src/index.js | 7 +- 6 files changed, 103 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index b489884..7835bc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1306,6 +1306,14 @@ } } }, + "@material-ui/icons": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", + "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, "@material-ui/styles": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz", @@ -5761,6 +5769,11 @@ } } }, + "fontsource-roboto": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/fontsource-roboto/-/fontsource-roboto-2.1.4.tgz", + "integrity": "sha512-2NP2idRiX19pjwdNV0NvPaiDziIAFYg6IogPuQUJwVYq8BYqPDWRAGX7maQQFzvEvAUt1u9xaRGVwE7SIeCKDA==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", diff --git a/package.json b/package.json index 97c2ae7..172622a 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,13 @@ "private": true, "dependencies": { "@material-ui/core": "^4.10.2", + "@material-ui/icons": "^4.9.1", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", "axios": "^0.19.2", "bootstrap": "^4.4.1", + "fontsource-roboto": "^2.1.4", "react": "^16.13.0", "react-bootstrap": "^1.0.0-beta.17", "react-dom": "^16.13.0", diff --git a/public/index.html b/public/index.html index aa069f2..a03cb24 100644 --- a/public/index.html +++ b/public/index.html @@ -3,41 +3,21 @@ - + - - React App
- diff --git a/src/App.js b/src/App.js index 0b92703..0cb5442 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,6 @@ import React, { useEffect } from "react"; import "./App.css"; +import "fontsource-roboto"; import { Switch, Route } from "react-router-dom"; import Navigation from "./components/Navigation"; diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index fb281b3..70ed9b5 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -1,31 +1,92 @@ import React from "react"; -import Navbar from "react-bootstrap/Navbar"; -import Nav from "react-bootstrap/Nav"; -import { NavLink } from "react-router-dom"; -import { useSelector } from "react-redux"; -import { selectToken } from "../../store/user/selectors"; -import NavbarItem from "./NavbarItem"; import LoggedIn from "./LoggedIn"; import LoggedOut from "./LoggedOut"; +import { AppBar, Toolbar, Button, Link } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { makeStyles } from "@material-ui/core/styles"; +import { useSelector } from "react-redux"; +import { selectToken } from "../../store/user/selectors"; + +const useStyles = makeStyles((theme) => ({ + root: { + flexGrow: 1, + }, + menuButton: { + marginRight: theme.spacing(2), + }, + title: { + flexGrow: 1, + }, + tabs: { + flexGrow: 1, + }, + link: { + margin: theme.spacing(1, 1.5), + }, +})); export default function Navigation() { const token = useSelector(selectToken); - const loginLogoutControls = token ? : ; + const classes = useStyles(); + const [value, setValue] = React.useState(0); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + return ( - - - YOUR PROJECT NAME - - - - - - +
+ + + + teamMate + + + + + +
+ // + // + // YOUR PROJECT NAME + // + // + // + // + // + // ); } diff --git a/src/index.js b/src/index.js index ad5741f..0dea343 100644 --- a/src/index.js +++ b/src/index.js @@ -1,23 +1,20 @@ import React from "react"; import ReactDOM from "react-dom"; -import "./index.css"; import App from "./App"; import * as serviceWorker from "./serviceWorker"; import store from "./store"; import { Provider } from "react-redux"; import { BrowserRouter as Router } from "react-router-dom"; -import "bootstrap/dist/css/bootstrap.min.css"; +import CssBaseline from "@material-ui/core/CssBaseline"; ReactDOM.render( + , document.getElementById("root") ); -// If you want your app to work offline and load faster, you can change -// unregister() to register() below. Note this comes with some pitfalls. -// Learn more about service workers: https://bit.ly/CRA-PWA serviceWorker.unregister(); From 5208ae11dd5f05a3964bc56d80bcb45b6a2ab1cc Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 18 Jun 2020 18:21:55 +0200 Subject: [PATCH 02/38] routing done with a tab bar --- src/components/Navigation/index.js | 75 +++++++++++++++++++----------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 70ed9b5..171978b 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -1,11 +1,15 @@ import React from "react"; import LoggedIn from "./LoggedIn"; import LoggedOut from "./LoggedOut"; -import { AppBar, Toolbar, Button, Link } from "@material-ui/core"; +import { AppBar, Toolbar, Button, Link, Tabs, Tab } from "@material-ui/core"; import Typography from "@material-ui/core/Typography"; import { makeStyles } from "@material-ui/core/styles"; import { useSelector } from "react-redux"; import { selectToken } from "../../store/user/selectors"; +import { Link as RouterLink } from "react-router-dom"; +import GroupIcon from "@material-ui/icons/Group"; +import EventNoteIcon from "@material-ui/icons/EventNote"; +import EmojiEventsIcon from "@material-ui/icons/EmojiEvents"; const useStyles = makeStyles((theme) => ({ root: { @@ -30,6 +34,7 @@ export default function Navigation() { const loginLogoutControls = token ? : ; const classes = useStyles(); + const [value, setValue] = React.useState(0); const handleChange = (event, newValue) => { @@ -40,40 +45,54 @@ export default function Navigation() {
+ teamMate - - + + } + label="MY TEAM" + component={RouterLink} + to="/myteam" + /> + } + label="EVENTS" + component={RouterLink} + to="/events" + /> +
// // From 573ebc5afd3e73b11a7822204752c2fc16f4fe1b Mon Sep 17 00:00:00 2001 From: mir4cles Date: Fri, 19 Jun 2020 14:26:24 +0200 Subject: [PATCH 03/38] material-ui basic and standard implementation --- package-lock.json | 12 +++ package.json | 1 + src/App.js | 35 +++--- src/components/Loading/index.js | 12 +-- src/components/MessageBox/index.js | 15 +-- src/components/Navigation/index.js | 33 +++--- src/pages/Events/index.js | 29 +++++ src/pages/Home/index.js | 38 +++++++ src/pages/Login/index.js | 164 +++++++++++++++++++++++------ src/pages/MyProfile/index.js | 26 +++++ src/pages/MyTeam/index.js | 28 +++++ src/pages/NotFound/index.js | 26 +++++ src/pages/SignUp/index.js | 157 ++++++++++++++++++--------- src/pages/Support/index.js | 28 +++++ 14 files changed, 465 insertions(+), 139 deletions(-) create mode 100644 src/pages/Events/index.js create mode 100644 src/pages/Home/index.js create mode 100644 src/pages/MyProfile/index.js create mode 100644 src/pages/MyTeam/index.js create mode 100644 src/pages/NotFound/index.js create mode 100644 src/pages/Support/index.js diff --git a/package-lock.json b/package-lock.json index 7835bc2..c4e1e04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1314,6 +1314,18 @@ "@babel/runtime": "^7.4.4" } }, + "@material-ui/lab": { + "version": "4.0.0-alpha.56", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.56.tgz", + "integrity": "sha512-xPlkK+z/6y/24ka4gVJgwPfoCF4RCh8dXb1BNE7MtF9bXEBLN/lBxNTK8VAa0qm3V2oinA6xtUIdcRh0aeRtVw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.10.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, "@material-ui/styles": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz", diff --git a/package.json b/package.json index 172622a..17a3e07 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "dependencies": { "@material-ui/core": "^4.10.2", "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.56", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", diff --git a/src/App.js b/src/App.js index 0cb5442..abd1a7f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,29 +1,21 @@ import React, { useEffect } from "react"; -import "./App.css"; -import "fontsource-roboto"; - import { Switch, Route } from "react-router-dom"; + import Navigation from "./components/Navigation"; import Loading from "./components/Loading"; import MessageBox from "./components/MessageBox"; +import Home from "./pages/Home"; import SignUp from "./pages/SignUp"; import Login from "./pages/Login"; +import MyProfile from "./pages/MyProfile"; +import MyTeam from "./pages/MyTeam"; +import Events from "./pages/Events"; +import Support from "./pages/Support"; +import NotFound from "./pages/NotFound"; import { useDispatch, useSelector } from "react-redux"; import { selectAppLoading } from "./store/appState/selectors"; import { getUserWithStoredToken } from "./store/user/actions"; -import { Jumbotron } from "react-bootstrap"; - -const Home = () => ( - -

Home

-
-); -const Other = () => ( - -

Other

-
-); function App() { const dispatch = useDispatch(); @@ -34,17 +26,22 @@ function App() { }, [dispatch]); return ( -
+ <> {isLoading ? : null} - - + + + + + + + -
+ ); } diff --git a/src/components/Loading/index.js b/src/components/Loading/index.js index cf3a320..8df9c47 100644 --- a/src/components/Loading/index.js +++ b/src/components/Loading/index.js @@ -1,13 +1,7 @@ import React from "react"; -import Spinner from "react-bootstrap/Spinner"; -import "./spinner.css"; + +import Skeleton from "@material-ui/lab/Skeleton"; export default function Loading() { - return ( -
- - Loading... - -
- ); + return ; } diff --git a/src/components/MessageBox/index.js b/src/components/MessageBox/index.js index 080f950..c7f0bf9 100644 --- a/src/components/MessageBox/index.js +++ b/src/components/MessageBox/index.js @@ -1,22 +1,17 @@ import React from "react"; -import { useSelector, useDispatch } from "react-redux"; +import { useSelector } from "react-redux"; + +import Alert from "@material-ui/lab/Alert"; + import { selectMessage } from "../../store/appState/selectors"; -import { Alert } from "react-bootstrap"; -import { clearMessage } from "../../store/appState/actions"; export default function MessageBox() { const message = useSelector(selectMessage); - const dispatch = useDispatch(); const showMessage = message !== null; if (!showMessage) return null; return ( - dispatch(clearMessage()) : null} - > + {message.text} ); diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 171978b..8b6714d 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -1,16 +1,24 @@ import React from "react"; -import LoggedIn from "./LoggedIn"; -import LoggedOut from "./LoggedOut"; -import { AppBar, Toolbar, Button, Link, Tabs, Tab } from "@material-ui/core"; -import Typography from "@material-ui/core/Typography"; -import { makeStyles } from "@material-ui/core/styles"; import { useSelector } from "react-redux"; -import { selectToken } from "../../store/user/selectors"; import { Link as RouterLink } from "react-router-dom"; + +import AppBar from "@material-ui/core/AppBar"; +import Toolbar from "@material-ui/core/Toolbar"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import Link from "@material-ui/core/Link"; +import { makeStyles } from "@material-ui/core/styles"; import GroupIcon from "@material-ui/icons/Group"; import EventNoteIcon from "@material-ui/icons/EventNote"; import EmojiEventsIcon from "@material-ui/icons/EmojiEvents"; +import LoggedIn from "./LoggedIn"; +import LoggedOut from "./LoggedOut"; + +import { selectToken } from "../../store/user/selectors"; + const useStyles = makeStyles((theme) => ({ root: { flexGrow: 1, @@ -94,18 +102,5 @@ export default function Navigation() { /> - // - // - // YOUR PROJECT NAME - // - // - // - // - // - // ); } diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js new file mode 100644 index 0000000..0a35d30 --- /dev/null +++ b/src/pages/Events/index.js @@ -0,0 +1,29 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function Events() { + const classes = useStyles(); + return ( + <> + + + Events + + + + + ); +} diff --git a/src/pages/Home/index.js b/src/pages/Home/index.js new file mode 100644 index 0000000..06fbb3b --- /dev/null +++ b/src/pages/Home/index.js @@ -0,0 +1,38 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function Home() { + const classes = useStyles(); + + return ( + + + teamMate + + + Look for pickup games or host private events. +
+ Join a team or ride solo. +
+
+ ); +} diff --git a/src/pages/Login/index.js b/src/pages/Login/index.js index d35d780..c3a6a39 100644 --- a/src/pages/Login/index.js +++ b/src/pages/Login/index.js @@ -1,14 +1,45 @@ import React, { useState, useEffect } from "react"; -import Form from "react-bootstrap/Form"; -import Container from "react-bootstrap/Container"; -import Button from "react-bootstrap/Button"; +import { useSelector, useDispatch } from "react-redux"; + import { login } from "../../store/user/actions"; import { selectToken } from "../../store/user/selectors"; -import { useDispatch, useSelector } from "react-redux"; import { useHistory, Link } from "react-router-dom"; -import { Col } from "react-bootstrap"; + +import CssBaseline from "@material-ui/core/CssBaseline"; +import Avatar from "@material-ui/core/Avatar"; +import Button from "@material-ui/core/Button"; +import TextField from "@material-ui/core/TextField"; +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import Checkbox from "@material-ui/core/Checkbox"; +import Grid from "@material-ui/core/Grid"; +import Box from "@material-ui/core/Box"; +import LockOutlinedIcon from "@material-ui/icons/LockOutlined"; +import Typography from "@material-ui/core/Typography"; +import { makeStyles } from "@material-ui/core/styles"; +import Container from "@material-ui/core/Container"; + +const useStyles = makeStyles((theme) => ({ + paper: { + marginTop: theme.spacing(8), + display: "flex", + flexDirection: "column", + alignItems: "center", + }, + avatar: { + margin: theme.spacing(1), + backgroundColor: theme.palette.secondary.main, + }, + form: { + width: "100%", // Fix IE 11 issue. + marginTop: theme.spacing(1), + }, + submit: { + margin: theme.spacing(3, 0, 2), + }, +})); export default function SignUp() { + const classes = useStyles(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const dispatch = useDispatch(); @@ -32,39 +63,106 @@ export default function SignUp() { } return ( - -
-

Login

- - Email address - setEmail(event.target.value)} - type="email" - placeholder="Enter email" + // + // + //

Login

+ // + // Email address + // setEmail(event.target.value)} + // type="email" + // placeholder="Enter email" + // required + // /> + // + + // + // Password + // setPassword(event.target.value)} + // type="password" + // placeholder="Password" + // required + // /> + // + // + // + // + // + // Click here to sign up + // + // + //
+ //////////////////////////////// + //////////////////////////////// + + +
+ + + + + Log in + +
+ setEmail(event.target.value)} /> - - - - Password - setPassword(event.target.value)} - type="password" - placeholder="Password" + setPassword(event.target.value)} + /> + } + label="Remember me" /> - - - - - - Click here to sign up - - + + + + Forgot password? + + + + + {"Don't have an account? Sign Up"} + + + + +
); } diff --git a/src/pages/MyProfile/index.js b/src/pages/MyProfile/index.js new file mode 100644 index 0000000..095f012 --- /dev/null +++ b/src/pages/MyProfile/index.js @@ -0,0 +1,26 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function MyProfile() { + const classes = useStyles(); + return ( + + + My profile + + + ); +} diff --git a/src/pages/MyTeam/index.js b/src/pages/MyTeam/index.js new file mode 100644 index 0000000..fe0067e --- /dev/null +++ b/src/pages/MyTeam/index.js @@ -0,0 +1,28 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function MyTeam() { + const classes = useStyles(); + return ( + <> + + + My Team + + + + ); +} diff --git a/src/pages/NotFound/index.js b/src/pages/NotFound/index.js new file mode 100644 index 0000000..8173f15 --- /dev/null +++ b/src/pages/NotFound/index.js @@ -0,0 +1,26 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function NotFound() { + const classes = useStyles(); + return ( + + + 404: The page you requested was not found + + + ); +} diff --git a/src/pages/SignUp/index.js b/src/pages/SignUp/index.js index 9e7b90f..16453bf 100644 --- a/src/pages/SignUp/index.js +++ b/src/pages/SignUp/index.js @@ -1,14 +1,45 @@ import React, { useState, useEffect } from "react"; -import Form from "react-bootstrap/Form"; -import Container from "react-bootstrap/Container"; -import Button from "react-bootstrap/Button"; -import { signUp } from "../../store/user/actions"; -import { selectToken } from "../../store/user/selectors"; import { useDispatch, useSelector } from "react-redux"; import { useHistory, Link } from "react-router-dom"; -import { Col } from "react-bootstrap"; + +import Avatar from "@material-ui/core/Avatar"; +import Button from "@material-ui/core/Button"; +import CssBaseline from "@material-ui/core/CssBaseline"; +import TextField from "@material-ui/core/TextField"; +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import Checkbox from "@material-ui/core/Checkbox"; +import Grid from "@material-ui/core/Grid"; +import Box from "@material-ui/core/Box"; +import LockOutlinedIcon from "@material-ui/icons/LockOutlined"; +import Typography from "@material-ui/core/Typography"; +import { makeStyles } from "@material-ui/core/styles"; +import Container from "@material-ui/core/Container"; + +import { signUp } from "../../store/user/actions"; +import { selectToken } from "../../store/user/selectors"; + +const useStyles = makeStyles((theme) => ({ + paper: { + marginTop: theme.spacing(8), + display: "flex", + flexDirection: "column", + alignItems: "center", + }, + avatar: { + margin: theme.spacing(1), + backgroundColor: theme.palette.secondary.main, + }, + form: { + width: "100%", // Fix IE 11 issue. + marginTop: theme.spacing(3), + }, + submit: { + margin: theme.spacing(3, 0, 2), + }, +})); export default function SignUp() { + const classes = useStyles(); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -33,50 +64,78 @@ export default function SignUp() { } return ( - -
-

Signup

- - Name - setName(event.target.value)} - type="text" - placeholder="Enter name" - required - /> - - - Email address - setEmail(event.target.value)} - type="email" - placeholder="Enter email" - required - /> - - We'll never share your email with anyone else. - - - - - Password - setPassword(event.target.value)} - type="password" - placeholder="Password" - required - /> - - - - - Click here to log in -
+ + + + Already have an account? Sign in + + + + +
); } diff --git a/src/pages/Support/index.js b/src/pages/Support/index.js new file mode 100644 index 0000000..ed61fc1 --- /dev/null +++ b/src/pages/Support/index.js @@ -0,0 +1,28 @@ +import React from "react"; + +import { Container, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, +})); + +export default function Support() { + const classes = useStyles(); + return ( + <> + + + Support coming soon, mate + + + + ); +} From aa42a622f09ddacc0618b2b38da0eb3d71e9efc0 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Fri, 19 Jun 2020 15:05:49 +0200 Subject: [PATCH 04/38] setup events.map with Cards --- src/config/constants.js | 1 + src/pages/Events/index.js | 75 +++++++++++++++++++++++++++++++++-- src/pages/Login/index.js | 39 ------------------ src/store/events/actions.js | 21 ++++++++++ src/store/events/reducer.js | 21 ++++++++++ src/store/events/selectors.js | 1 + src/store/user/actions.js | 17 ++++---- 7 files changed, 124 insertions(+), 51 deletions(-) create mode 100644 src/store/events/actions.js create mode 100644 src/store/events/reducer.js create mode 100644 src/store/events/selectors.js diff --git a/src/config/constants.js b/src/config/constants.js index 18da8be..c82997a 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -1,2 +1,3 @@ export const apiUrl = process.env.API_URL || "http://localhost:4000"; export const DEFAULT_MESSAGE_TIMEOUT = 3000; +export const DEFAULT_PAGINATION_LIMIT = 10; diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index 0a35d30..b27a921 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -1,16 +1,49 @@ -import React from "react"; +import React, { useEffect } from "react"; -import { Container, Typography } from "@material-ui/core"; +import { + Container, + Typography, + Grid, + Card, + CardContent, + Button, + CardActions, + Link, +} from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; +import { useDispatch, useSelector } from "react-redux"; + +import { selectEvents } from "../../store/events/selectors"; +import { fetchEvents } from "../../store/events/actions"; const useStyles = makeStyles((theme) => ({ heroContent: { padding: theme.spacing(4, 0, 6), }, + bullet: { + display: "inline-block", + margin: "0 2px", + transform: "scale(0.8)", + }, + title: { + fontSize: 14, + }, + pos: { + marginBottom: 12, + }, })); export default function Events() { const classes = useStyles(); + + const dispatch = useDispatch(); + + const events = useSelector(selectEvents); + + useEffect(() => { + dispatch(fetchEvents()); + }, [dispatch]); + return ( <> @@ -23,7 +56,43 @@ export default function Events() { Events - + + + {events.map((event) => ( + + + + + {events.startDateTime} + + + {event.title} + + + Location: {event.location} + + + {event.description} + + + + + + + + ))} + + ); } diff --git a/src/pages/Login/index.js b/src/pages/Login/index.js index c3a6a39..c3d9e1a 100644 --- a/src/pages/Login/index.js +++ b/src/pages/Login/index.js @@ -12,7 +12,6 @@ import TextField from "@material-ui/core/TextField"; import FormControlLabel from "@material-ui/core/FormControlLabel"; import Checkbox from "@material-ui/core/Checkbox"; import Grid from "@material-ui/core/Grid"; -import Box from "@material-ui/core/Box"; import LockOutlinedIcon from "@material-ui/icons/LockOutlined"; import Typography from "@material-ui/core/Typography"; import { makeStyles } from "@material-ui/core/styles"; @@ -55,50 +54,12 @@ export default function SignUp() { function submitForm(event) { console.log("hi"); event.preventDefault(); - dispatch(login(email, password)); - setEmail(""); setPassword(""); } return ( - // - //
- //

Login

- // - // Email address - // setEmail(event.target.value)} - // type="email" - // placeholder="Enter email" - // required - // /> - // - - // - // Password - // setPassword(event.target.value)} - // type="password" - // placeholder="Password" - // required - // /> - // - // - // - // - // - // Click here to sign up - // - //
- //
- //////////////////////////////// - ////////////////////////////////
diff --git a/src/store/events/actions.js b/src/store/events/actions.js new file mode 100644 index 0000000..9d5240d --- /dev/null +++ b/src/store/events/actions.js @@ -0,0 +1,21 @@ +import { apiUrl, DEFAULT_PAGINATION_LIMIT } from "../../config/constants"; +import axios from "axios"; + +export const FETCH_EVENTS_SUCCESS = "FETCH_EVENTS_SUCCESS"; + +export const fetchEventsSuccess = (events) => ({ + type: FETCH_EVENTS_SUCCESS, + payload: events, +}); + +export const fetchEvents = () => { + return async (dispatch, getState) => { + const eventsCount = getState().events.length; + const response = await axios.get( + `${apiUrl}/events?limit=${DEFAULT_PAGINATION_LIMIT}&offset=${eventsCount}` + ); + + // console.log(response.data); + dispatch(fetchEventsSuccess(response.data.events.rows)); + }; +}; diff --git a/src/store/events/reducer.js b/src/store/events/reducer.js new file mode 100644 index 0000000..bbb304e --- /dev/null +++ b/src/store/events/reducer.js @@ -0,0 +1,21 @@ +import { FETCH_EVENTS_SUCCESS } from "./actions"; +// import { HEART_INCREMENT } from "../artworkDetails/actions"; + +const initialState = []; + +export default (state = initialState, action) => { + switch (action.type) { + case FETCH_EVENTS_SUCCESS: + return [...state, ...action.payload]; + + // case HEART_INCREMENT: + // return state.map((artwork) => + // artwork.id === action.payload + // ? { ...artwork, hearts: artwork.hearts + 1 } + // : artwork + // ); + + default: + return state; + } +}; diff --git a/src/store/events/selectors.js b/src/store/events/selectors.js new file mode 100644 index 0000000..fbc7567 --- /dev/null +++ b/src/store/events/selectors.js @@ -0,0 +1 @@ +export const selectEvents = (state) => state.events; diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 0dc25f0..6f6b3a8 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -5,23 +5,23 @@ import { appLoading, appDoneLoading, showMessageWithTimeout, - setMessage + setMessage, } from "../appState/actions"; export const LOGIN_SUCCESS = "LOGIN_SUCCESS"; export const TOKEN_STILL_VALID = "TOKEN_STILL_VALID"; export const LOG_OUT = "LOG_OUT"; -const loginSuccess = userWithToken => { +const loginSuccess = (userWithToken) => { return { type: LOGIN_SUCCESS, - payload: userWithToken + payload: userWithToken, }; }; -const tokenStillValid = userWithoutToken => ({ +const tokenStillValid = (userWithoutToken) => ({ type: TOKEN_STILL_VALID, - payload: userWithoutToken + payload: userWithoutToken, }); export const logOut = () => ({ type: LOG_OUT }); @@ -33,7 +33,7 @@ export const signUp = (name, email, password) => { const response = await axios.post(`${apiUrl}/signup`, { name, email, - password + password, }); dispatch(loginSuccess(response.data)); @@ -58,9 +58,8 @@ export const login = (email, password) => { try { const response = await axios.post(`${apiUrl}/login`, { email, - password + password, }); - dispatch(loginSuccess(response.data)); dispatch(showMessageWithTimeout("success", false, "welcome back!", 1500)); dispatch(appDoneLoading()); @@ -90,7 +89,7 @@ export const getUserWithStoredToken = () => { // if we do have a token, // check wether it is still valid or if it is expired const response = await axios.get(`${apiUrl}/me`, { - headers: { Authorization: `Bearer ${token}` } + headers: { Authorization: `Bearer ${token}` }, }); // token is still valid From caee39112ee8a74df40a09e3ee29a53472c8e2c2 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Mon, 22 Jun 2020 12:00:13 +0200 Subject: [PATCH 05/38] event overview is fetching! --- src/pages/Events/index.js | 6 +++--- src/store/events/actions.js | 4 +++- src/store/rootReducer.js | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index b27a921..c201b68 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -1,4 +1,6 @@ import React, { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { Link } from "react-router-dom"; import { Container, @@ -8,10 +10,8 @@ import { CardContent, Button, CardActions, - Link, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; -import { useDispatch, useSelector } from "react-redux"; import { selectEvents } from "../../store/events/selectors"; import { fetchEvents } from "../../store/events/actions"; @@ -67,7 +67,7 @@ export default function Events() { color="textSecondary" gutterBottom > - {events.startDateTime} + {event.startDateTime} {event.title} diff --git a/src/store/events/actions.js b/src/store/events/actions.js index 9d5240d..637975f 100644 --- a/src/store/events/actions.js +++ b/src/store/events/actions.js @@ -11,10 +11,12 @@ export const fetchEventsSuccess = (events) => ({ export const fetchEvents = () => { return async (dispatch, getState) => { const eventsCount = getState().events.length; + // const response = await axios.get( + // `http://localhost:4000/events?limit=${DEFAULT_PAGINATION_LIMIT}` + // ); const response = await axios.get( `${apiUrl}/events?limit=${DEFAULT_PAGINATION_LIMIT}&offset=${eventsCount}` ); - // console.log(response.data); dispatch(fetchEventsSuccess(response.data.events.rows)); }; diff --git a/src/store/rootReducer.js b/src/store/rootReducer.js index 03483da..dcb5314 100644 --- a/src/store/rootReducer.js +++ b/src/store/rootReducer.js @@ -1,8 +1,10 @@ import { combineReducers } from "redux"; import appState from "./appState/reducer"; import user from "./user/reducer"; +import events from "./events/reducer"; export default combineReducers({ appState, - user + user, + events, }); From 8b35bacf6171857ad89b0de84046ff5479018dc4 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Mon, 22 Jun 2020 12:38:17 +0200 Subject: [PATCH 06/38] event details page with server data --- src/App.js | 6 +- src/pages/EventDetails/index.js | 87 +++++++++++++++++++++++++++++ src/store/eventDetails/actions.js | 17 ++++++ src/store/eventDetails/reducer.js | 13 +++++ src/store/eventDetails/selectors.js | 1 + src/store/rootReducer.js | 2 + 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 src/pages/EventDetails/index.js create mode 100644 src/store/eventDetails/actions.js create mode 100644 src/store/eventDetails/reducer.js create mode 100644 src/store/eventDetails/selectors.js diff --git a/src/App.js b/src/App.js index abd1a7f..c551ec6 100644 --- a/src/App.js +++ b/src/App.js @@ -10,6 +10,7 @@ import Login from "./pages/Login"; import MyProfile from "./pages/MyProfile"; import MyTeam from "./pages/MyTeam"; import Events from "./pages/Events"; +import EventDetails from "./pages/EventDetails"; import Support from "./pages/Support"; import NotFound from "./pages/NotFound"; @@ -33,9 +34,10 @@ function App() { - + + - + diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js new file mode 100644 index 0000000..4a66dd8 --- /dev/null +++ b/src/pages/EventDetails/index.js @@ -0,0 +1,87 @@ +import React, { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { useParams } from "react-router-dom"; + +import { + Container, + Typography, + Grid, + Card, + CardContent, + Button, + CardActions, +} from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +import { selectEventDetails } from "../../store/eventDetails/selectors"; +import { fetchEventById } from "../../store/eventDetails/actions"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + bullet: { + display: "inline-block", + margin: "0 2px", + transform: "scale(0.8)", + }, + title: { + fontSize: 14, + }, + pos: { + marginBottom: 12, + }, +})); + +export default function Events() { + const classes = useStyles(); + + const { id } = useParams(); + const event = useSelector(selectEventDetails); + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(fetchEventById(id)); + }, [dispatch, id]); + + return ( + <> + + + Events + + + + + + + + + {event.startDateTime} + + + {event.title} + + + Location: {event.location} + + + {event.description} + + + + + + + + ); +} diff --git a/src/store/eventDetails/actions.js b/src/store/eventDetails/actions.js new file mode 100644 index 0000000..e629949 --- /dev/null +++ b/src/store/eventDetails/actions.js @@ -0,0 +1,17 @@ +import axios from "axios"; +import { apiUrl } from "../../config/constants"; + +export const EVENT_DETAILS_FETCHED = "EVENT_DETAILS_FETCHED"; + +const eventDetailsFetched = (event) => ({ + type: EVENT_DETAILS_FETCHED, + payload: event, +}); + +export const fetchEventById = (id) => { + return async (dispatch, getState) => { + const response = await axios.get(`${apiUrl}/events/${id}`); + console.log(response); + dispatch(eventDetailsFetched(response.data.event)); + }; +}; diff --git a/src/store/eventDetails/reducer.js b/src/store/eventDetails/reducer.js new file mode 100644 index 0000000..cc941e2 --- /dev/null +++ b/src/store/eventDetails/reducer.js @@ -0,0 +1,13 @@ +import { EVENT_DETAILS_FETCHED } from "./actions"; + +const initialState = {}; + +export default (state = initialState, { type, payload }) => { + switch (type) { + case EVENT_DETAILS_FETCHED: + return { ...state, ...payload }; + + default: + return state; + } +}; diff --git a/src/store/eventDetails/selectors.js b/src/store/eventDetails/selectors.js new file mode 100644 index 0000000..1aee5a3 --- /dev/null +++ b/src/store/eventDetails/selectors.js @@ -0,0 +1 @@ +export const selectEventDetails = (state) => state.eventDetails; diff --git a/src/store/rootReducer.js b/src/store/rootReducer.js index dcb5314..6734a43 100644 --- a/src/store/rootReducer.js +++ b/src/store/rootReducer.js @@ -2,9 +2,11 @@ import { combineReducers } from "redux"; import appState from "./appState/reducer"; import user from "./user/reducer"; import events from "./events/reducer"; +import eventDetails from "./eventDetails/reducer"; export default combineReducers({ appState, user, events, + eventDetails, }); From 3a6a8d698ec0cb1cce35f44966267004400d25ed Mon Sep 17 00:00:00 2001 From: mir4cles Date: Mon, 22 Jun 2020 14:47:07 +0200 Subject: [PATCH 07/38] teams and teamdetails fetched from server --- src/App.js | 6 +- src/components/Navigation/index.js | 4 +- src/pages/MyTeam/index.js | 28 ---------- src/pages/TeamDetails/index.js | 89 +++++++++++++++++++++++++++++ src/pages/Teams/index.js | 90 ++++++++++++++++++++++++++++++ src/store/rootReducer.js | 4 ++ src/store/teamDetails/actions.js | 16 ++++++ src/store/teamDetails/reducer.js | 13 +++++ src/store/teamDetails/selectors.js | 1 + src/store/teams/actions.js | 23 ++++++++ src/store/teams/reducer.js | 21 +++++++ src/store/teams/selectors.js | 1 + 12 files changed, 264 insertions(+), 32 deletions(-) delete mode 100644 src/pages/MyTeam/index.js create mode 100644 src/pages/TeamDetails/index.js create mode 100644 src/pages/Teams/index.js create mode 100644 src/store/teamDetails/actions.js create mode 100644 src/store/teamDetails/reducer.js create mode 100644 src/store/teamDetails/selectors.js create mode 100644 src/store/teams/actions.js create mode 100644 src/store/teams/reducer.js create mode 100644 src/store/teams/selectors.js diff --git a/src/App.js b/src/App.js index c551ec6..93d373d 100644 --- a/src/App.js +++ b/src/App.js @@ -8,7 +8,8 @@ import Home from "./pages/Home"; import SignUp from "./pages/SignUp"; import Login from "./pages/Login"; import MyProfile from "./pages/MyProfile"; -import MyTeam from "./pages/MyTeam"; +import Teams from "./pages/Teams"; +import TeamDetails from "./pages/TeamDetails"; import Events from "./pages/Events"; import EventDetails from "./pages/EventDetails"; import Support from "./pages/Support"; @@ -33,7 +34,8 @@ function App() { {isLoading ? : null} - + + diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 8b6714d..29fdc79 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -90,9 +90,9 @@ export default function Navigation() { > } - label="MY TEAM" + label="TEAMS" component={RouterLink} - to="/myteam" + to="/teams" /> } diff --git a/src/pages/MyTeam/index.js b/src/pages/MyTeam/index.js deleted file mode 100644 index fe0067e..0000000 --- a/src/pages/MyTeam/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; - -import { Container, Typography } from "@material-ui/core"; -import { makeStyles } from "@material-ui/core/styles"; - -const useStyles = makeStyles((theme) => ({ - heroContent: { - padding: theme.spacing(4, 0, 6), - }, -})); - -export default function MyTeam() { - const classes = useStyles(); - return ( - <> - - - My Team - - - - ); -} diff --git a/src/pages/TeamDetails/index.js b/src/pages/TeamDetails/index.js new file mode 100644 index 0000000..17b34c7 --- /dev/null +++ b/src/pages/TeamDetails/index.js @@ -0,0 +1,89 @@ +import React, { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { useParams } from "react-router-dom"; + +import { + Container, + Typography, + Grid, + Card, + CardContent, + Button, + CardActions, + CardMedia, +} from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +import { selectTeamDetails } from "../../store/teamDetails/selectors"; +import { fetchTeamById } from "../../store/teamDetails/actions"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + bullet: { + display: "inline-block", + margin: "0 2px", + transform: "scale(0.8)", + }, + title: { + fontSize: 14, + }, + pos: { + marginBottom: 12, + }, + media: { + height: 400, + }, +})); + +export default function TeamDetails() { + const classes = useStyles(); + + const { id } = useParams(); + const team = useSelector(selectTeamDetails); + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(fetchTeamById(id)); + }, [dispatch, id]); + + return ( + <> + + + Team Details + + + + + + + + + + {team.teamName} + + + Hometown: {team.city} + + + {team.description} + + + + + + + + ); +} diff --git a/src/pages/Teams/index.js b/src/pages/Teams/index.js new file mode 100644 index 0000000..a00c42e --- /dev/null +++ b/src/pages/Teams/index.js @@ -0,0 +1,90 @@ +import React, { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { Link } from "react-router-dom"; + +import { + Container, + Typography, + Grid, + Card, + CardContent, + Button, + CardActions, + CardMedia, +} from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +import { selectTeams } from "../../store/teams/selectors"; +import { fetchTeams } from "../../store/teams/actions"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + bullet: { + display: "inline-block", + margin: "0 2px", + transform: "scale(0.8)", + }, + title: { + fontSize: 14, + }, + pos: { + marginBottom: 12, + }, + media: { + height: 250, + }, +})); + +export default function Teams() { + const classes = useStyles(); + + const dispatch = useDispatch(); + + const teams = useSelector(selectTeams); + + useEffect(() => { + dispatch(fetchTeams()); + }, [dispatch]); + + return ( + <> + + + {teams.map((team) => ( + + + + + + {team.teamName} + + + {team.city} + + + {team.description} + + + + + + + + ))} + + + + ); +} diff --git a/src/store/rootReducer.js b/src/store/rootReducer.js index 6734a43..9e7bc6b 100644 --- a/src/store/rootReducer.js +++ b/src/store/rootReducer.js @@ -3,10 +3,14 @@ import appState from "./appState/reducer"; import user from "./user/reducer"; import events from "./events/reducer"; import eventDetails from "./eventDetails/reducer"; +import teams from "./teams/reducer"; +import teamDetails from "./teamDetails/reducer"; export default combineReducers({ appState, user, events, eventDetails, + teams, + teamDetails, }); diff --git a/src/store/teamDetails/actions.js b/src/store/teamDetails/actions.js new file mode 100644 index 0000000..54f0d0f --- /dev/null +++ b/src/store/teamDetails/actions.js @@ -0,0 +1,16 @@ +import axios from "axios"; +import { apiUrl } from "../../config/constants"; + +export const TEAM_DETAILS_FETCHED = "TEAM_DETAILS_FETCHED"; + +const teamDetailsFetched = (team) => ({ + type: TEAM_DETAILS_FETCHED, + payload: team, +}); + +export const fetchTeamById = (id) => { + return async (dispatch, getState) => { + const response = await axios.get(`${apiUrl}/teams/${id}`); + dispatch(teamDetailsFetched(response.data.team)); + }; +}; diff --git a/src/store/teamDetails/reducer.js b/src/store/teamDetails/reducer.js new file mode 100644 index 0000000..09786e2 --- /dev/null +++ b/src/store/teamDetails/reducer.js @@ -0,0 +1,13 @@ +import { TEAM_DETAILS_FETCHED } from "./actions"; + +const initialState = {}; + +export default (state = initialState, { type, payload }) => { + switch (type) { + case TEAM_DETAILS_FETCHED: + return { ...state, ...payload }; + + default: + return state; + } +}; diff --git a/src/store/teamDetails/selectors.js b/src/store/teamDetails/selectors.js new file mode 100644 index 0000000..f1009ca --- /dev/null +++ b/src/store/teamDetails/selectors.js @@ -0,0 +1 @@ +export const selectTeamDetails = (state) => state.teamDetails; diff --git a/src/store/teams/actions.js b/src/store/teams/actions.js new file mode 100644 index 0000000..f62cf66 --- /dev/null +++ b/src/store/teams/actions.js @@ -0,0 +1,23 @@ +import { apiUrl, DEFAULT_PAGINATION_LIMIT } from "../../config/constants"; +import axios from "axios"; + +export const FETCH_TEAMS_SUCCESS = "FETCH_TEAMS_SUCCESS"; + +export const fetchTeamsSuccess = (teams) => ({ + type: FETCH_TEAMS_SUCCESS, + payload: teams, +}); + +export const fetchTeams = () => { + return async (dispatch, getState) => { + const teamsCount = getState().teams.length; + // const response = await axios.get( + // `http://localhost:4000/events?limit=${DEFAULT_PAGINATION_LIMIT}` + // ); + const response = await axios.get( + `${apiUrl}/teams?limit=${DEFAULT_PAGINATION_LIMIT}&offset=${teamsCount}` + ); + // console.log(response.data); + dispatch(fetchTeamsSuccess(response.data.teams.rows)); + }; +}; diff --git a/src/store/teams/reducer.js b/src/store/teams/reducer.js new file mode 100644 index 0000000..09baba7 --- /dev/null +++ b/src/store/teams/reducer.js @@ -0,0 +1,21 @@ +import { FETCH_TEAMS_SUCCESS } from "./actions"; +// import { HEART_INCREMENT } from "../artworkDetails/actions"; + +const initialState = []; + +export default (state = initialState, action) => { + switch (action.type) { + case FETCH_TEAMS_SUCCESS: + return [...state, ...action.payload]; + + // case HEART_INCREMENT: + // return state.map((artwork) => + // artwork.id === action.payload + // ? { ...artwork, hearts: artwork.hearts + 1 } + // : artwork + // ); + + default: + return state; + } +}; diff --git a/src/store/teams/selectors.js b/src/store/teams/selectors.js new file mode 100644 index 0000000..a7f7f17 --- /dev/null +++ b/src/store/teams/selectors.js @@ -0,0 +1 @@ +export const selectTeams = (state) => state.teams; From ced7033f8cf5bc9edad7e6ecaf02a26ce9912663 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Mon, 22 Jun 2020 15:49:46 +0200 Subject: [PATCH 08/38] add loggedIn status --- src/components/Navigation/LoggedIn.js | 33 ++++++++++++++++++++++---- src/components/Navigation/LoggedOut.js | 12 ++++++++-- src/components/Navigation/index.js | 10 ++------ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/components/Navigation/LoggedIn.js b/src/components/Navigation/LoggedIn.js index 35410ea..cecb068 100644 --- a/src/components/Navigation/LoggedIn.js +++ b/src/components/Navigation/LoggedIn.js @@ -1,17 +1,42 @@ import React from "react"; import { useDispatch, useSelector } from "react-redux"; +import { Link as RouterLink } from "react-router-dom"; + +import { Button, Link } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + import { logOut } from "../../store/user/actions"; -import Button from "react-bootstrap/Button"; import { selectUser } from "../../store/user/selectors"; -import Nav from "react-bootstrap/Nav"; + +const useStyles = makeStyles((theme) => ({ + link: { + margin: theme.spacing(1, 1.5), + }, +})); export default function LoggedIn() { const dispatch = useDispatch(); const user = useSelector(selectUser); + const classes = useStyles(); return ( <> - {user.email} - + + {user.name} + + + ); } diff --git a/src/components/Navigation/LoggedOut.js b/src/components/Navigation/LoggedOut.js index ca5f4d5..1a9d66b 100644 --- a/src/components/Navigation/LoggedOut.js +++ b/src/components/Navigation/LoggedOut.js @@ -1,10 +1,18 @@ import React from "react"; -import NavbarItem from "./NavbarItem"; +import { Link as RouterLink } from "react-router-dom"; +import { Button } from "@material-ui/core"; export default function LoggedOut() { return ( <> - + ); } diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 29fdc79..f89b10e 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -71,16 +71,10 @@ export default function Navigation() { > SUPPORT - + {loginLogoutControls} + Date: Mon, 22 Jun 2020 15:50:06 +0200 Subject: [PATCH 09/38] removed button from import --- src/components/Navigation/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index f89b10e..9f9c4a9 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -5,7 +5,6 @@ import { Link as RouterLink } from "react-router-dom"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; import Typography from "@material-ui/core/Typography"; -import Button from "@material-ui/core/Button"; import Tabs from "@material-ui/core/Tabs"; import Tab from "@material-ui/core/Tab"; import Link from "@material-ui/core/Link"; From e74cff69888e2c142f1ec530531af450315c2eba Mon Sep 17 00:00:00 2001 From: mir4cles Date: Mon, 22 Jun 2020 16:33:40 +0200 Subject: [PATCH 10/38] create event button on event page --- src/pages/Events/index.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index c201b68..5115db7 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -10,11 +10,14 @@ import { CardContent, Button, CardActions, + Fab, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; +import AddIcon from "@material-ui/icons/Add"; import { selectEvents } from "../../store/events/selectors"; import { fetchEvents } from "../../store/events/actions"; +import { selectToken } from "../../store/user/selectors"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -31,6 +34,11 @@ const useStyles = makeStyles((theme) => ({ pos: { marginBottom: 12, }, + fab: { + position: "absolute", + bottom: theme.spacing(2), + right: theme.spacing(2), + }, })); export default function Events() { @@ -40,6 +48,8 @@ export default function Events() { const events = useSelector(selectEvents); + const token = useSelector(selectToken); + useEffect(() => { dispatch(fetchEvents()); }, [dispatch]); @@ -55,6 +65,18 @@ export default function Events() { > Events + {token ? ( + + + + ) : null} From e994a336f6053df1ef5767d63c6a4754030a95e4 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 11:34:17 +0200 Subject: [PATCH 11/38] form with useState without dispatch --- src/App.js | 2 + src/pages/CreateEvent/index.js | 217 +++++++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/pages/CreateEvent/index.js diff --git a/src/App.js b/src/App.js index 93d373d..149b3c2 100644 --- a/src/App.js +++ b/src/App.js @@ -12,6 +12,7 @@ import Teams from "./pages/Teams"; import TeamDetails from "./pages/TeamDetails"; import Events from "./pages/Events"; import EventDetails from "./pages/EventDetails"; +import CreateEvent from "./pages/CreateEvent"; import Support from "./pages/Support"; import NotFound from "./pages/NotFound"; @@ -38,6 +39,7 @@ function App() { + diff --git a/src/pages/CreateEvent/index.js b/src/pages/CreateEvent/index.js new file mode 100644 index 0000000..5217477 --- /dev/null +++ b/src/pages/CreateEvent/index.js @@ -0,0 +1,217 @@ +import React, { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { Link } from "react-router-dom"; + +import { + Container, + Typography, + Grid, + TextField, + FormControlLabel, + Checkbox, + Button, + FormControl, + InputLabel, + Select, + MenuItem, + Input, +} from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +import { selectToken } from "../../store/user/selectors"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + buttons: { + display: "flex", + justifyContent: "flex-end", + }, + formControl: { + margin: theme.spacing(1), + minWidth: 120, + maxWidth: 300, + }, +})); + +export default function CreateEvent() { + const classes = useStyles(); + const token = useSelector(selectToken); + + const [title, setTitle] = React.useState(""); + const [startDate, setStartDate] = React.useState(""); + const [endDate, setEndDate] = React.useState(""); + const [location, setLocation] = React.useState(""); + const [sportType, setSportType] = React.useState(""); + const [description, setDescription] = React.useState(""); + const [outdoor, setOutdoor] = React.useState(false); + const [maxPlayers, setMaxPlayers] = React.useState(25); + + function submitForm(event) { + event.preventDefault(); + console.log( + "data from form:", + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers + ); + // dispatch(startAuction(title, parseInt(minimumBid), imageUrl)); + // setTitle(""); + // setMinimumBid("0"); + // setImageUrl(""); + } + + if (token === null) { + return ( + <> + + +

Only registered users can create events.

+
+
+ + ); + } + + return ( + <> + + + Create event + + + + + + setTitle(event.target.value)} + /> + + + setStartDate(event.target.value)} + /> + + + setEndDate(event.target.value)} + /> + + + setLocation(event.target.value)} + /> + + + setSportType(event.target.value)} + /> + + + setMaxPlayers(event.target.value)} + /> + + + setDescription(event.target.value)} + /> + + + } + label="This is an outdoor event" + onChange={() => setOutdoor(!outdoor)} + checked={outdoor} + /> + + +
+ +
+
+ + ); +} From 8bf0a6bb1e54ee5a9c65f2b458e0ca468e4783d0 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 12:17:34 +0200 Subject: [PATCH 12/38] dispatch form and send request to server --- src/pages/CreateEvent/index.js | 24 ++++++++++++------- src/store/user/actions.js | 42 +++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/pages/CreateEvent/index.js b/src/pages/CreateEvent/index.js index 5217477..dd664b5 100644 --- a/src/pages/CreateEvent/index.js +++ b/src/pages/CreateEvent/index.js @@ -1,6 +1,5 @@ -import React, { useEffect } from "react"; +import React from "react"; import { useDispatch, useSelector } from "react-redux"; -import { Link } from "react-router-dom"; import { Container, @@ -10,15 +9,11 @@ import { FormControlLabel, Checkbox, Button, - FormControl, - InputLabel, - Select, - MenuItem, - Input, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import { selectToken } from "../../store/user/selectors"; +import { createEvent } from "../../store/user/actions"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -39,6 +34,8 @@ export default function CreateEvent() { const classes = useStyles(); const token = useSelector(selectToken); + const dispatch = useDispatch(); + const [title, setTitle] = React.useState(""); const [startDate, setStartDate] = React.useState(""); const [endDate, setEndDate] = React.useState(""); @@ -61,7 +58,18 @@ export default function CreateEvent() { outdoor, maxPlayers ); - // dispatch(startAuction(title, parseInt(minimumBid), imageUrl)); + dispatch( + createEvent( + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers + ) + ); // setTitle(""); // setMinimumBid("0"); // setImageUrl(""); diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 6f6b3a8..1680b8e 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -1,6 +1,6 @@ import { apiUrl } from "../../config/constants"; import axios from "axios"; -import { selectToken } from "./selectors"; +import { selectToken, selectUser } from "./selectors"; import { appLoading, appDoneLoading, @@ -108,3 +108,43 @@ export const getUserWithStoredToken = () => { } }; }; + +export const createEvent = ( + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers +) => { + return async (dispatch, getState) => { + const { id, token } = selectUser(getState()); + dispatch(appLoading()); + + const response = await axios.post( + `${apiUrl}/events`, + { + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers, + id, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + dispatch( + showMessageWithTimeout("success", false, response.data.message, 3000) + ); + dispatch(appDoneLoading()); + }; +}; From 11b1a44be7402579985e8cb57b5ec5211d85604f Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 12:32:31 +0200 Subject: [PATCH 13/38] create event button fixed to bottom right --- src/pages/Events/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index 5115db7..c478c44 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -35,7 +35,7 @@ const useStyles = makeStyles((theme) => ({ marginBottom: 12, }, fab: { - position: "absolute", + position: "fixed", bottom: theme.spacing(2), right: theme.spacing(2), }, From 3f4f9d0b23f0ba8d63d33f9091bf83b573ffd6f4 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 13:44:38 +0200 Subject: [PATCH 14/38] wider cards --- src/pages/EventDetails/index.js | 10 ++++++++-- src/pages/Events/index.js | 16 +++++++++------- src/store/eventDetails/actions.js | 1 - 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 4a66dd8..cba3ea5 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -57,8 +57,14 @@ export default function Events() {
- - + + ({ heroContent: { padding: theme.spacing(4, 0, 6), }, - bullet: { - display: "inline-block", - margin: "0 2px", - transform: "scale(0.8)", - }, title: { fontSize: 14, }, @@ -79,9 +74,15 @@ export default function Events() { ) : null} - + {events.map((event) => ( - + See details diff --git a/src/store/eventDetails/actions.js b/src/store/eventDetails/actions.js index e629949..99bc748 100644 --- a/src/store/eventDetails/actions.js +++ b/src/store/eventDetails/actions.js @@ -11,7 +11,6 @@ const eventDetailsFetched = (event) => ({ export const fetchEventById = (id) => { return async (dispatch, getState) => { const response = await axios.get(`${apiUrl}/events/${id}`); - console.log(response); dispatch(eventDetailsFetched(response.data.event)); }; }; From d62c1af387a497c9eceba9878a76751b317704d8 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 15:45:59 +0200 Subject: [PATCH 15/38] show attendings in event overview --- src/pages/Events/index.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index 17c1574..d3d2959 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -101,6 +101,15 @@ export default function Events() { {event.description} + {event.attandees.length ? ( + + {event.attandees.length} attending + + ) : null} + From 82bdc291aa37bc9c81a5d655ae24d77f7dc276ad Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 16:33:50 +0200 Subject: [PATCH 16/38] eventDetails show attendees as list --- src/pages/EventDetails/index.js | 20 ++++++++++++++++++++ src/store/eventDetails/reducer.js | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index cba3ea5..1f5bd13 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -10,6 +10,11 @@ import { CardContent, Button, CardActions, + List, + ListItem, + Avatar, + ListItemAvatar, + ListItemText, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; @@ -83,6 +88,21 @@ export default function Events() { {event.description} + {event.attandees.map((attendee) => { + return ( + + + + + + + + + ); + })} diff --git a/src/store/eventDetails/reducer.js b/src/store/eventDetails/reducer.js index cc941e2..1028dbc 100644 --- a/src/store/eventDetails/reducer.js +++ b/src/store/eventDetails/reducer.js @@ -1,6 +1,8 @@ import { EVENT_DETAILS_FETCHED } from "./actions"; -const initialState = {}; +const initialState = { + attandees: [], +}; export default (state = initialState, { type, payload }) => { switch (type) { From e0eaf0cd1fe1f98a3d241e2014c4ad1528d7e8c0 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Tue, 23 Jun 2020 20:10:41 +0200 Subject: [PATCH 17/38] attend event through event details --- src/pages/EventDetails/index.js | 10 ++++++++ src/store/eventDetails/reducer.js | 7 ++++++ src/store/events/reducer.js | 8 ++++++- src/store/user/actions.js | 39 +++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 1f5bd13..a57bcf0 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -20,6 +20,7 @@ import { makeStyles } from "@material-ui/core/styles"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; +import { attendEvent } from "../../store/user/actions"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -104,6 +105,15 @@ export default function Events() { ); })} + + + diff --git a/src/store/eventDetails/reducer.js b/src/store/eventDetails/reducer.js index 1028dbc..de79119 100644 --- a/src/store/eventDetails/reducer.js +++ b/src/store/eventDetails/reducer.js @@ -1,4 +1,5 @@ import { EVENT_DETAILS_FETCHED } from "./actions"; +import { ATTEND_EVENT } from "../user/actions"; const initialState = { attandees: [], @@ -9,6 +10,12 @@ export default (state = initialState, { type, payload }) => { case EVENT_DETAILS_FETCHED: return { ...state, ...payload }; + case ATTEND_EVENT: + return { + ...state, + attandees: [...state.attandees, payload], + }; + default: return state; } diff --git a/src/store/events/reducer.js b/src/store/events/reducer.js index bbb304e..67e83f6 100644 --- a/src/store/events/reducer.js +++ b/src/store/events/reducer.js @@ -1,5 +1,5 @@ import { FETCH_EVENTS_SUCCESS } from "./actions"; -// import { HEART_INCREMENT } from "../artworkDetails/actions"; +import { UPDATE_EVENTS } from "../user/actions"; const initialState = []; @@ -8,6 +8,12 @@ export default (state = initialState, action) => { case FETCH_EVENTS_SUCCESS: return [...state, ...action.payload]; + case UPDATE_EVENTS: + return { + ...state, + ...action.payload, + }; + // case HEART_INCREMENT: // return state.map((artwork) => // artwork.id === action.payload diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 1680b8e..8945159 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -11,6 +11,8 @@ import { export const LOGIN_SUCCESS = "LOGIN_SUCCESS"; export const TOKEN_STILL_VALID = "TOKEN_STILL_VALID"; export const LOG_OUT = "LOG_OUT"; +export const ATTEND_EVENT = "ATTEND_EVENT"; +export const UPDATE_EVENTS = "UPDATE_EVENTS"; const loginSuccess = (userWithToken) => { return { @@ -148,3 +150,40 @@ export const createEvent = ( dispatch(appDoneLoading()); }; }; + +export const attendEvent = (eventId) => { + return async (dispatch, getState) => { + const { id, token } = selectUser(getState()); + dispatch(appLoading()); + + const response = await axios.post( + `${apiUrl}/events/${eventId}/rsvp`, + { + id, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + // console.log("log from action:", response.data); + dispatch(attendEventSuccess(response.data.user)); + // dispatch(updateEventsList(response.data.event)); + dispatch(appDoneLoading()); + }; +}; + +const attendEventSuccess = (user) => { + return { + type: ATTEND_EVENT, + payload: user, + }; +}; + +const updateEventsList = (event) => { + return { + type: UPDATE_EVENTS, + payload: event, + }; +}; From 4ff345d5ef9a94d6bab0706bec32472d792796ee Mon Sep 17 00:00:00 2001 From: mir4cles Date: Wed, 24 Jun 2020 15:21:00 +0200 Subject: [PATCH 18/38] if rsvp already exists message will be shown --- src/pages/EventDetails/index.js | 18 ++++++++++---- src/pages/Events/index.js | 4 ++-- src/store/eventDetails/reducer.js | 4 ++-- src/store/user/actions.js | 39 ++++++++++++++++++++----------- src/store/user/reducer.js | 2 +- 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index a57bcf0..8f2cf69 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -15,12 +15,15 @@ import { Avatar, ListItemAvatar, ListItemText, + Skeleton, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; +import EventAvailableIcon from "@material-ui/icons/EventAvailable"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; import { attendEvent } from "../../store/user/actions"; +import { selectToken } from "../../store/user/selectors"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -37,14 +40,17 @@ const useStyles = makeStyles((theme) => ({ pos: { marginBottom: 12, }, + button: { + margin: theme.spacing(1), + }, })); export default function Events() { const classes = useStyles(); - const { id } = useParams(); const event = useSelector(selectEventDetails); const dispatch = useDispatch(); + const token = useSelector(selectToken); useEffect(() => { dispatch(fetchEventById(id)); @@ -70,7 +76,7 @@ export default function Events() { container spacing={5} > - + {event.description} - {event.attandees.map((attendee) => { + {event.attending.map((attendee) => { return ( @@ -107,11 +113,13 @@ export default function Events() { diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index d3d2959..de18129 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -101,13 +101,13 @@ export default function Events() { {event.description} - {event.attandees.length ? ( + {event.attending.length ? ( - {event.attandees.length} attending + {event.attending.length} attending ) : null} diff --git a/src/store/eventDetails/reducer.js b/src/store/eventDetails/reducer.js index de79119..4193fe6 100644 --- a/src/store/eventDetails/reducer.js +++ b/src/store/eventDetails/reducer.js @@ -2,7 +2,7 @@ import { EVENT_DETAILS_FETCHED } from "./actions"; import { ATTEND_EVENT } from "../user/actions"; const initialState = { - attandees: [], + attending: [], }; export default (state = initialState, { type, payload }) => { @@ -13,7 +13,7 @@ export default (state = initialState, { type, payload }) => { case ATTEND_EVENT: return { ...state, - attandees: [...state.attandees, payload], + attending: [...state.attending, payload], }; default: diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 8945159..e717fc8 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -156,21 +156,32 @@ export const attendEvent = (eventId) => { const { id, token } = selectUser(getState()); dispatch(appLoading()); - const response = await axios.post( - `${apiUrl}/events/${eventId}/rsvp`, - { - id, - }, - { - headers: { - Authorization: `Bearer ${token}`, + try { + const response = await axios.post( + `${apiUrl}/events/${eventId}/rsvp`, + { + id, }, - } - ); - // console.log("log from action:", response.data); - dispatch(attendEventSuccess(response.data.user)); - // dispatch(updateEventsList(response.data.event)); - dispatch(appDoneLoading()); + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + dispatch(attendEventSuccess(response.data.user)); + // dispatch(updateEventsList(response.data.event)); + dispatch(appDoneLoading()); + } catch (error) { + console.log(error); + dispatch( + showMessageWithTimeout( + "succes", + false, + "You are already attending this event", + 3000 + ) + ); + } }; }; diff --git a/src/store/user/reducer.js b/src/store/user/reducer.js index 5b93e1a..b14b7c1 100644 --- a/src/store/user/reducer.js +++ b/src/store/user/reducer.js @@ -3,7 +3,7 @@ import { LOG_OUT, LOGIN_SUCCESS, TOKEN_STILL_VALID } from "./actions"; const initialState = { token: localStorage.getItem("token"), name: null, - email: null + email: null, }; export default (state = initialState, action) => { From d5e1b2212e95cee3fc00fc688b09eed45b8623e2 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Wed, 24 Jun 2020 16:29:46 +0200 Subject: [PATCH 19/38] show cancel button if rsvp exists --- src/pages/EventDetails/index.js | 39 +++++++++++++++++++++++---------- src/pages/Events/index.js | 3 --- src/store/user/actions.js | 2 -- src/store/user/selectors.js | 4 ++-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 8f2cf69..44eba91 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -19,11 +19,12 @@ import { } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import EventAvailableIcon from "@material-ui/icons/EventAvailable"; +import EventBusyIcon from "@material-ui/icons/EventBusy"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; import { attendEvent } from "../../store/user/actions"; -import { selectToken } from "../../store/user/selectors"; +import { selectToken, selectUser } from "../../store/user/selectors"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -51,6 +52,30 @@ export default function Events() { const event = useSelector(selectEventDetails); const dispatch = useDispatch(); const token = useSelector(selectToken); + const user = useSelector(selectUser); + + const attendingIds = event.attending.map((user) => user.id); + const attendButton = attendingIds.includes(user.id) ? ( + + ) : ( + + ); useEffect(() => { dispatch(fetchEventById(id)); @@ -111,17 +136,7 @@ export default function Events() { ); })} - - - + {token ? {attendButton} : null} diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index de18129..ab604d5 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -120,9 +120,6 @@ export default function Events() { > See details - diff --git a/src/store/user/actions.js b/src/store/user/actions.js index e717fc8..b621818 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -169,10 +169,8 @@ export const attendEvent = (eventId) => { } ); dispatch(attendEventSuccess(response.data.user)); - // dispatch(updateEventsList(response.data.event)); dispatch(appDoneLoading()); } catch (error) { - console.log(error); dispatch( showMessageWithTimeout( "succes", diff --git a/src/store/user/selectors.js b/src/store/user/selectors.js index 57c0253..0cff551 100644 --- a/src/store/user/selectors.js +++ b/src/store/user/selectors.js @@ -1,3 +1,3 @@ -export const selectToken = state => state.user.token; +export const selectToken = (state) => state.user.token; -export const selectUser = state => state.user; +export const selectUser = (state) => state.user; From 27ad79457f3312acc777157d629f9751b7c29327 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Wed, 24 Jun 2020 20:42:00 +0200 Subject: [PATCH 20/38] remove rsvp in state --- src/pages/EventDetails/index.js | 5 ++--- src/store/eventDetails/reducer.js | 8 +++++++- src/store/user/actions.js | 33 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 44eba91..97b5e19 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -15,7 +15,6 @@ import { Avatar, ListItemAvatar, ListItemText, - Skeleton, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import EventAvailableIcon from "@material-ui/icons/EventAvailable"; @@ -23,7 +22,7 @@ import EventBusyIcon from "@material-ui/icons/EventBusy"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; -import { attendEvent } from "../../store/user/actions"; +import { attendEvent, cancelAttendEvent } from "../../store/user/actions"; import { selectToken, selectUser } from "../../store/user/selectors"; const useStyles = makeStyles((theme) => ({ @@ -61,7 +60,7 @@ export default function Events() { color="secondary" className={classes.button} startIcon={} - onClick={() => dispatch(attendEvent(id))} + onClick={() => dispatch(cancelAttendEvent(id))} > Cancel diff --git a/src/store/eventDetails/reducer.js b/src/store/eventDetails/reducer.js index 4193fe6..0bd1f5e 100644 --- a/src/store/eventDetails/reducer.js +++ b/src/store/eventDetails/reducer.js @@ -1,5 +1,5 @@ import { EVENT_DETAILS_FETCHED } from "./actions"; -import { ATTEND_EVENT } from "../user/actions"; +import { ATTEND_EVENT, CANCEL_ATTEND_EVENT } from "../user/actions"; const initialState = { attending: [], @@ -16,6 +16,12 @@ export default (state = initialState, { type, payload }) => { attending: [...state.attending, payload], }; + case CANCEL_ATTEND_EVENT: + return { + ...state, + attending: [...state.attending.filter((rsvp) => rsvp.id !== payload)], + }; + default: return state; } diff --git a/src/store/user/actions.js b/src/store/user/actions.js index b621818..bf43b54 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -13,6 +13,7 @@ export const TOKEN_STILL_VALID = "TOKEN_STILL_VALID"; export const LOG_OUT = "LOG_OUT"; export const ATTEND_EVENT = "ATTEND_EVENT"; export const UPDATE_EVENTS = "UPDATE_EVENTS"; +export const CANCEL_ATTEND_EVENT = "CANCEL_ATTEND_EVENT"; const loginSuccess = (userWithToken) => { return { @@ -190,6 +191,38 @@ const attendEventSuccess = (user) => { }; }; +export const cancelAttendEvent = (eventId) => { + return async (dispatch, getState) => { + const { id, token } = selectUser(getState()); + dispatch(appLoading()); + try { + await axios.delete(`${apiUrl}/events/${eventId}/rsvp`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + dispatch(cancelAttendEventSuccess(id)); + dispatch(appDoneLoading()); + } catch (error) { + dispatch( + showMessageWithTimeout( + "succes", + false, + "You already cancelled this event", + 3000 + ) + ); + } + }; +}; + +const cancelAttendEventSuccess = (userId) => { + return { + type: CANCEL_ATTEND_EVENT, + payload: userId, + }; +}; + const updateEventsList = (event) => { return { type: UPDATE_EVENTS, From fb86e69826193dbadd3e79429d1d6022e5bcca8b Mon Sep 17 00:00:00 2001 From: mir4cles Date: Wed, 24 Jun 2020 21:13:43 +0200 Subject: [PATCH 21/38] removed update_events from reducer --- src/store/events/reducer.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/store/events/reducer.js b/src/store/events/reducer.js index 67e83f6..bb45075 100644 --- a/src/store/events/reducer.js +++ b/src/store/events/reducer.js @@ -1,5 +1,4 @@ import { FETCH_EVENTS_SUCCESS } from "./actions"; -import { UPDATE_EVENTS } from "../user/actions"; const initialState = []; @@ -8,19 +7,6 @@ export default (state = initialState, action) => { case FETCH_EVENTS_SUCCESS: return [...state, ...action.payload]; - case UPDATE_EVENTS: - return { - ...state, - ...action.payload, - }; - - // case HEART_INCREMENT: - // return state.map((artwork) => - // artwork.id === action.payload - // ? { ...artwork, hearts: artwork.hearts + 1 } - // : artwork - // ); - default: return state; } From 5415e5a8e6906cfdefeba3fc21fbd4ba1d56bb0b Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 25 Jun 2020 11:08:06 +0200 Subject: [PATCH 22/38] edit event details with no re-direct --- src/pages/EventDetails/EditEventForm.js | 215 ++++++++++++++++++++++++ src/pages/EventDetails/index.js | 186 +++++++++++++------- src/store/user/actions.js | 41 ++++- 3 files changed, 377 insertions(+), 65 deletions(-) create mode 100644 src/pages/EventDetails/EditEventForm.js diff --git a/src/pages/EventDetails/EditEventForm.js b/src/pages/EventDetails/EditEventForm.js new file mode 100644 index 0000000..133e70e --- /dev/null +++ b/src/pages/EventDetails/EditEventForm.js @@ -0,0 +1,215 @@ +import React from "react"; +import { useDispatch, useSelector } from "react-redux"; + +import { + Container, + Typography, + Grid, + TextField, + FormControlLabel, + Checkbox, + Button, +} from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; + +import { selectToken } from "../../store/user/selectors"; +import { editEvent } from "../../store/user/actions"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + buttons: { + display: "flex", + justifyContent: "flex-end", + }, + formControl: { + margin: theme.spacing(1), + minWidth: 120, + maxWidth: 300, + }, +})); + +export default function EditEventForm(props) { + const classes = useStyles(); + const token = useSelector(selectToken); + const event = props.props; + const eventId = event.id; + + const dispatch = useDispatch(); + + const [title, setTitle] = React.useState(event.title); + const [startDate, setStartDate] = React.useState(event.startDateTime); + const [endDate, setEndDate] = React.useState(event.endDateTime); + const [location, setLocation] = React.useState(event.location); + const [sportType, setSportType] = React.useState(event.sportType); + const [description, setDescription] = React.useState(event.description); + const [outdoor, setOutdoor] = React.useState(event.outdoor); + const [maxPlayers, setMaxPlayers] = React.useState(25); + + function submitForm(event) { + event.preventDefault(); + dispatch( + editEvent( + eventId, + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers + ) + ); + } + + if (token === null) { + return ( + <> + + +

Only registered users can edit events.

+
+
+ + ); + } + + return ( + <> + + + {event.title} + + + + + + setTitle(event.target.value)} + /> + + + setStartDate(event.target.value)} + /> + + + setEndDate(event.target.value)} + /> + + + setLocation(event.target.value)} + /> + + + setSportType(event.target.value)} + /> + + + setMaxPlayers(event.target.value)} + /> + + + setDescription(event.target.value)} + /> + + + } + label="This is an outdoor event" + onChange={() => setOutdoor(!outdoor)} + defaultValue={event.outdoor} + checked={outdoor} + /> + + +
+ +
+
+ + ); +} diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 97b5e19..32b2c62 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useParams } from "react-router-dom"; @@ -19,11 +19,19 @@ import { import { makeStyles } from "@material-ui/core/styles"; import EventAvailableIcon from "@material-ui/icons/EventAvailable"; import EventBusyIcon from "@material-ui/icons/EventBusy"; +import EditIcon from "@material-ui/icons/Edit"; + +import Loading from "../../components/Loading"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; -import { attendEvent, cancelAttendEvent } from "../../store/user/actions"; +import { + attendEvent, + cancelAttendEvent, + editEvent, +} from "../../store/user/actions"; import { selectToken, selectUser } from "../../store/user/selectors"; +import EditEventForm from "./EditEventForm"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -52,6 +60,7 @@ export default function Events() { const dispatch = useDispatch(); const token = useSelector(selectToken); const user = useSelector(selectUser); + const [editMode, setEditMode] = useState(false); const attendingIds = event.attending.map((user) => user.id); const attendButton = attendingIds.includes(user.id) ? ( @@ -80,66 +89,121 @@ export default function Events() { dispatch(fetchEventById(id)); }, [dispatch, id]); - return ( - <> - - + - Events - - - - + Event details + + + + + + + + + {event.startDateTime} + + + {event.title} + + + Location: {event.location} + + + {event.description} + + {event.attending.map((attendee) => { + return ( + + + + + + + + + ); + })} + + + {token ? attendButton : null} + {event.userId === user.id ? ( + + ) : null} + + + + + + + ); + } else { + return ( + <> + - - - - - {event.startDateTime} - - - {event.title} - - - Location: {event.location} - - - {event.description} - - {event.attending.map((attendee) => { - return ( - - - - - - - - - ); - })} - - {token ? {attendButton} : null} - + + Edit event details + + + + + + + + + + + - - - - ); +
+ + ); + } } diff --git a/src/store/user/actions.js b/src/store/user/actions.js index bf43b54..1e33a9e 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -223,9 +223,42 @@ const cancelAttendEventSuccess = (userId) => { }; }; -const updateEventsList = (event) => { - return { - type: UPDATE_EVENTS, - payload: event, +export const editEvent = ( + eventId, + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers +) => { + return async (dispatch, getState) => { + const { id, token } = selectUser(getState()); + dispatch(appLoading()); + + const response = await axios.patch( + `${apiUrl}/events/${eventId}`, + { + title, + startDate, + endDate, + location, + sportType, + description, + outdoor, + maxPlayers, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + dispatch( + showMessageWithTimeout("success", false, response.data.message, 3000) + ); + dispatch(appDoneLoading()); }; }; From 7695bed1c0880e61185272972046e9e58a04a323 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 25 Jun 2020 11:08:44 +0200 Subject: [PATCH 23/38] changes setMessage --- package-lock.json | 100 +++++++++++++++++++----- package.json | 2 + src/pages/EventDetails/EditEventForm.js | 1 + src/store/user/actions.js | 8 +- 4 files changed, 88 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4e1e04..520fd18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6225,16 +6225,11 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", + "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" + "@babel/runtime": "^7.7.6" } }, "hmac-drbg": { @@ -8719,13 +8714,12 @@ "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" }, "mini-create-react-context": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", "requires": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" } }, "mini-css-extract-plugin": { @@ -11164,15 +11158,15 @@ } }, "react-router": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", + "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -11180,6 +11174,19 @@ "tiny-warning": "^1.0.0" }, "dependencies": { + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -11207,6 +11214,61 @@ "react-router": "5.1.2", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" + }, + "dependencies": { + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "react-router": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + } } }, "react-scripts": { diff --git a/package.json b/package.json index 17a3e07..db61a9c 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,12 @@ "axios": "^0.19.2", "bootstrap": "^4.4.1", "fontsource-roboto": "^2.1.4", + "history": "^5.0.0", "react": "^16.13.0", "react-bootstrap": "^1.0.0-beta.17", "react-dom": "^16.13.0", "react-redux": "^7.2.0", + "react-router": "^5.2.0", "react-router-dom": "^5.1.2", "react-scripts": "3.4.0", "redux": "^4.0.5", diff --git a/src/pages/EventDetails/EditEventForm.js b/src/pages/EventDetails/EditEventForm.js index 133e70e..48c399d 100644 --- a/src/pages/EventDetails/EditEventForm.js +++ b/src/pages/EventDetails/EditEventForm.js @@ -1,5 +1,6 @@ import React from "react"; import { useDispatch, useSelector } from "react-redux"; +import { useHistory } from "react-router-dom"; import { Container, diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 1e33a9e..95203ef 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -1,5 +1,7 @@ import { apiUrl } from "../../config/constants"; + import axios from "axios"; + import { selectToken, selectUser } from "./selectors"; import { appLoading, @@ -234,7 +236,7 @@ export const editEvent = ( outdoor, maxPlayers ) => { - return async (dispatch, getState) => { + return async (dispatch, getState, history) => { const { id, token } = selectUser(getState()); dispatch(appLoading()); @@ -256,9 +258,7 @@ export const editEvent = ( }, } ); - dispatch( - showMessageWithTimeout("success", false, response.data.message, 3000) - ); + dispatch(setMessage("success", false, response.data.message)); dispatch(appDoneLoading()); }; }; From 1ff810a67b9b340f4169343d422660919916370d Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 25 Jun 2020 12:03:03 +0200 Subject: [PATCH 24/38] Alert messagebox with proper props --- src/components/MessageBox/index.js | 38 ++++++++++++++++++++++++++---- src/store/appState/actions.js | 6 ++--- src/store/user/actions.js | 34 +++++++++++--------------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/components/MessageBox/index.js b/src/components/MessageBox/index.js index c7f0bf9..77b3ab9 100644 --- a/src/components/MessageBox/index.js +++ b/src/components/MessageBox/index.js @@ -2,17 +2,45 @@ import React from "react"; import { useSelector } from "react-redux"; import Alert from "@material-ui/lab/Alert"; +import Collapse from "@material-ui/core/Collapse"; + +import IconButton from "@material-ui/core/IconButton"; +import CloseIcon from "@material-ui/icons/Close"; import { selectMessage } from "../../store/appState/selectors"; export default function MessageBox() { + const [open, setOpen] = React.useState(true); const message = useSelector(selectMessage); const showMessage = message !== null; + + console.log("showMessage", showMessage); + if (!showMessage) return null; - return ( - - {message.text} - - ); + if (message.dismissable) { + return ( + + { + setOpen(false); + }} + > + + + } + > + {message.text} + + + ); + } + + return {message.text}; } diff --git a/src/store/appState/actions.js b/src/store/appState/actions.js index 57fcfce..6b8b5a6 100644 --- a/src/store/appState/actions.js +++ b/src/store/appState/actions.js @@ -15,8 +15,8 @@ export const setMessage = (variant, dismissable, text) => { payload: { variant, dismissable, - text - } + text, + }, }; }; @@ -26,7 +26,7 @@ export const showMessageWithTimeout = ( text, timeOutMilliSeconds ) => { - return dispatch => { + return (dispatch) => { dispatch(setMessage(variant, dismissable, text)); const timeout = timeOutMilliSeconds || DEFAULT_MESSAGE_TIMEOUT; diff --git a/src/store/user/actions.js b/src/store/user/actions.js index 95203ef..93c38d1 100644 --- a/src/store/user/actions.js +++ b/src/store/user/actions.js @@ -42,15 +42,17 @@ export const signUp = (name, email, password) => { }); dispatch(loginSuccess(response.data)); - dispatch(showMessageWithTimeout("success", true, "account created")); + dispatch( + showMessageWithTimeout("success", true, "Account created. Have fun!") + ); dispatch(appDoneLoading()); } catch (error) { if (error.response) { console.log(error.response.data.message); - dispatch(setMessage("danger", true, error.response.data.message)); + dispatch(setMessage("error", true, error.response.data.message)); } else { console.log(error.message); - dispatch(setMessage("danger", true, error.message)); + dispatch(setMessage("error", true, error.message)); } dispatch(appDoneLoading()); } @@ -66,15 +68,16 @@ export const login = (email, password) => { password, }); dispatch(loginSuccess(response.data)); - dispatch(showMessageWithTimeout("success", false, "welcome back!", 1500)); + console.log(response.data); + dispatch( + setMessage("success", false, `Welcome back ${response.data.name}!`) + ); dispatch(appDoneLoading()); } catch (error) { if (error.response) { - console.log(error.response.data.message); - dispatch(setMessage("danger", true, error.response.data.message)); + dispatch(setMessage("error", false, error.response.data.message)); } else { - console.log(error.message); - dispatch(setMessage("danger", true, error.message)); + dispatch(setMessage("error", false, error.message)); } dispatch(appDoneLoading()); } @@ -147,9 +150,7 @@ export const createEvent = ( }, } ); - dispatch( - showMessageWithTimeout("success", false, response.data.message, 3000) - ); + dispatch(setMessage("success", true, response.data.message)); dispatch(appDoneLoading()); }; }; @@ -206,14 +207,7 @@ export const cancelAttendEvent = (eventId) => { dispatch(cancelAttendEventSuccess(id)); dispatch(appDoneLoading()); } catch (error) { - dispatch( - showMessageWithTimeout( - "succes", - false, - "You already cancelled this event", - 3000 - ) - ); + dispatch(setMessage("warning", true, "You already cancelled this event")); } }; }; @@ -258,7 +252,7 @@ export const editEvent = ( }, } ); - dispatch(setMessage("success", false, response.data.message)); + dispatch(setMessage("success", true, "Event successfully updated")); dispatch(appDoneLoading()); }; }; From 984200d243d2cb9749d10d7b2eb30c9eec6418c0 Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 25 Jun 2020 15:13:30 +0200 Subject: [PATCH 25/38] skeleton card for loading appState --- src/App.js | 1 - src/components/Loading/index.js | 76 ++++++++++++++++++++++++++++++- src/pages/EventDetails/index.js | 8 +++- src/pages/Events/index.js | 8 ++++ src/store/eventDetails/actions.js | 3 ++ src/store/events/actions.js | 7 ++- 6 files changed, 96 insertions(+), 7 deletions(-) diff --git a/src/App.js b/src/App.js index 149b3c2..621203e 100644 --- a/src/App.js +++ b/src/App.js @@ -32,7 +32,6 @@ function App() { <> - {isLoading ? : null} diff --git a/src/components/Loading/index.js b/src/components/Loading/index.js index 8df9c47..bf539b4 100644 --- a/src/components/Loading/index.js +++ b/src/components/Loading/index.js @@ -1,7 +1,81 @@ import React from "react"; import Skeleton from "@material-ui/lab/Skeleton"; +import { + makeStyles, + Container, + Grid, + Card, + CardHeader, + IconButton, + CardContent, +} from "@material-ui/core"; +import MoreVertIcon from "@material-ui/icons/MoreVert"; + +const useStyles = makeStyles((theme) => ({ + heroContent: { + padding: theme.spacing(4, 0, 6), + }, + card: { + width: 600, + margin: theme.spacing(2), + }, + media: { + height: 190, + }, +})); export default function Loading() { - return ; + const classes = useStyles(); + return ( + <> + + + + + } + title={ + + } + subheader={} + /> + + + + + + + + + + + + + ); } diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 32b2c62..ac2e6d9 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -22,6 +22,7 @@ import EventBusyIcon from "@material-ui/icons/EventBusy"; import EditIcon from "@material-ui/icons/Edit"; import Loading from "../../components/Loading"; +import EditEventForm from "./EditEventForm"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; @@ -31,7 +32,7 @@ import { editEvent, } from "../../store/user/actions"; import { selectToken, selectUser } from "../../store/user/selectors"; -import EditEventForm from "./EditEventForm"; +import { selectAppLoading } from "../../store/appState/selectors"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -61,6 +62,7 @@ export default function Events() { const token = useSelector(selectToken); const user = useSelector(selectUser); const [editMode, setEditMode] = useState(false); + const loading = useSelector(selectAppLoading); const attendingIds = event.attending.map((user) => user.id); const attendButton = attendingIds.includes(user.id) ? ( @@ -89,6 +91,10 @@ export default function Events() { dispatch(fetchEventById(id)); }, [dispatch, id]); + if (loading) { + return ; + } + if (!editMode) { return ( <> diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index ab604d5..e14780b 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -18,6 +18,9 @@ import AddIcon from "@material-ui/icons/Add"; import { selectEvents } from "../../store/events/selectors"; import { fetchEvents } from "../../store/events/actions"; import { selectToken } from "../../store/user/selectors"; +import { selectAppLoading } from "../../store/appState/selectors"; + +import Loading from "../../components/Loading"; const useStyles = makeStyles((theme) => ({ heroContent: { @@ -44,11 +47,16 @@ export default function Events() { const events = useSelector(selectEvents); const token = useSelector(selectToken); + const loading = useSelector(selectAppLoading); useEffect(() => { dispatch(fetchEvents()); }, [dispatch]); + if (loading) { + return ; + } + return ( <> diff --git a/src/store/eventDetails/actions.js b/src/store/eventDetails/actions.js index 99bc748..77dcaa8 100644 --- a/src/store/eventDetails/actions.js +++ b/src/store/eventDetails/actions.js @@ -1,5 +1,6 @@ import axios from "axios"; import { apiUrl } from "../../config/constants"; +import { appLoading, appDoneLoading } from "../appState/actions"; export const EVENT_DETAILS_FETCHED = "EVENT_DETAILS_FETCHED"; @@ -10,7 +11,9 @@ const eventDetailsFetched = (event) => ({ export const fetchEventById = (id) => { return async (dispatch, getState) => { + dispatch(appLoading()); const response = await axios.get(`${apiUrl}/events/${id}`); dispatch(eventDetailsFetched(response.data.event)); + dispatch(appDoneLoading()); }; }; diff --git a/src/store/events/actions.js b/src/store/events/actions.js index 637975f..b177540 100644 --- a/src/store/events/actions.js +++ b/src/store/events/actions.js @@ -1,5 +1,6 @@ import { apiUrl, DEFAULT_PAGINATION_LIMIT } from "../../config/constants"; import axios from "axios"; +import { appLoading, appDoneLoading } from "../appState/actions"; export const FETCH_EVENTS_SUCCESS = "FETCH_EVENTS_SUCCESS"; @@ -11,13 +12,11 @@ export const fetchEventsSuccess = (events) => ({ export const fetchEvents = () => { return async (dispatch, getState) => { const eventsCount = getState().events.length; - // const response = await axios.get( - // `http://localhost:4000/events?limit=${DEFAULT_PAGINATION_LIMIT}` - // ); + dispatch(appLoading()); const response = await axios.get( `${apiUrl}/events?limit=${DEFAULT_PAGINATION_LIMIT}&offset=${eventsCount}` ); - // console.log(response.data); dispatch(fetchEventsSuccess(response.data.events.rows)); + dispatch(appDoneLoading()); }; }; From 13c348311f7ee945312ad29ecf45c53f3d18a98d Mon Sep 17 00:00:00 2001 From: mir4cles Date: Thu, 25 Jun 2020 17:33:48 +0200 Subject: [PATCH 26/38] event cards improvements --- src/pages/EventDetails/index.js | 65 +++++++++++++++++++++++---------- src/pages/Events/index.js | 33 +++++++---------- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index ac2e6d9..8d35144 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -64,6 +64,8 @@ export default function Events() { const [editMode, setEditMode] = useState(false); const loading = useSelector(selectAppLoading); + const spotsLeft = event.maxPlayers - event.attending.length; + const attendingIds = event.attending.map((user) => user.id); const attendButton = attendingIds.includes(user.id) ? (
diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 9be8ab0..33a4335 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -15,14 +15,22 @@ import { Avatar, ListItemAvatar, ListItemText, + ListItemIcon, + CardMedia, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import EventAvailableIcon from "@material-ui/icons/EventAvailable"; import EventBusyIcon from "@material-ui/icons/EventBusy"; import EditIcon from "@material-ui/icons/Edit"; +import LocationOnIcon from "@material-ui/icons/LocationOn"; +import SettingsIcon from "@material-ui/icons/Settings"; +import PeopleIcon from "@material-ui/icons/People"; +import ScheduleIcon from "@material-ui/icons/Schedule"; +import PersonPinIcon from "@material-ui/icons/PersonPin"; import Loading from "../../components/Loading"; import EditEventForm from "./EditEventForm"; +import eventHeader from "../../images/teammate.jpg"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; @@ -52,6 +60,9 @@ const useStyles = makeStyles((theme) => ({ button: { margin: theme.spacing(1), }, + media: { + height: 140, + }, })); export default function Events() { @@ -124,53 +135,62 @@ export default function Events() { > + {event.title} - - Start of event: {event.startDateTime} - - - Location: {event.location} - - - Sport: {event.sportType ? event.sportType : "to be decided"} - - - Capacity: {event.maxPlayers} - - - Hosted by: {event.user.name} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description {event.description} {event.attending.length ? ( - - Attending ({spotsLeft} spots available): - + Attending: {event.attending.map((attendee) => { return ( diff --git a/src/pages/Events/index.js b/src/pages/Events/index.js index 0c584e4..1f56276 100644 --- a/src/pages/Events/index.js +++ b/src/pages/Events/index.js @@ -13,17 +13,24 @@ import { Fab, CardHeader, Avatar, + ListItem, + ListItemText, + ListItemIcon, + List, + CardMedia, } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; import AddIcon from "@material-ui/icons/Add"; +import PeopleIcon from "@material-ui/icons/People"; + +import Loading from "../../components/Loading"; +import eventHeader from "../../images/teammate.jpg"; import { selectEvents } from "../../store/events/selectors"; import { fetchEvents } from "../../store/events/actions"; import { selectToken } from "../../store/user/selectors"; import { selectAppLoading } from "../../store/appState/selectors"; -import Loading from "../../components/Loading"; - const useStyles = makeStyles((theme) => ({ heroContent: { padding: theme.spacing(4, 0, 6), @@ -39,6 +46,9 @@ const useStyles = makeStyles((theme) => ({ bottom: theme.spacing(2), right: theme.spacing(2), }, + media: { + height: 140, + }, })); export default function Events() { @@ -86,8 +96,13 @@ export default function Events() { {events.map((event) => ( - + + } @@ -105,21 +120,31 @@ export default function Events() { {event.description} {event.attending.length ? ( - - {event.attending.length} attending - - ) : null} + + + + + + + + + ) : // + // {event.attending.length} attending + // + null} diff --git a/teamMate-gimme5.jpg b/teamMate-gimme5.jpg deleted file mode 100644 index b58c7252f1d4c6160ee418dcd64f20149f5fd635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182340 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

VKvNdgqxStnU!i}RonI{CtR#86{R1>Nd%=h3G zPi26?HExqX!MhwB|6W)cYqdmH189!^9HbVOo;!_TqzToY4v!ZdaPIyi2?2V}pH}s{z(|Zl8c%nK#4} zm9G=q6O*iw{+xW(Oy<8|t7a@we0JnmgYmZa9co2illC+y&ARrX5A{qKOC5QqFx#bj zNeSBXiN=1b+Wi7T{L&_z#AKx-&7%|QcMa(<-jaUMN7g5+PSCL@QpyF6VO+k7N>pf= z2{yx*A8ReJ(Hk_Msztrm&90KB304P;F@P&`f8BmebuarkayRZX`NrydSAWfoP(?X6 zixp*Bp#WS`?YsDU51-MUMMQj2_vr20q{^B16;8UhEZ_q|373%M@AEzXPW+eySomxKd;D6OqIXM+ZPMqjjoH`+Mu#D1VuNDXad_Q~?n3kR`4 zo8M7NtHVeoUej<+bNPup{jdl*hDv#JGES8p5CT@Qet8EaKnU5?d3~DbMNiuqdJR)# zAXc2|LJ-S-WW2T|Kwpz$?s%5Rnl_7|O)x-`{fFzBX}%YhVC#>LTEiCOT8w-9XhBTv~O? zyXgp(!^d*Yc0$EC^8%&}S^6iW9Uu0U&`H-Z4FxB>$tu0ScS_0Z0R07!d}`CSait}y zEK2Q(ESuf<+*^6Af(x#Ubsr;yGn&BQQPS!@r6KhFwsUlqGqxhIcl>qEnZe^|*8_(G zuPaUWSA|iEKHJw?fuB1uhj?%uEqY z*(`sD;CjYJCTvRYj$oH8*Ib_lRZJ&w&rsP?2QE(~N}pOW-{_N;k7Oaj$aI^W>QdTD0j7;N1n>@hXVq zt)-XCA>y-WmlJU2_a4zN(Y?z=7EwX=hut^QU|F|V$;yMKj_6XRW1@RUNwRn|1>qq! z8Cb0&2^uNg7(cNjOp4PL>$iyH>2J-pLgA?BS9dY_uVWbqUR4CIKFLJXVUT1Lg%oXB zxON5gBR5YL5WRIjHT7LqRv8iWAP&rzPaoJZlcFRuRvN?ncsSdo9DB=vrs0Hf!)@HS z>$L`I(IC!7WIz6aLLj#EP-Vn(*SL!+O=Ew)fOYmC$O$ZevTf#L^a%>3@HE7z2MvJe{zp8?sZ&YzTLJESB?#MN>lT zVod!#l1t>4K15>t%R=L2n1Zr?{*MPR!0%m=W>4HajAh3Vd!S^!RJn};(!=#riR@A? z@`+S~DKef;-yTbPZ1AoV`Z*+$(%H^8`Y$Y|LIjY)!-7vg1W)A_V{-;9ZmKIa1&w-T z4MJ~9K*x~tOhcb^6(w5OdwFbM)XCBZ(LeYHnmx1X7$3heYHDYcZop9Paz#%Y3m8$B zZw!M2T_LgU_>bT{!$W4mL^ zoSfW;3OkIjG#mTUBNxq!J|q?ngg-aXyhs2@Um=pKeps>X^tm0P61D1wmM%}_CDqp4 z_T(|6PO?5Q|7hGbG5x$<#2rh!;j-^3h(C#$#HLp5L4Zj!%`ShUV(^@8wcFy7t)=+p zlGo4CB6t@x$;avev*QX5e^lX&|&{-#g`6qW3m;~QnCx6fBq`?EdHZ!@3aGfqNr zvQB<41X?jFICepCu2DuCdrk82sk5i|EqQtRqP`!62MME3+|*%G_;MG%ynW$AqENp; zC7A=$Z$r-yH!M8@UzAcy**yb~BvZ;%klIqBd`KVvCg+36AG&|QRkg@P?z)BKd%ZjA zE@W@Dz%wbwrFhBRDfb#TNyFPTy3s5o0K346??%XccJ%w*f)͊!j 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

    )O;rP1O@;-f)={JiN`V!i9k@z01_fIu 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 Date: Thu, 25 Jun 2020 23:36:26 +0200 Subject: [PATCH 29/38] navbar without tabs --- src/components/Loading/index.js | 10 ++++----- src/components/Navigation/index.js | 36 +++++++++--------------------- src/pages/EventDetails/index.js | 26 +++------------------ src/pages/Events/index.js | 31 +++++++++---------------- src/store/user/actions.js | 14 +++++++----- 5 files changed, 36 insertions(+), 81 deletions(-) diff --git a/src/components/Loading/index.js b/src/components/Loading/index.js index bf539b4..1b270ee 100644 --- a/src/components/Loading/index.js +++ b/src/components/Loading/index.js @@ -38,6 +38,11 @@ export default function Loading() { spacing={5} > + } /> - diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 9f9c4a9..56fe8bb 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -1,6 +1,6 @@ import React from "react"; import { useSelector } from "react-redux"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink, NavLink } from "react-router-dom"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; @@ -17,6 +17,7 @@ import LoggedIn from "./LoggedIn"; import LoggedOut from "./LoggedOut"; import { selectToken } from "../../store/user/selectors"; +import { IconButton } from "@material-ui/core"; const useStyles = makeStyles((theme) => ({ root: { @@ -52,12 +53,16 @@ export default function Navigation() {
    - + component={RouterLink} + to="/" + > + + teamMate @@ -66,34 +71,13 @@ export default function Navigation() { variant="button" color="inherit" className={classes.link} - to="/support" + to="/events" > - SUPPORT + EVENTS {loginLogoutControls} - - - } - label="TEAMS" - component={RouterLink} - to="/teams" - /> - } - label="EVENTS" - component={RouterLink} - to="/events" - /> -
    ); } diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 33a4335..0b9f2f4 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -112,20 +112,10 @@ export default function Events() { return ( <> - - Event details - - - - + - - Edit event details - - - - - - Events - + {token ? ( ) : null} - - - + {events.map((event) => ( - + - ) : // - // {event.attending.length} attending - // - null} + ) : null}
    - + ); } diff --git a/src/components/Navigation/LoggedOut.js b/src/components/Navigation/LoggedOut.js index 1a9d66b..3df4451 100644 --- a/src/components/Navigation/LoggedOut.js +++ b/src/components/Navigation/LoggedOut.js @@ -3,6 +3,7 @@ import { Link as RouterLink } from "react-router-dom"; import { Button } from "@material-ui/core"; export default function LoggedOut() { + const ref = React.createRef(); return ( <> diff --git a/src/components/Navigation/index.js b/src/components/Navigation/index.js index 56fe8bb..e74e624 100644 --- a/src/components/Navigation/index.js +++ b/src/components/Navigation/index.js @@ -1,23 +1,20 @@ import React from "react"; import { useSelector } from "react-redux"; -import { Link as RouterLink, NavLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router-dom"; import AppBar from "@material-ui/core/AppBar"; import Toolbar from "@material-ui/core/Toolbar"; import Typography from "@material-ui/core/Typography"; -import Tabs from "@material-ui/core/Tabs"; -import Tab from "@material-ui/core/Tab"; import Link from "@material-ui/core/Link"; import { makeStyles } from "@material-ui/core/styles"; -import GroupIcon from "@material-ui/icons/Group"; -import EventNoteIcon from "@material-ui/icons/EventNote"; import EmojiEventsIcon from "@material-ui/icons/EmojiEvents"; +import { IconButton } from "@material-ui/core"; import LoggedIn from "./LoggedIn"; import LoggedOut from "./LoggedOut"; import { selectToken } from "../../store/user/selectors"; -import { IconButton } from "@material-ui/core"; +import { selectUser } from "../../store/user/selectors"; const useStyles = makeStyles((theme) => ({ root: { @@ -29,9 +26,6 @@ const useStyles = makeStyles((theme) => ({ title: { flexGrow: 1, }, - tabs: { - flexGrow: 1, - }, link: { margin: theme.spacing(1, 1.5), }, @@ -40,14 +34,9 @@ const useStyles = makeStyles((theme) => ({ export default function Navigation() { const token = useSelector(selectToken); const loginLogoutControls = token ? : ; - const classes = useStyles(); - - const [value, setValue] = React.useState(0); - - const handleChange = (event, newValue) => { - setValue(newValue); - }; + const user = useSelector(selectUser); + const ref = React.createRef(); return (
    @@ -70,11 +59,24 @@ export default function Navigation() { component={RouterLink} variant="button" color="inherit" + ref={ref} className={classes.link} to="/events" > EVENTS + {token ? ( + + {user.name} + + ) : null} {loginLogoutControls} diff --git a/src/pages/EventDetails/EditEventForm.js b/src/pages/EventDetails/EditEventForm.js index c6079e2..e197682 100644 --- a/src/pages/EventDetails/EditEventForm.js +++ b/src/pages/EventDetails/EditEventForm.js @@ -1,6 +1,5 @@ import React from "react"; import { useDispatch, useSelector } from "react-redux"; -import { useHistory } from "react-router-dom"; import { Container, diff --git a/src/pages/EventDetails/index.js b/src/pages/EventDetails/index.js index 0b9f2f4..9fc3bec 100644 --- a/src/pages/EventDetails/index.js +++ b/src/pages/EventDetails/index.js @@ -34,11 +34,7 @@ import eventHeader from "../../images/teammate.jpg"; import { selectEventDetails } from "../../store/eventDetails/selectors"; import { fetchEventById } from "../../store/eventDetails/actions"; -import { - attendEvent, - cancelAttendEvent, - editEvent, -} from "../../store/user/actions"; +import { attendEvent, cancelAttendEvent } from "../../store/user/actions"; import { selectToken, selectUser } from "../../store/user/selectors"; import { selectAppLoading } from "../../store/appState/selectors"; @@ -46,17 +42,9 @@ const useStyles = makeStyles((theme) => ({ heroContent: { padding: theme.spacing(4, 0, 6), }, - bullet: { - display: "inline-block", - margin: "0 2px", - transform: "scale(0.8)", - }, title: { fontSize: 14, }, - pos: { - marginBottom: 12, - }, button: { margin: theme.spacing(1), }, @@ -75,8 +63,6 @@ export default function Events() { const [editMode, setEditMode] = useState(false); const loading = useSelector(selectAppLoading); - const spotsLeft = event.maxPlayers - event.attending.length; - const attendingIds = event.attending.map((user) => user.id); const attendButton = attendingIds.includes(user.id) ? ( ) : ( + + + + ))} + + + ); }