index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { makeStyles } from "@material-ui/core/styles";
  2. import { useState, useEffect, useRef, useCallback } from "react";
  3. import { useSelector,useDispatch } from "react-redux";
  4. import shortid from 'shortid';
  5. import SendMessage from "./SendMessage";
  6. import MessageLeftText from './Messages/MessageLeftText'
  7. import MessageLeftImage from './Messages/MessageLeftImage'
  8. import MessagesRightText from './Messages/MessagesRightText'
  9. import MessagesRightImage from './Messages/MessagesRightImage'
  10. import AlertInfo from "../../../reusableComponents/AlertInfo";
  11. import { getMessages } from '../../../../redux/messages/selector'
  12. import { getNumber } from '../../../../redux/authorization/selector'
  13. import { getChat } from '../../../../redux/chat/selector'
  14. import { getScroll } from '../../../../redux/control/selector'
  15. import { actionScroll } from '../../../../redux/control/action'
  16. import { asyncGetMessagesById } from '../../../../redux/messages/operations'
  17. import { seenChat } from "../../../../api-data";
  18. const debounce = require('lodash.debounce');
  19. const useStyles = makeStyles({
  20. container: {
  21. width: "100%",
  22. height: "100%",
  23. maxWidth: "100%",
  24. maxHeight: "100%",
  25. display: "flex",
  26. alignItems: "center",
  27. alignContent:"center",
  28. flexDirection: "column",
  29. position: "relative",
  30. overflowY: "scroll",
  31. paddingTop: 60,
  32. },
  33. messagesBody: {
  34. width: "40%",
  35. height: "80%",
  36. },
  37. });
  38. const ChatBar = () => {
  39. const classes = useStyles();
  40. const dispatch = useDispatch()
  41. const messages = useSelector(getMessages)
  42. const userNumber = useSelector(getNumber)
  43. const { companionId } = useSelector(getChat)
  44. const scroll = useSelector(getScroll)
  45. const [isArrow, setIsArrow] = useState<boolean>(false)
  46. const divRef = useRef<any | null>(null)
  47. const handleScrollTo = () => {
  48. divRef.current&&divRef.current.scrollTo({
  49. top: divRef.current.scrollHeight,
  50. behavior: 'smooth'
  51. })
  52. }
  53. const handleScroll = ({ target }: any) => {
  54. const different = target.scrollHeight - target.scrollTop
  55. if (different < 900) seenChat(companionId)
  56. setIsArrow(different < 1500 ? false : true)
  57. }
  58. const debouncedHandleScroll = useCallback(debounce(handleScroll, 300), []);
  59. useEffect(() => {
  60. if (scroll) {
  61. dispatch(asyncGetMessagesById(companionId, handleScrollTo))
  62. dispatch(actionScroll(false))
  63. }
  64. }, [dispatch,scroll, companionId])
  65. useEffect(() => {
  66. dispatch(asyncGetMessagesById(companionId, handleScrollTo))
  67. const handleReset = () => dispatch(asyncGetMessagesById(companionId,null))
  68. const idInterval = setInterval(handleReset, 3000);
  69. return () => clearInterval(idInterval);
  70. }, [dispatch, companionId]);
  71. return (
  72. <div ref={divRef} className={classes.container} onScroll={debouncedHandleScroll}>
  73. <div className={classes.messagesBody}>
  74. {messages.length > 0 ? messages.map(({message,avatarUrl,name,lastName,color,updatedAt,number,type}) => {
  75. if (number !== userNumber) {
  76. if(type === 'text') return (
  77. <MessageLeftText
  78. key={shortid.generate()}
  79. message={message}
  80. updatedAt={updatedAt}
  81. avatarUrl={avatarUrl}
  82. name={name}
  83. lastName={lastName}
  84. color={color}
  85. />)
  86. if(type === 'image') return (
  87. <MessageLeftImage
  88. key={shortid.generate()}
  89. imgUrl={message}
  90. updatedAt={updatedAt}
  91. color={color}
  92. />)
  93. } else {
  94. if(type === 'text') return (
  95. <MessagesRightText
  96. key={shortid.generate()}
  97. message={message}
  98. updatedAt={updatedAt}
  99. avatarUrl={avatarUrl}
  100. name={name}
  101. lastName={lastName}
  102. color={color}
  103. />)
  104. if(type === 'image') return (
  105. <MessagesRightImage
  106. key={shortid.generate()}
  107. imgUrl={message}
  108. updatedAt={updatedAt}
  109. color={color}
  110. />)
  111. }
  112. }) : <AlertInfo name='You do not have messages yet!' />}
  113. </div>
  114. <SendMessage isArrow={isArrow} handleScrollTo={handleScrollTo}/>
  115. </div>
  116. );
  117. }
  118. export default ChatBar