In the previous part we finished the dashboard read functionality, now we want to add the skeleton for other pages:
In this page the user will be able to login to their account and the dashboard won't show unless the user is logged in.
In this page the user will be able to update their daily nutrition goals that they can track in the dashboard.
to be able to have multiple 'pages' in react and navigate from one to one, we need something that can switch the rendered content based on what we want, we can do that with if statements in the App components and store some location state, but why invent the wheel.
every major single page app web framework has the routing concept and functionality to interact with the usual browser urls and switch the content based what user should see.
for example on the profile page I want the url path to be /profile, and for login to be /login and so on.
in more advanced cases you want the users to be able to bookmark a page and be able to get back to that page with state they left it on and that is tricky in single page apps because as in our case we deal with state which doesn't read anything from url and everything is just stored in browser memory.
for this PR I only added the navigation and authentication protection of dashboard & profile using react router, in future we can try to do something like making the date be a url parameter so users can bookmark specific dates in their dashboard.
here is the core lines that hold the routing logic (see routes.js)
everything added to enable router is in this PR, and I commented on the PR changes to explain each change.
Things to note
1- React Router manages its own state, it's not managed by redux
Yes things can get a bit messy because now we have two different sources of state and this means if we want a button to udpate the url and pass filters for examples (like the date navigation) then we need to let our components to read that from router state and not from the redux stored state.
there is a library that synchronizes redux and router called connected-react-router
more about this here:
2- we can check authentication and decide to either redirect to login or allow and render the component by adding custom PrivateRoute component (see routes.js), see also how the login page will redirect back to the referrer (the page the user tried to access before they were redirected to login)
how the app looks right now:
the dummy login page:
our lovely dashboard:
and our dummy profile page:
In the next part I'll be covering PropTypes and how to write unit tests for components then we can add our first form to allow the user to add entries to their day.