index.tsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import Grid from '@mui/material/Grid'
  2. import { useState,useEffect } from 'react'
  3. import { useSelector, useDispatch } from 'react-redux'
  4. import isEqual from 'lodash.isequal';
  5. import HeaderBar from './HeaderBar'
  6. import ChatBar from './ChatBar'
  7. import { getPinnedMessagesMemo } from '../../../redux/pinnedMessages/selector'
  8. import { getMessagesMemo } from '../../../redux/messages/selector'
  9. import { TRightIsOpen } from '../../../typescript/redux/control/types'
  10. import { getOpenPinned } from '../../../redux/control/selector'
  11. import { actionOpenPinned } from '../../../redux/control/action'
  12. import { unpinAllMessagesById } from '../../../api-data'
  13. import { TMessage } from "../../../typescript/redux/messages/types";
  14. interface ICentralBar {
  15. rightIsOpen: TRightIsOpen,
  16. chatDivRef: any | null,
  17. companionId: string,
  18. backgroundImage: string,
  19. }
  20. const CentralBar = ({rightIsOpen,chatDivRef,companionId,backgroundImage}:ICentralBar) => {
  21. const dispatch = useDispatch()
  22. const pinnedMessagesMemo = useSelector(getPinnedMessagesMemo)
  23. const messagesMemo = useSelector(getMessagesMemo)
  24. const openPinned = useSelector(getOpenPinned)
  25. const [selectedArr, setSelectedArr] = useState<string[] | []>([])
  26. const [isSomeSelected, setIsSomeSelected] = useState<boolean>(false)
  27. const [isReply, setIsReply] = useState<TMessage | undefined>(undefined)
  28. const handleClearSelect = () => {
  29. selectedArr.length > 0 && setSelectedArr([])
  30. isSomeSelected && setIsSomeSelected(false)
  31. }
  32. const handleUnpinAll = () => {
  33. openPinned && dispatch(actionOpenPinned(false))
  34. unpinAllMessagesById(pinnedMessagesMemo.map(({_id}) => _id))
  35. }
  36. useEffect(() => {
  37. if(pinnedMessagesMemo.length === 0 && openPinned) dispatch(actionOpenPinned(false))
  38. }, [openPinned,pinnedMessagesMemo,dispatch])
  39. useEffect(() => {
  40. setIsSomeSelected(false)
  41. setSelectedArr([])
  42. setIsReply(undefined)
  43. }, [companionId])
  44. useEffect(() => {
  45. if (isReply) {
  46. const reply = messagesMemo.find((el) => el._id === isReply._id)
  47. if (!reply) {
  48. setIsReply(undefined)
  49. } else if (isEqual(isReply, reply) === false) {
  50. setIsReply(reply)
  51. }
  52. }
  53. },[messagesMemo,isReply])
  54. return (
  55. <Grid item lg={rightIsOpen?8:12}>
  56. <Grid item lg={12} >
  57. <HeaderBar chatDivRef={chatDivRef} selectedArr={selectedArr} isSomeSelected={isSomeSelected}
  58. handleClearSelect={handleClearSelect} setIsSomeSelected={setIsSomeSelected}
  59. openPinned={openPinned} pinnedMessagesMemo={pinnedMessagesMemo}/>
  60. </Grid>
  61. <Grid item lg={12} style={{backgroundImage}}>
  62. <ChatBar chatDivRef={chatDivRef} selectedArr={selectedArr} setSelectedArr={setSelectedArr}
  63. isSomeSelected={isSomeSelected} setIsSomeSelected={setIsSomeSelected}
  64. openPinned={openPinned} pinnedMessagesMemo={pinnedMessagesMemo}
  65. handleUnpinAll={handleUnpinAll} isReply={isReply} setIsReply={setIsReply}/>
  66. </Grid>
  67. </Grid>
  68. )
  69. }
  70. export default CentralBar