2
0

app.jsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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(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. path="/login"
  64. component={ asyncComponent({
  65. resolve: () => System.import("views/Auth/Login"),
  66. name: "Login"
  67. })}
  68. auth="disallowed"
  69. title={ t("pages:login") }
  70. />
  71. <AuthRoute
  72. exact
  73. path="/logout"
  74. component={ asyncComponent({
  75. resolve: () => System.import("views/Auth/Logout"),
  76. name: "Logout"
  77. })}
  78. auth="required"
  79. title="Logout"
  80. />
  81. <AuthRoute
  82. exact
  83. path="/register"
  84. component={ asyncComponent({
  85. resolve: () => System.import("views/Auth/Register"),
  86. name: "Register"
  87. })}
  88. auth="disallowed"
  89. title={ t("pages:register") }
  90. />
  91. <AuthRoute
  92. exact
  93. path="/settings"
  94. component={ asyncComponent({
  95. resolve: () => System.import("views/Auth/Settings"),
  96. name: "Settings"
  97. })}
  98. auth="required"
  99. title={ t("pages:settings") }
  100. />
  101. <AuthRoute
  102. exact
  103. path="/settings/setpassword"
  104. component={ asyncComponent({
  105. resolve: () => System.import("views/Auth/Settings/SetPassword"),
  106. name: "SetPassword"
  107. })}
  108. auth="required"
  109. title={ t("pages:setPassword") }
  110. />
  111. <AuthRoute
  112. exact
  113. path="/reset_password"
  114. component={ asyncComponent({
  115. resolve: () => System.import("views/Auth/ForgotPassword"),
  116. name: "ForgotPassword"
  117. })}
  118. auth="disallowed"
  119. title={ t("pages:resetPassword") }
  120. />
  121. <AuthRoute
  122. path="/terms"
  123. component={ asyncComponent({
  124. resolve: () => System.import("views/Terms"),
  125. name: "Terms"
  126. })}
  127. auth="ignored"
  128. title={ t("pages:terms") }
  129. />
  130. <AuthRoute
  131. path="/privacy"
  132. component={ asyncComponent({
  133. resolve: () => System.import("views/Privacy"),
  134. name: "Privacy"
  135. })}
  136. auth="ignored"
  137. title={ t("pages:privacy") }
  138. />
  139. <AuthRoute
  140. path="/team"
  141. component={ asyncComponent({
  142. resolve: () => System.import("views/Team"),
  143. name: "Team"
  144. })}
  145. auth="ignored"
  146. title={ t("pages:team") }
  147. />
  148. <AuthRoute
  149. path="/u/:username"
  150. component={ asyncComponent({
  151. resolve: () => System.import("views/Profile"),
  152. name: "Profile"
  153. })}
  154. auth="ignored"
  155. />
  156. <AuthRoute
  157. path="/community/:name"
  158. component={ asyncComponent({
  159. resolve: () => System.import("views/Station"),
  160. name: "Station",
  161. })}
  162. auth="station"
  163. title="TODO"
  164. />
  165. <AuthRoute
  166. path="/official/:name"
  167. component={ asyncComponent({
  168. resolve: () => System.import("views/Station"),
  169. name: "Station",
  170. })}
  171. auth="station"
  172. title="TODO"
  173. />
  174. <AuthRoute
  175. exact
  176. path="/"
  177. component={ asyncComponent({
  178. resolve: () => System.import("views/Home"),
  179. name: "Home",
  180. })}
  181. auth="ignored"
  182. title={ t("pages:homepage") }
  183. />
  184. <AuthRoute
  185. path="*"
  186. component={ asyncComponent({
  187. resolve: () => System.import("views/Errors/Error404"),
  188. name: "Error404",
  189. })}
  190. auth="ignored"
  191. title={ t("pages:error404") }
  192. />
  193. </Switch>
  194. </div>
  195. );
  196. }
  197. }
  198. export default withRouter(App);