index.tsx 3.7 KB

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