index.tsx 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { makeStyles } from '@material-ui/core'
  2. import { useState,useMemo } from 'react'
  3. import { useSelector,useDispatch } from 'react-redux'
  4. import ForwardSearch from './ForwardSearch'
  5. import ForwardList from './ForwardList'
  6. import { asyncGetChatById } from '../../../../../../redux/chat/operations'
  7. import { actionRightIsOpen,actionScrollChat,actionOpenPinned } from '../../../../../../redux/control/action'
  8. import { getStateMemo } from '../../../../../../redux/chats/selector'
  9. import { getSort } from '../../../../../../redux/authorization/selector'
  10. import { TMessage } from '../../../../../../typescript/redux/messages/types'
  11. import { sortByRecent,timeStampFilter } from '../../../../../../helpers'
  12. const useStyles = makeStyles({
  13. overlay: {
  14. position: 'fixed',
  15. top: 0,
  16. left: 0,
  17. width: '100vw',
  18. height: '100vh',
  19. zIndex: 100,
  20. backgroundColor: 'rgba(104, 105, 104, 0.6)',
  21. overflowY: 'hidden',
  22. },
  23. container: {
  24. backgroundColor: 'white',
  25. width: '22vw',
  26. position: 'absolute',
  27. top: '15vh',
  28. height:'70vh',
  29. left: '39vw',
  30. display: 'flex',
  31. flexWrap: 'wrap',
  32. alignItems: 'start',
  33. alignContent:'start',
  34. borderRadius:10,
  35. }
  36. })
  37. interface IForwardSearchList {
  38. setModalForward: React.Dispatch<React.SetStateAction<boolean>>,
  39. setIsForward: React.Dispatch<React.SetStateAction<TMessage | undefined>>,
  40. companionId: string,
  41. }
  42. const ForwardSearchList = ({setModalForward,setIsForward,companionId}:IForwardSearchList) => {
  43. const classes = useStyles()
  44. const dispatch = useDispatch()
  45. const sort = useSelector(getSort)
  46. const { total,chats } = useSelector(getStateMemo)
  47. const [value, setValue] = useState<string>('')
  48. const [date, setDate] = useState<any>('');
  49. const handleSearch = (e: React.ChangeEvent<HTMLInputElement>): void => setValue(e.target.value)
  50. const handleCloseForwardModal = (e: any) => {
  51. const id = e.target.id
  52. if (id === 'overlay' || id === 'cancel') {
  53. setModalForward(false)
  54. setIsForward(undefined)
  55. }
  56. }
  57. const handleForwardTo = (newCompanionId: string) => {
  58. setModalForward(false)
  59. dispatch(actionRightIsOpen(''))
  60. dispatch(actionOpenPinned(false))
  61. dispatch(asyncGetChatById(newCompanionId))
  62. setIsForward((prevState) =>
  63. prevState ? { ...prevState, companionIdForwardToAndFrom: newCompanionId } : prevState)
  64. if (companionId !== newCompanionId) setTimeout(() => dispatch(actionScrollChat(true)), 500)
  65. }
  66. const filteredAndSorted = useMemo(() => {
  67. return sortByRecent(chats,sort).filter((el) => {
  68. const credentials = el.name + ' ' + el.lastName
  69. if (!date) {
  70. return credentials.toLowerCase().includes(value.toLowerCase())
  71. } else if (credentials.toLowerCase().includes(value.toLowerCase())
  72. &&timeStampFilter(date) === timeStampFilter(el.lastMessageCreatedAt ?
  73. el.lastMessageCreatedAt : el.createdAt)) {
  74. return el
  75. } else return undefined
  76. })
  77. }, [chats, date, value, sort])
  78. return (
  79. <div onClick={handleCloseForwardModal} className={classes.overlay} id='overlay'>
  80. <div className={classes.container}>
  81. <ForwardSearch handleSearch={handleSearch} value={value} total={total}
  82. sort={sort} date={date} setDate={setDate}/>
  83. <ForwardList value={value} date={date} filteredAndSorted={filteredAndSorted} handleForwardTo={handleForwardTo}/>
  84. </div>
  85. </div>
  86. )
  87. }
  88. export default ForwardSearchList