App.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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,CLoad } from './components/reusableComponents/Loader/Loader';
  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 () => {
  32. companionId&& await typingChat(companionId, false)
  33. }
  34. useEffect(() => {
  35. if (!localStorage.isChecked) localStorage.isChecked = 'true'
  36. localStorage.removeItem('isNew')
  37. }, [])
  38. useEffect(() => {
  39. if (token && localStorage.isChecked === 'true') {
  40. setToken.set(token)
  41. dispatch(asyncCurrentUser())
  42. }
  43. }, [dispatch, token])
  44. useEffect(() => {
  45. const handleKeepIn = async () => {
  46. if (localStorage.isChecked === 'false') {
  47. dispatch(asyncLogout())
  48. } else if (localStorage.isChecked === 'true') {
  49. await onlineUser()
  50. }
  51. }
  52. window.addEventListener("beforeunload",handleKeepIn)
  53. return () => window.removeEventListener("beforeunload", handleKeepIn)
  54. }, [dispatch])
  55. useEffect(() => {
  56. const handleTypingChat = async () => await typingChat(companionId,false)
  57. window.addEventListener("beforeunload",handleTypingChat)
  58. return () => window.removeEventListener("beforeunload", handleTypingChat)
  59. }, [companionId])
  60. return (
  61. <div onMouseLeave={handleTypingClose} className={s.appWrapper}>
  62. <MuiPickersUtilsProvider utils={DateFnsUtils}>
  63. <Suspense fallback={<Load/>}>
  64. <BrowserRouter>
  65. <Switch>
  66. <PrivateRoute exact path="/">
  67. <HomePage/>
  68. </PrivateRoute>
  69. <PublicRoute path={'/w/'} restricted>
  70. <AuthPage />
  71. </PublicRoute>
  72. </Switch>
  73. </BrowserRouter>
  74. <CLoad/>
  75. </Suspense>
  76. <ToastContainer
  77. position="top-right"
  78. autoClose={5000}
  79. hideProgressBar={false}
  80. newestOnTop={false}
  81. closeOnClick
  82. rtl={false}
  83. pauseOnFocusLoss
  84. draggable
  85. pauseOnHover
  86. />
  87. </MuiPickersUtilsProvider>
  88. </div>
  89. )}
  90. export default App;