index.tsx 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 = ({chatDivRef}:{chatDivRef: any | null}) => {
  18. const dispatch = useDispatch()
  19. const { sort, nightMode,silentMode } = 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>(true)
  24. const [value, setValue] = useState<string>('')
  25. const [date, setDate] = useState<any>('');
  26. const modalRoot = useRef<HTMLDivElement | null>(null);
  27. const handleOpenIsSearch = (e:any) => {
  28. const id = e.target.id
  29. if(leftIsOpen === '' && id === 'sort') return
  30. leftIsOpen === '' && dispatch(actionLeftIsOpen('searchChats'))
  31. }
  32. const handleClick = () => {
  33. dispatch(actionLeftIsOpen(''))
  34. setModal(true)
  35. }
  36. const handleSearch = (e: React.ChangeEvent<HTMLInputElement>):void => setValue(e.target.value)
  37. const handleEnterOpenMenuSm = () => !popup&&setPopup(true)
  38. const handleLeaveCloseMenuSm = () => popup&&setPopup(false)
  39. useEffect(() => {
  40. setValue('')
  41. setDate('')
  42. setModal(false)
  43. setPopup(false)
  44. },[leftIsOpen])
  45. useEffect(() => {
  46. const handleCloseModal = (e:any) => {
  47. if (e.target.id === 'overlay') {
  48. setModal(false)
  49. setPopup(false)
  50. }
  51. }
  52. if (!modalRoot.current) {
  53. const modalHtml = document.getElementById('modal-root') as HTMLDivElement | null
  54. if (modalHtml) {
  55. modalHtml.addEventListener('click',handleCloseModal)
  56. modalRoot.current = modalHtml
  57. }
  58. }
  59. return () => {
  60. if (modalRoot.current) {
  61. modalRoot.current.removeEventListener('click',handleCloseModal)
  62. modalRoot.current = null
  63. }
  64. }
  65. }, [])
  66. return (
  67. <Grid item lg={3} style={{ position: 'relative', backgroundColor:'#ffffff'}}
  68. onMouseEnter={handleEnterOpenMenuSm} onMouseLeave={handleLeaveCloseMenuSm}>
  69. {leftIsOpen === '' || leftIsOpen === 'contacts'
  70. || leftIsOpen === 'searchChats' || leftIsOpen === 'searchAllMessages' ?
  71. <SearchBar handleClick={handleClick} handleOpenIsSearch={handleOpenIsSearch} sort={sort}
  72. handleSearch={handleSearch} leftIsOpen={leftIsOpen} value={value} setDate={setDate}
  73. date={date} disabled={disabled} />:null}
  74. {leftIsOpen === 'searchChats' || leftIsOpen === 'searchAllMessages' ?<SearchLists value={value} setValue={setValue}
  75. sort={sort} date={date} setDate={setDate} setDisabled={setDisabled} chatDivRef={chatDivRef}/>:null}
  76. {leftIsOpen === ''&&<ChatsList sort={sort} setDisabled={setDisabled}/>}
  77. {leftIsOpen === '' && popup && <SmallMenuBar setPopup={setPopup} />}
  78. {modal && modalRoot.current &&
  79. createPortal(<MenuBar nightMode={nightMode} silentMode={silentMode}/>, modalRoot.current)}
  80. {leftIsOpen === 'contacts' && <ContactsList handleClick={handleClick} value={value}
  81. sort={sort} date={date} setDisabled={setDisabled} />}
  82. {leftIsOpen === 'contact' && <AddContact handleClick={handleClick}/>}
  83. {leftIsOpen === 'settings' && <SettingsBar handleClick={handleClick}/>}
  84. {leftIsOpen === 'edit' && <EditBar/>}
  85. </Grid>
  86. )
  87. }
  88. export default LeftBar