index.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 { getIsOpen } from '../../../../redux/control/selector';
  15. import { sortByRecent,handleSort,timeStampFilter } from '../../../../helpers';
  16. import { asyncStartChatById } from '../../../../redux/chat/operations';
  17. import { actionIsOpen } from '../../../../redux/control/action';
  18. import { TAllMessages } from '../../../../typescript/redux/allMessages/types';
  19. import { TChats } from '../../../../typescript/redux/chats/types';
  20. const useStyles = makeStyles({
  21. container: {
  22. height:'7vh',
  23. borderBottom: 'solid 2px #dddddd',
  24. display: 'flex',
  25. justifyContent: 'space-around',
  26. alignContent: "center",
  27. alignItems:"center",
  28. flexWrap: 'nowrap',
  29. color:'rgba(0, 0, 0, 0.6)'
  30. },
  31. item: {
  32. height:'100%',
  33. display: 'flex',
  34. flexDirection: 'column',
  35. justifyContent: 'center',
  36. alignContent: "center",
  37. alignItems: "center",
  38. cursor:'pointer',
  39. },
  40. icon: {
  41. fontSize: '1rem',
  42. lineHeight: 0,
  43. marginBottom: 0,
  44. fontWeight:600
  45. },
  46. underline: {
  47. fontSize: '2.2rem',
  48. lineHeight: 0,
  49. },
  50. })
  51. interface ISearchLists {
  52. value: string,
  53. setValue: React.Dispatch<string>
  54. sort: boolean,
  55. date: any,
  56. setDate: React.Dispatch<any>,
  57. }
  58. const SearchLists = ({ value,setValue,sort,date,setDate }: ISearchLists) => {
  59. const classes = useStyles()
  60. const dispatch = useDispatch()
  61. const { chats } = useSelector(getStateMemo)
  62. const messagesMemo = useSelector(getAllMessagesMemo)
  63. const isOpen = useSelector(getIsOpen)
  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. isOpen&&dispatch(actionIsOpen(''))
  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. const filteredMessages = (arr: TAllMessages) => arr.filter((el) => {
  85. if (!date) {
  86. if (!el.fullType && el.message.toLowerCase().includes(value.toLowerCase())) {
  87. return el
  88. }
  89. if (el.fullType && el.fullType.toLowerCase().includes(value.toLowerCase())) {
  90. return el
  91. }
  92. } else {
  93. if (!el.fullType && el.message.toLowerCase().includes(value.toLowerCase())
  94. && timeStampFilter(date) === timeStampFilter(el.createdAt)) {
  95. return el
  96. }
  97. if (el.fullType && el.fullType.toLowerCase().includes(value.toLowerCase())
  98. && timeStampFilter(date) === timeStampFilter(el.createdAt)) {
  99. return el
  100. }
  101. }
  102. })
  103. useEffect(() => {
  104. dispatch(asyncGetAllMessages())
  105. dispatch(asyncGetChats())
  106. const handleReset = () => {
  107. dispatch(asyncGetAllMessages())
  108. dispatch(asyncGetChats())
  109. }
  110. const idInterval = setInterval(handleReset, 5000);
  111. return () => clearInterval(idInterval);
  112. }, [dispatch]);
  113. useEffect(() => {
  114. setDate('')
  115. },[setDate])
  116. const filteredAndSorted = filteredChats(sortByRecent(chats,sort))
  117. const allMessagesMemo = filteredMessages(handleSort('createdAt',messagesMemo,sort))
  118. return (
  119. <>
  120. <div className={classes.container}>
  121. <div className={classes.item} style={{color:isActive === 0?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  122. onClick={() => handleIsActive(0)}>
  123. <span className={classes.icon}>Chats</span>
  124. <span className={classes.underline}>___</span>
  125. </div>
  126. <div className={classes.item} style={{color:isActive === 1?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  127. onClick={() => handleIsActive(1)}>
  128. <span className={classes.icon}>Files</span>
  129. <span className={classes.underline}>___</span>
  130. </div>
  131. <div className={classes.item} style={{color:isActive === 2?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  132. onClick={() => handleIsActive(2)}>
  133. <span className={classes.icon}>Media</span>
  134. <span className={classes.underline}>___</span>
  135. </div>
  136. <div className={classes.item} style={{color:isActive === 3?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  137. onClick={() => handleIsActive(3)}>
  138. <span className={classes.icon}>Text</span>
  139. <span className={classes.underline}>___</span>
  140. </div>
  141. <div className={classes.item} style={{color:isActive === 4?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  142. onClick={() => handleIsActive(4)}>
  143. <span className={classes.icon}>Audio</span>
  144. <span className={classes.underline}>___</span>
  145. </div>
  146. <div className={classes.item} style={{color:isActive === 5?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
  147. onClick={() => handleIsActive(5)}>
  148. <span className={classes.icon}>Video</span>
  149. <span className={classes.underline}>___</span>
  150. </div>
  151. </div>
  152. {isActive === 0 && <ChatListRecent value={value} date={date}
  153. filteredAndSorted={filteredAndSorted} handleListItemClick={handleListItemClick} />}
  154. {isActive === 1 && <FilesList allMessagesMemo={allMessagesMemo} value={value} date={date}/>}
  155. {isActive === 2 && <MediaList allMessagesMemo={allMessagesMemo} value={value} date={date}/>}
  156. {isActive === 3 && <TextList allMessagesMemo={allMessagesMemo} value={value} date={date}/>}
  157. {isActive === 4 && <AudioList allMessagesMemo={allMessagesMemo} value={value} date={date}/>}
  158. {isActive === 5 && <VideoList allMessagesMemo={allMessagesMemo} value={value} date={date}/>}
  159. </>
  160. )
  161. }
  162. export default SearchLists