index.tsx 3.9 KB

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