index.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 { actionLeftIsOpen } from '../../../redux/control/action';
  16. const LeftBar = () => {
  17. const dispatch = useDispatch()
  18. const { sort,nightMode } = useSelector(getAuthorizationState)
  19. const [isSearch, setIsSearch] = useState<boolean>(false)
  20. const [isMenu, setIsMenu] = useState<boolean>(false)
  21. const [isMenuSm, setIsMenuSm] = useState<boolean>(false);
  22. const [selectedIndex, setSelectedIndex] = useState<number | null>(null)
  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 = () => !isSearch&&setIsSearch(true)
  28. const handleClick = (): void => {
  29. dispatch(actionLeftIsOpen(''))
  30. setValue('')
  31. setDate('')
  32. setDisabled(false)
  33. if (selectedIndex) setSelectedIndex(null)
  34. if(!isSearch) return setIsMenu(!isMenu)
  35. setIsSearch(false)
  36. }
  37. const handleSearch = (e: React.ChangeEvent<HTMLInputElement>):void => setValue(e.target.value)
  38. const handleEnterOpenMenuSm = (): void => {
  39. if(!isMenuSm) setIsMenuSm(true)
  40. }
  41. const handleLeaveCloseMenuSm = (): void => {
  42. if(isMenuSm) setIsMenuSm(false)
  43. }
  44. const handleSelectedMenu = (i: number) => {
  45. setIsSearch(true)
  46. setIsMenu(false)
  47. setIsMenuSm(false)
  48. setValue('')
  49. setDate('')
  50. setSelectedIndex(i)
  51. }
  52. useEffect(() => {
  53. const handleCloseModal = (e:any) => {
  54. if (e.target.id === 'overlay') {
  55. setIsMenu(false)
  56. setIsMenuSm(false)
  57. }
  58. }
  59. if (!modalRoot.current) {
  60. const modal = document.getElementById('modal-root') as HTMLDivElement | null
  61. if (modal) {
  62. modal.addEventListener('click',handleCloseModal)
  63. modalRoot.current = modal
  64. }
  65. }
  66. return () => {
  67. if (modalRoot.current) {
  68. modalRoot.current.removeEventListener('click',handleCloseModal)
  69. modalRoot.current = null
  70. }
  71. }
  72. }, [])
  73. return (
  74. <Grid item lg={3} style={{ position: 'relative', backgroundColor:'#ffffff'}}
  75. onMouseEnter={handleEnterOpenMenuSm} onMouseLeave={handleLeaveCloseMenuSm}>
  76. {selectedIndex !== 2 && selectedIndex !== 3 && selectedIndex !== 4 &&
  77. <SearchBar handleClick={handleClick} handleOpenIsSearch={handleOpenIsSearch} sort={sort}
  78. handleSearch={handleSearch} isSearch={isSearch} value={value} setDate={setDate}
  79. date={date} disabled={disabled} />}
  80. {!selectedIndex && isSearch && <SearchLists value={value} setValue={setValue}
  81. sort={sort} date={date} setDate={setDate} setDisabled={setDisabled}/>}
  82. {!selectedIndex&&!isSearch &&<ChatsList sort={sort}/>}
  83. {!selectedIndex && isMenuSm && !isSearch && <SmallMenuBar
  84. handleSelectedMenu={handleSelectedMenu} setIsMenuSm={setIsMenuSm} />}
  85. {isMenu && modalRoot.current &&
  86. createPortal(<MenuBar handleSelectedMenu={handleSelectedMenu} nightMode={nightMode} />, modalRoot.current)}
  87. {selectedIndex === 1 && <ContactsList handleClick={handleClick} value={value}
  88. sort={sort} date={date} setDisabled={setDisabled} />}
  89. {selectedIndex === 2 && <SettingsBar setSelectedIndex={setSelectedIndex} handleClick={handleClick}/>}
  90. {selectedIndex === 3 && <AddContact setSelectedIndex={setSelectedIndex} handleClick={handleClick}/>}
  91. {selectedIndex === 4 && <EditBar setSelectedIndex={setSelectedIndex}/>}
  92. </Grid>
  93. )
  94. }
  95. export default LeftBar