App.tsx 2.9 KB

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