App.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { lazy, Suspense , useEffect } from 'react';
  2. import { BrowserRouter, Switch } from 'react-router-dom';
  3. import { ToastContainer } from 'react-toastify';
  4. import { useSelector, useDispatch } from 'react-redux';
  5. import { MuiPickersUtilsProvider } from '@material-ui/pickers';
  6. import DateFnsUtils from '@date-io/date-fns';
  7. import s from './App.module.css';
  8. import { getToken } from './redux/authorization/selector'
  9. import { getChat } from './redux/chat/selector'
  10. import { asyncLogout, asyncCurrentUser } from './redux/authorization/operations'
  11. import { setToken, onlineUser,typingChat } from './api-data'
  12. import PrivateRoute from './components/reusableComponents/Routes/PrivateRoute';
  13. import PublicRoute from './components/reusableComponents/Routes/PublicRoute';
  14. import Load from './components/reusableComponents/Load';
  15. const HomePage = lazy(
  16. () =>
  17. import(
  18. './components/HomePage' /* webpackChunkName: "HomePage" */
  19. ),
  20. );
  21. const AuthPage = lazy(
  22. () =>
  23. import(
  24. './components/AuthPage' /* webpackChunkName: "AuthPage" */
  25. ),
  26. );
  27. function App() {
  28. const token = useSelector(getToken)
  29. const { companionId } = useSelector(getChat)
  30. const dispatch = useDispatch()
  31. const handleTypingClose = async () => companionId&& await typingChat(companionId, false)
  32. useEffect(() => {
  33. if (token && localStorage.isChecked === 'true') {
  34. setToken.set(token)
  35. dispatch(asyncCurrentUser())
  36. }
  37. }, [dispatch, token])
  38. useEffect(() => {
  39. const handleKeepIn = async () => {
  40. const isChecked = localStorage.isChecked
  41. if (isChecked&&isChecked === 'false') {
  42. dispatch(asyncLogout())
  43. } else if (isChecked&&isChecked === 'true') {
  44. await onlineUser()
  45. }
  46. }
  47. window.addEventListener("beforeunload",handleKeepIn)
  48. return () => window.removeEventListener("beforeunload", handleKeepIn)
  49. }, [dispatch])
  50. useEffect(() => {
  51. const handleTypingChat = async () => await typingChat(companionId,false)
  52. window.addEventListener("beforeunload",handleTypingChat)
  53. return () => window.removeEventListener("beforeunload", handleTypingChat)
  54. }, [companionId])
  55. return (
  56. <div onMouseLeave={handleTypingClose} className={s.appWrapper}>
  57. <MuiPickersUtilsProvider utils={DateFnsUtils}>
  58. <Suspense fallback={<Load/>}>
  59. <BrowserRouter>
  60. <Switch>
  61. <PrivateRoute exact path="/">
  62. <HomePage/>
  63. </PrivateRoute>
  64. <PublicRoute path={'/w/'} restricted>
  65. <AuthPage />
  66. </PublicRoute>
  67. </Switch>
  68. </BrowserRouter>
  69. </Suspense>
  70. <ToastContainer
  71. position="top-right"
  72. autoClose={5000}
  73. hideProgressBar={false}
  74. newestOnTop={false}
  75. closeOnClick
  76. rtl={false}
  77. pauseOnFocusLoss
  78. draggable
  79. pauseOnHover
  80. />
  81. </MuiPickersUtilsProvider>
  82. </div>
  83. )}
  84. export default App;