App.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 () => 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. <CLoad/>
  70. </Suspense>
  71. <ToastContainer
  72. position="top-right"
  73. autoClose={5000}
  74. hideProgressBar={false}
  75. newestOnTop={false}
  76. closeOnClick
  77. rtl={false}
  78. pauseOnFocusLoss
  79. draggable
  80. pauseOnHover
  81. />
  82. </MuiPickersUtilsProvider>
  83. </div>
  84. )}
  85. export default App;