index.tsx 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { useState, useRef, useEffect } from 'react';
  2. import { useSelector,useDispatch } from 'react-redux';
  3. import { createPortal } from 'react-dom';
  4. import Grid from '@mui/material/Grid'
  5. import SmallMenuBar from './SmallMenuBar'
  6. import SearchLists from './SearchLists';
  7. import SearchBar from './SearchBar'
  8. import ChatsList from './ChatsList'
  9. import MenuBar from './MenuBar'
  10. import ContactsList from './ContactsList'
  11. import AddContact from './AddContact'
  12. import SettingsBar from './SettingsBar';
  13. import EditBar from './EditBar';
  14. import { getAuthorizationState } from '../../../redux/authorization/selector';
  15. import { getLeftIsOpen } from '../../../redux/control/selector';
  16. import { actionLeftIsOpen } from '../../../redux/control/action';
  17. const LeftBar = () => {
  18. const dispatch = useDispatch()
  19. const { sort, nightMode } = useSelector(getAuthorizationState)
  20. const leftIsOpen = useSelector(getLeftIsOpen)
  21. const [modal, setModal] = useState<boolean>(false)
  22. const [popup, setPopup] = useState<boolean>(false);
  23. const [disabled, setDisabled] = useState<boolean>(false)
  24. const [value, setValue] = useState<string>('')
  25. const [date, setDate] = useState<any>('');
  26. const modalRoot = useRef<HTMLDivElement | null>(null);
  27. const handleOpenIsSearch = () => leftIsOpen===''&&dispatch(actionLeftIsOpen('searchChats'))
  28. const handleClick = () => {
  29. dispatch(actionLeftIsOpen(''))
  30. setModal(true)
  31. }
  32. const handleSearch = (e: React.ChangeEvent<HTMLInputElement>):void => setValue(e.target.value)
  33. const handleEnterOpenMenuSm = () => !popup&&setPopup(true)
  34. const handleLeaveCloseMenuSm = () => popup&&setPopup(false)
  35. useEffect(() => {
  36. setValue('')
  37. setDate('')
  38. setModal(false)
  39. setPopup(false)
  40. },[leftIsOpen])
  41. useEffect(() => {
  42. const handleCloseModal = (e:any) => {
  43. if (e.target.id === 'overlay') {
  44. setModal(false)
  45. setPopup(false)
  46. }
  47. }
  48. if (!modalRoot.current) {
  49. const modalHtml = document.getElementById('modal-root') as HTMLDivElement | null
  50. if (modalHtml) {
  51. modalHtml.addEventListener('click',handleCloseModal)
  52. modalRoot.current = modalHtml
  53. }
  54. }
  55. return () => {
  56. if (modalRoot.current) {
  57. modalRoot.current.removeEventListener('click',handleCloseModal)
  58. modalRoot.current = null
  59. }
  60. }
  61. }, [])
  62. return (
  63. <Grid item lg={3} style={{ position: 'relative', backgroundColor:'#ffffff'}}
  64. onMouseEnter={handleEnterOpenMenuSm} onMouseLeave={handleLeaveCloseMenuSm}>
  65. {leftIsOpen === '' || leftIsOpen === 'contacts'
  66. || leftIsOpen === 'searchChats' || leftIsOpen === 'searchAllMessages' ?
  67. <SearchBar handleClick={handleClick} handleOpenIsSearch={handleOpenIsSearch} sort={sort}
  68. handleSearch={handleSearch} leftIsOpen={leftIsOpen} value={value} setDate={setDate}
  69. date={date} disabled={disabled}/>:null}
  70. {leftIsOpen === 'searchChats' || leftIsOpen === 'searchAllMessages' ?<SearchLists value={value} setValue={setValue}
  71. sort={sort} date={date} setDate={setDate} setDisabled={setDisabled}/>:null}
  72. {leftIsOpen === ''&&<ChatsList sort={sort}/>}
  73. {leftIsOpen === '' && popup && <SmallMenuBar setPopup={setPopup} />}
  74. {modal && modalRoot.current &&
  75. createPortal(<MenuBar nightMode={nightMode} />, modalRoot.current)}
  76. {leftIsOpen === 'contacts' && <ContactsList handleClick={handleClick} value={value}
  77. sort={sort} date={date} setDisabled={setDisabled} />}
  78. {leftIsOpen === 'contact' && <AddContact handleClick={handleClick}/>}
  79. {leftIsOpen === 'settings' && <SettingsBar handleClick={handleClick}/>}
  80. {leftIsOpen === 'edit' && <EditBar/>}
  81. </Grid>
  82. )
  83. }
  84. export default LeftBar