index.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import { useState, useEffect } from 'react';
  2. import { useDispatch,useSelector } from 'react-redux';
  3. import { makeStyles } from '@material-ui/core'
  4. import ChatListRecent from './ChatListRecent'
  5. import FilesList from './FilesList';
  6. import MediaList from './MediaList';
  7. import TextList from './TextList';
  8. import AudioList from './AudioList'
  9. import VideoList from './VideoList';
  10. import { asyncGetAllMessages } from '../../../../redux/allMessages/operations';
  11. import { asyncGetChats } from '../../../../redux/chats/operations';
  12. import { getStateMemo } from '../../../../redux/chats/selector';
  13. import { getAllMessagesMemo } from '../../../../redux/allMessages/selector';
  14. import { getState } from '../../../../redux/control/selector';
  15. import { sortByRecent,timeStampFilter,refreshAppTime } from '../../../../helpers';
  16. import { asyncStartChatById } from '../../../../redux/chat/operations';
  17. import { actionLeftIsOpen,actionRightIsOpen } from '../../../../redux/control/action';
  18. import { TChats } from '../../../../typescript/redux/chats/types';
  19. const useStyles = makeStyles({
  20. container: {
  21. height:'7vh',
  22. borderBottom: 'solid 2px #dddddd',
  23. display: 'flex',
  24. justifyContent: 'space-around',
  25. alignContent: "center",
  26. alignItems:"center",
  27. flexWrap: 'nowrap',
  28. color:'rgba(0, 0, 0, 0.6)'
  29. },
  30. item: {
  31. height:'100%',
  32. display: 'flex',
  33. flexDirection: 'column',
  34. justifyContent: 'center',
  35. alignContent: "center",
  36. alignItems: "center",
  37. cursor:'pointer',
  38. },
  39. icon: {
  40. fontSize: '1rem',
  41. lineHeight: 0,
  42. marginBottom: 0,
  43. fontWeight:600
  44. },
  45. underline: {
  46. fontSize: '2.2rem',
  47. lineHeight: 0,
  48. },
  49. })
  50. interface ISearchLists {
  51. value: string,
  52. setValue: React.Dispatch<string>
  53. sort: boolean,
  54. date: any,
  55. setDate: React.Dispatch<any>,
  56. setDisabled: React.Dispatch<boolean>,
  57. }
  58. const SearchLists = ({ value,setValue,sort,date,setDate,setDisabled }: ISearchLists) => {
  59. const classes = useStyles()
  60. const dispatch = useDispatch()
  61. const { chats, total } = useSelector(getStateMemo)
  62. const messagesMemo = useSelector(getAllMessagesMemo)
  63. const {leftIsOpen,rightIsOpen} = useSelector(getState)
  64. const [isActive, setIsActive] = useState<number>(0)
  65. const handleIsActive = (newValue: number): void => {
  66. setIsActive(newValue)
  67. value && setValue('')
  68. date&&setDate('')
  69. }
  70. const handleListItemClick = (companionId: string) => {
  71. rightIsOpen&&dispatch(actionRightIsOpen(''))
  72. dispatch(asyncStartChatById(companionId))
  73. }
  74. const filteredChats = (arr: TChats) => arr.filter((el) => {
  75. const credentials = el.name + ' ' + el.lastName
  76. if (!date) {
  77. return credentials.toLowerCase().includes(value.toLowerCase())
  78. } else if (credentials.toLowerCase().includes(value.toLowerCase())
  79. &&timeStampFilter(date) === timeStampFilter(el.lastMessageCreatedAt ?
  80. el.lastMessageCreatedAt : el.createdAt)) {
  81. return el
  82. }
  83. })
  84. useEffect(() => {
  85. setDate('')
  86. }, [setDate])
  87. useEffect(() => {
  88. if (isActive === 0) {
  89. dispatch(actionLeftIsOpen('searchChats'))
  90. } else {
  91. dispatch(actionLeftIsOpen('searchAllMessages'))
  92. }
  93. }, [isActive,dispatch])
  94. useEffect(() => {
  95. if (isActive === 0) setDisabled(total === '0'?true:false)
  96. }, [isActive,total,setDisabled])
  97. useEffect(() => {
  98. const handleReset = () => {
  99. if (leftIsOpen === 'searchChats') {
  100. dispatch(asyncGetChats())
  101. } else if (leftIsOpen === 'searchAllMessages') {
  102. dispatch(asyncGetAllMessages())
  103. }
  104. }
  105. handleReset()
  106. const idInterval = setInterval(handleReset, refreshAppTime);
  107. return () => clearInterval(idInterval);
  108. }, [leftIsOpen,dispatch]);
  109. const filteredAndSorted = filteredChats(sortByRecent(chats,sort))
  110. return (
  111. <>
  112. <div className={classes.container}>
  113. <div className={classes.item} style={{color:isActive === 0?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  114. onClick={() => handleIsActive(0)}>
  115. <span className={classes.icon}>Chats</span>
  116. <span className={classes.underline}>___</span>
  117. </div>
  118. <div className={classes.item} style={{color:isActive === 1?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  119. onClick={() => handleIsActive(1)}>
  120. <span className={classes.icon}>Files</span>
  121. <span className={classes.underline}>___</span>
  122. </div>
  123. <div className={classes.item} style={{color:isActive === 2?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  124. onClick={() => handleIsActive(2)}>
  125. <span className={classes.icon}>Media</span>
  126. <span className={classes.underline}>___</span>
  127. </div>
  128. <div className={classes.item} style={{color:isActive === 3?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  129. onClick={() => handleIsActive(3)}>
  130. <span className={classes.icon}>Text</span>
  131. <span className={classes.underline}>___</span>
  132. </div>
  133. <div className={classes.item} style={{color:isActive === 4?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  134. onClick={() => handleIsActive(4)}>
  135. <span className={classes.icon}>Audio</span>
  136. <span className={classes.underline}>___</span>
  137. </div>
  138. <div className={classes.item} style={{color:isActive === 5?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  139. onClick={() => handleIsActive(5)}>
  140. <span className={classes.icon}>Video</span>
  141. <span className={classes.underline}>___</span>
  142. </div>
  143. </div>
  144. {isActive === 0 && <ChatListRecent value={value} date={date}
  145. filteredAndSorted={filteredAndSorted} handleListItemClick={handleListItemClick} />}
  146. {isActive === 1 && <FilesList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled}/>}
  147. {isActive === 2 && <MediaList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled}/>}
  148. {isActive === 3 && <TextList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled}/>}
  149. {isActive === 4 && <AudioList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled}/>}
  150. {isActive === 5 && <VideoList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled}/>}
  151. </>
  152. )
  153. }
  154. export default SearchLists