2
0

app.jsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import React, { Component } from "react";
  2. import { Route, Switch, withRouter } from "react-router-dom";
  3. import PropTypes from "prop-types";
  4. import { connect } from "react-redux";
  5. import { translate } from "react-i18next";
  6. import { ban, authenticate } from "actions/auth";
  7. import Navbar from "components/Global/Navbar";
  8. import config from "config";
  9. import AuthRoute from "components/AuthRoute";
  10. import io from "./io";
  11. import { asyncComponent } from 'react-async-component';
  12. @connect()
  13. @translate(["pages"], { wait: false })
  14. class App extends Component { // eslint-disable-line react/no-multi-comp
  15. static propTypes = {
  16. dispatch: PropTypes.func,
  17. t: PropTypes.func,
  18. };
  19. static defaultProps = {
  20. dispatch: () => {},
  21. t: () => {},
  22. };
  23. componentDidMount() {
  24. const { dispatch } = this.props;
  25. io.init(config.serverDomain);
  26. io.getSocket(socket => {
  27. socket.on("ready", (loggedIn, role, username, userId) => {
  28. dispatch(authenticate({ loggedIn, role, username, userId }));
  29. });
  30. socket.on("keep.event:banned", reason => dispatch(ban(reason)));
  31. socket.on("keep.event:user.session.removed", () => {
  32. location.reload();
  33. // TODO Give user prompt they've been logged out and let them continue.
  34. });
  35. });
  36. if (localStorage.getItem("github_redirect")) {
  37. // TODO
  38. localStorage.removeItem("github_redirect");
  39. }
  40. }
  41. render() {
  42. const { t } = this.props;
  43. return (
  44. <div>
  45. <Navbar />
  46. <Switch>
  47. <AuthRoute
  48. exact
  49. path="/login"
  50. component={ asyncComponent({
  51. resolve: () => System.import("views/Auth/Login"),
  52. name: "Login"
  53. })}
  54. auth="disallowed"
  55. title={ t("pages:login") }
  56. />
  57. <AuthRoute
  58. exact
  59. path="/logout"
  60. component={ asyncComponent({
  61. resolve: () => System.import("views/Auth/Logout"),
  62. name: "Logout"
  63. })}
  64. auth="required"
  65. title="Logout"
  66. />
  67. <AuthRoute
  68. exact
  69. path="/register"
  70. component={ asyncComponent({
  71. resolve: () => System.import("views/Auth/Register"),
  72. name: "Register"
  73. })}
  74. auth="disallowed"
  75. title={ t("pages:register") }
  76. />
  77. <AuthRoute
  78. exact
  79. path="/settings"
  80. component={ asyncComponent({
  81. resolve: () => System.import("views/Auth/Settings"),
  82. name: "Settings"
  83. })}
  84. auth="required"
  85. title={ t("pages:settings") }
  86. />
  87. <AuthRoute
  88. exact
  89. path="/settings/setpassword"
  90. component={ asyncComponent({
  91. resolve: () => System.import("views/Auth/Settings/SetPassword"),
  92. name: "SetPassword"
  93. })}
  94. auth="required"
  95. title={ t("pages:setPassword") }
  96. />
  97. <AuthRoute
  98. exact
  99. path="/reset_password"
  100. component={ asyncComponent({
  101. resolve: () => System.import("views/Auth/ForgotPassword"),
  102. name: "ForgotPassword"
  103. })}
  104. auth="disallowed"
  105. title={ t("pages:resetPassword") }
  106. />
  107. <AuthRoute
  108. path="/terms"
  109. component={ asyncComponent({
  110. resolve: () => System.import("views/Terms"),
  111. name: "Terms"
  112. })}
  113. auth="ignored"
  114. title={ t("pages:terms") }
  115. />
  116. <AuthRoute
  117. path="/privacy"
  118. component={ asyncComponent({
  119. resolve: () => System.import("views/Privacy"),
  120. name: "Privacy"
  121. })}
  122. auth="ignored"
  123. title={ t("pages:privacy") }
  124. />
  125. <AuthRoute
  126. path="/team"
  127. component={ asyncComponent({
  128. resolve: () => System.import("views/Team"),
  129. name: "Team"
  130. })}
  131. auth="ignored"
  132. title={ t("pages:team") }
  133. />
  134. <AuthRoute
  135. path="/u/:username"
  136. component={ asyncComponent({
  137. resolve: () => System.import("views/Profile"),
  138. name: "Profile"
  139. })}
  140. auth="ignored"
  141. title={ t("pages:profile") }
  142. />
  143. <AuthRoute
  144. exact
  145. path="/"
  146. component={ asyncComponent({
  147. resolve: () => System.import("views/Home"),
  148. name: "Home"
  149. })}
  150. auth="ignored"
  151. title={ t("pages:homepage") }
  152. />
  153. <AuthRoute
  154. path="*"
  155. component={ asyncComponent({
  156. resolve: () => System.import("views/Errors/Error404"),
  157. name: "Error404"
  158. })}
  159. auth="ignored"
  160. title={ t("pages:error404") }
  161. />
  162. </Switch>
  163. </div>
  164. );
  165. }
  166. }
  167. export default withRouter(App);