diff --git a/package.json b/package.json index cae8988be5d5e4b75ca5763756c9d363c0abe66e..bd81ed312610874e7e0fff5b1f82aa073b79bd8f 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@auth0/auth0-spa-js": "^1.0.2", "@material-ui/core": "^4.9.5", "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.46", "axios": "^0.19.0", "clsx": "^1.1.0", "react": "^16.8.6", diff --git a/src/App.js b/src/App.js index 09498bcbce6caad817e300329f37cbed817406a6..48ae760b5f021dcd48ff0d580b6bbca4bb1c0afd 100644 --- a/src/App.js +++ b/src/App.js @@ -4,7 +4,7 @@ import { Router, Route, Switch } from "react-router-dom"; import PrivateRoute from "./components/PrivateRoute"; import Loading from "./components/Loading"; import NavBar from "./components/NavBar"; -import Home from "./views/Home"; +import LandingPage from "./views/LandingPage"; import Profile from "./views/Profile"; import { useAuth0 } from "./react-auth0-spa"; import history from "./utils/history"; @@ -17,6 +17,7 @@ import IconButton from "@material-ui/core/IconButton"; import Container from "@material-ui/core/Container"; import ChevronLeftIcon from "@material-ui/icons/ChevronLeft"; import Navigation from "./components/Navigation"; +import HomePage from "./views/HomePage"; const drawerWidth = 240; @@ -45,10 +46,6 @@ const useStyles = makeStyles((theme) => ({ }, drawerPaperClose: { overflowX: "hidden", - transition: theme.transitions.create("width", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen - }), width: theme.spacing(7), [theme.breakpoints.up("sm")]: { width: theme.spacing(9) @@ -118,7 +115,8 @@ const App = () => { <div className={classes.appBarSpacer} /> <Container maxWidth="lg" className={classes.container}> <Switch> - <Route path="/" exact component={Home} /> + <Route path="/" exact component={LandingPage} /> + <PrivateRoute path="/home-page" component={HomePage} /> <PrivateRoute path="/profile" component={Profile} /> </Switch> </Container> diff --git a/src/views/Home.js b/src/views/HomePage.js similarity index 62% rename from src/views/Home.js rename to src/views/HomePage.js index f89852c56d6a1c09ae450b55e90b84b9107f6fab..36baa657faaa08a6f99880a154bae54a68d059cd 100644 --- a/src/views/Home.js +++ b/src/views/HomePage.js @@ -1,5 +1,4 @@ -import React, { Fragment, useEffect, useState } from "react"; -import { useAuth0 } from "../react-auth0-spa"; +import React, { useEffect, useState } from "react"; import Api from "../utils/api"; import { makeStyles } from "@material-ui/core/styles"; @@ -10,11 +9,13 @@ import TableContainer from "@material-ui/core/TableContainer"; import TableHead from "@material-ui/core/TableHead"; import TableRow from "@material-ui/core/TableRow"; import Paper from "@material-ui/core/Paper"; +import Pagination from "@material-ui/lab/Pagination"; +import CircularProgress from "@material-ui/core/CircularProgress"; const useStyles = makeStyles({ table: { minWidth: 650, - overflowY: 'scroll', + overflowY: "scroll" }, tableContainer: { margin: 24 @@ -68,21 +69,45 @@ const DataTable = ({ rows }) => { ); }; -const Home = () => { - const { loading, user } = useAuth0(); +const HomePage = () => { const [data, setData] = useState([]); + const [{ max, skip, count }, setPagination] = useState({ + max: 15, + skip: 0, + count: 0 + }); + const [initialized, setInitialized] = useState(false); + const handlePagination = (_event, page) => { + setPagination((prevPagination) => ({ + ...prevPagination, + skip: (page - 1) * prevPagination.max + })); + }; + const query = `max=${max}&skip=${skip}`; useEffect(() => { - if (!loading && user) { - Api.get("rest/sunshine").then((data) => setData(data)); - } - }, [loading, user]); + setInitialized(false); + Promise.all([ + Api.get(`rest/sunshine?q={}&${query}`).then((data) => setData(data)), + Api.get(`rest/sunshine?q={}&h={"$aggregate":["COUNT:"]}`).then((data) => + setPagination((prevPagination) => ({ ...prevPagination, count: data["COUNT "] })) + ) + ]).then(() => setInitialized(true)); + }, [skip]); + + if (!initialized) { + return ( + <div> + <CircularProgress /> + </div> + ); + } return ( - <Fragment> - <h1>There will be dragons</h1> - {!user && <h2>Log in to show some data</h2>} - {user && <DataTable rows={data} />} - </Fragment> + <div> + <h1>Home page</h1> + <Pagination count={Math.ceil(count / max)} page={skip/max + 1} onChange={handlePagination} /> + <DataTable rows={data} /> + </div> ); }; -export default Home; +export default HomePage; diff --git a/src/views/LandingPage.js b/src/views/LandingPage.js new file mode 100644 index 0000000000000000000000000000000000000000..a1321504d7627127f9f62a6bf196f98d6d18869b --- /dev/null +++ b/src/views/LandingPage.js @@ -0,0 +1,14 @@ +import React from "react"; +import { useAuth0 } from "../react-auth0-spa"; +import { Redirect } from "react-router-dom"; + +const LandingPage = () => { + const { user } = useAuth0(); + if (user) { + return <Redirect to="/home-page" />; + } + + return <h1>Landing page</h1>; +}; + +export default LandingPage; diff --git a/yarn.lock b/yarn.lock index bd23de3c63af5d8942b1eaf39464bb4e31747703..2520460db06b439a5323d3cfaffdb86505cfc4fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1220,6 +1220,17 @@ dependencies: "@babel/runtime" "^7.4.4" +"@material-ui/lab@^4.0.0-alpha.46": + version "4.0.0-alpha.46" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.46.tgz#453546d58d3a0064263c198dedb6a1c54d24d1a4" + integrity sha512-JGgZmj1UNP8bbYNAGvndipjXRK3x2+9mFBzbX7MyCj+WpfnJbeqTmJK2No9MXvPj/EZJ1piaKif46FdDc4U93A== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.9.6" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@material-ui/styles@^4.9.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.9.0.tgz#10c31859f6868cfa9d3adf6b6c3e32c9d676bc76" @@ -1265,6 +1276,15 @@ prop-types "^15.7.2" react-is "^16.8.0" +"@material-ui/utils@^4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.9.6.tgz#5f1f9f6e4df9c8b6a263293b68c94834248ff157" + integrity sha512-gqlBn0JPPTUZeAktn1rgMcy9Iczrr74ecx31tyZLVGdBGGzsxzM6PP6zeS7FuoLS6vG4hoZP7hWnOoHtkR0Kvw== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2675,7 +2695,7 @@ clone-deep@^2.0.1: kind-of "^6.0.0" shallow-clone "^1.0.0" -clsx@^1.0.2, clsx@^1.1.0: +clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==