app.jsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 { bindActionCreators } from "redux";
  6. import { actionCreators as volumeActionCreators } from "ducks/volume";
  7. import { actionCreators as sessionActionCreators } from "ducks/session";
  8. import { translate } from "react-i18next";
  9. import Navbar from "components/Global/Navbar";
  10. import config from "config";
  11. import AuthRoute from "components/AuthRoute";
  12. import io from "./io";
  13. import { asyncComponent } from "react-async-component";
  14. @connect(null, (dispatch) => ({
  15. onVolumeLoudnessChange: bindActionCreators(volumeActionCreators.changeVolumeLoudness, dispatch),
  16. onVolumeMute: bindActionCreators(volumeActionCreators.muteVolume, dispatch),
  17. onVolumeUnmute: bindActionCreators(volumeActionCreators.unmuteVolume, dispatch),
  18. onLogin: bindActionCreators(sessionActionCreators.login, dispatch),
  19. onBanned: bindActionCreators(sessionActionCreators.banned, dispatch),
  20. }))
  21. @translate(["pages"], { wait: false })
  22. class App extends Component { // eslint-disable-line react/no-multi-comp
  23. static propTypes = {
  24. dispatch: PropTypes.func,
  25. t: PropTypes.func,
  26. };
  27. static defaultProps = {
  28. dispatch: () => {},
  29. t: () => {},
  30. };
  31. componentDidMount() {
  32. const { dispatch } = this.props;
  33. io.init(config.serverDomain);
  34. io.getSocket(socket => {
  35. socket.on("ready", (loggedIn, role, username, userId) => {
  36. this.props.onLogin(loggedIn, userId, username, role);
  37. });
  38. socket.on("keep.event:banned", reason => this.props.banned(reason));
  39. socket.on("keep.event:user.session.removed", () => {
  40. location.reload();
  41. // TODO Give user prompt they've been logged out and let them continue.
  42. });
  43. });
  44. if (localStorage.getItem("github_redirect")) {
  45. // TODO
  46. localStorage.removeItem("github_redirect");
  47. }
  48. let volume = parseFloat(localStorage.getItem("volume"));
  49. let muted = (localStorage.getItem("muted"));
  50. volume = (typeof volume === "number" && !isNaN(volume)) ? volume : 20;
  51. localStorage.setItem("volume", volume);
  52. this.props.onVolumeLoudnessChange(volume);
  53. muted ? this.props.onVolumeMute() : this.props.onVolumeUnmute();
  54. }
  55. render() {
  56. const { t } = this.props;
  57. return (
  58. <div>
  59. <Navbar />
  60. <Switch>
  61. <AuthRoute
  62. exact
  63. key="login"
  64. path="/login"
  65. component={ asyncComponent({
  66. resolve: () => System.import("views/Auth/Login"),
  67. name: "Login"
  68. })}
  69. auth="disallowed"
  70. title={ t("pages:login") }
  71. />
  72. <AuthRoute
  73. exact
  74. key="logout"
  75. path="/logout"
  76. component={ asyncComponent({
  77. resolve: () => System.import("views/Auth/Logout"),
  78. name: "Logout"
  79. })}
  80. auth="required"
  81. title="Logout"
  82. />
  83. <AuthRoute
  84. exact
  85. key="register"
  86. path="/register"
  87. component={ asyncComponent({
  88. resolve: () => System.import("views/Auth/Register"),
  89. name: "Register"
  90. })}
  91. auth="disallowed"
  92. title={ t("pages:register") }
  93. />
  94. <AuthRoute
  95. exact
  96. key="settings"
  97. path="/settings"
  98. component={ asyncComponent({
  99. resolve: () => System.import("views/Auth/Settings"),
  100. name: "Settings"
  101. })}
  102. auth="required"
  103. title={ t("pages:settings") }
  104. />
  105. <AuthRoute
  106. exact
  107. key="setpassword"
  108. path="/settings/setpassword"
  109. component={ asyncComponent({
  110. resolve: () => System.import("views/Auth/Settings/SetPassword"),
  111. name: "SetPassword"
  112. })}
  113. auth="required"
  114. title={ t("pages:setPassword") }
  115. />
  116. <AuthRoute
  117. exact
  118. key="resetoasswird"
  119. path="/reset_password"
  120. component={ asyncComponent({
  121. resolve: () => System.import("views/Auth/ForgotPassword"),
  122. name: "ForgotPassword"
  123. })}
  124. auth="disallowed"
  125. title={ t("pages:resetPassword") }
  126. />
  127. <AuthRoute
  128. path="/terms"
  129. key="terms"
  130. component={ asyncComponent({
  131. resolve: () => System.import("views/Terms"),
  132. name: "Terms"
  133. })}
  134. auth="ignored"
  135. title={ t("pages:terms") }
  136. />
  137. <AuthRoute
  138. path="/privacy"
  139. key="privacy"
  140. component={ asyncComponent({
  141. resolve: () => System.import("views/Privacy"),
  142. name: "Privacy"
  143. })}
  144. auth="ignored"
  145. title={ t("pages:privacy") }
  146. />
  147. <AuthRoute
  148. path="/team"
  149. key="team"
  150. component={ asyncComponent({
  151. resolve: () => System.import("views/Team"),
  152. name: "Team"
  153. })}
  154. auth="ignored"
  155. title={ t("pages:team") }
  156. />
  157. <AuthRoute
  158. path="/u/:username"
  159. key="profile"
  160. component={ asyncComponent({
  161. resolve: () => System.import("views/Profile"),
  162. name: "Profile"
  163. })}
  164. auth="ignored"
  165. />
  166. <AuthRoute
  167. path="/community/:name"
  168. key="community"
  169. component={ asyncComponent({
  170. resolve: () => System.import("views/Station"),
  171. name: "Station",
  172. })}
  173. auth="station"
  174. title="TODO"
  175. />
  176. <AuthRoute
  177. path="/official/:name"
  178. key="official"
  179. component={ asyncComponent({
  180. resolve: () => System.import("views/Station"),
  181. name: "Station",
  182. })}
  183. auth="station"
  184. title="TODO"
  185. />
  186. <AuthRoute
  187. exact
  188. path="/"
  189. key="home"
  190. component={ asyncComponent({
  191. resolve: () => System.import("views/Home"),
  192. name: "Home",
  193. })}
  194. auth="ignored"
  195. title={ t("pages:homepage") }
  196. />
  197. <AuthRoute
  198. path="*"
  199. key="404"
  200. component={ asyncComponent({
  201. resolve: () => System.import("views/Errors/Error404"),
  202. name: "Error404",
  203. })}
  204. auth="ignored"
  205. title={ t("pages:error404") }
  206. />
  207. </Switch>
  208. </div>
  209. );
  210. }
  211. }
  212. export default withRouter(App);