Routing.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { InputForm, CRegisterForm, CLoginForm } from './LoginRegisterLogout'
  2. import { Router, Route, Redirect, Switch } from 'react-router-dom'
  3. import { CExplorePosts } from '../pages/explorePosts'
  4. import { CPostForFeed, Feed } from '../pages/feedPosts'
  5. import { CPostEditor,CPostCreator } from '../pages/createAndEditPost'
  6. import { CPageAboutUser } from '../pages/profilePage'
  7. import { CPost } from '../pages/onePost'
  8. import { Provider, connect } from 'react-redux'
  9. const Routing = ({ token }) => {
  10. return <>
  11. {token ?
  12. <Switch>
  13. <Route path="/profile/:_id" component={CPageAboutUser} />
  14. <Route path="/explore" component={CExplorePosts} />
  15. <Route path="/edit/post/new" component={CPostCreator} />
  16. <Route path="/edit/post/:_id" component={CPostEditor} />
  17. <Route path="/post/:_id" component={CPost} />
  18. <Route path="/feed" component={CPostForFeed} />
  19. <Redirect from="/*" to="/feed" />
  20. </Switch>
  21. :
  22. <Switch>
  23. <Route path="/login" exact component={CLoginForm} />
  24. <Route path="/register" component={CRegisterForm} />
  25. <Route path="/input" component={InputForm} />
  26. <Redirect from="/*" to="/input" />
  27. <CProtectedRoute
  28. roles={['anon']}
  29. fallback="/*"
  30. path="/input"
  31. component={InputForm}
  32. />
  33. </Switch>
  34. }
  35. </>
  36. }
  37. export const CRouting = connect((state) => ({
  38. token: state.auth?.token,
  39. }))(Routing)
  40. const ProtectedRoute = ({
  41. roles = [],
  42. fallback = '/login',
  43. component,
  44. auth,
  45. ...routeProps
  46. }) => {
  47. const WrapperComponent = (renderProps) => {
  48. const C = component
  49. if (!auth) auth = ['anon']
  50. let intersection = auth.filter((x) => roles.includes(x))
  51. if (intersection.length == 0) return <Redirect to={fallback} />
  52. return <C {...renderProps} />
  53. }
  54. return <Route {...routeProps} component={WrapperComponent} />
  55. }
  56. const CProtectedRoute = connect((state) => ({
  57. auth: state.auth?.payload?.sub.acl,
  58. }))(ProtectedRoute)