App.jsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React, { Suspense } from "react";
  2. import {
  3. BrowserRouter as Router,
  4. Route,
  5. Switch,
  6. Redirect,
  7. } from "react-router-dom";
  8. import { RecoilRoot } from "recoil";
  9. import { nanoid } from "nanoid";
  10. import { ToastContainer } from "react-toastify";
  11. import "react-toastify/dist/ReactToastify.css";
  12. import "rc-slider/assets/index.css";
  13. import GameListView from "./views/GameListView";
  14. import GameView from "./views/GameView";
  15. import AuthView from "./views/AuthView";
  16. import Waiter from "./ui/Waiter";
  17. const App = () => {
  18. return (
  19. <Suspense fallback={<Waiter message={"Loading…"} />}>
  20. <RecoilRoot>
  21. <Router>
  22. <Switch>
  23. <Route path="/game/:gameId/session/" exact>
  24. {({
  25. match: {
  26. params: { gameId },
  27. },
  28. }) => {
  29. // Redirect to new session id
  30. return <Redirect to={`/game/${gameId}/session/${nanoid()}`} />;
  31. }}
  32. </Route>
  33. <Route path="/game/:gameId/session/:room/">
  34. <GameView />
  35. </Route>
  36. <Route path="/game/:gameId?">
  37. <GameView edit />
  38. </Route>
  39. <Route exact path="/games/">
  40. <GameListView />
  41. </Route>
  42. <Route exact path="/login/:userHash/:token">
  43. <AuthView />
  44. </Route>
  45. <Redirect from="/" to="/games/" />
  46. </Switch>
  47. </Router>
  48. </RecoilRoot>
  49. <ToastContainer
  50. position="top-center"
  51. autoClose={3000}
  52. hideProgressBar={false}
  53. newestOnTop
  54. closeOnClick
  55. rtl={false}
  56. pauseOnFocusLoss
  57. draggable
  58. pauseOnHover
  59. />
  60. </Suspense>
  61. );
  62. };
  63. export default App;