MessagesArea.jsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { connect } from "react-redux"
  2. import { Message } from "../Message/Message"
  3. import { MessagesAreaWrapper, SimpleBarWrapper } from "./MessagesArea.style"
  4. import 'simplebar/dist/simplebar.min.css';
  5. import InfiniteScroll from 'react-infinite-scroll-component';
  6. import { useEffect, useRef, useState } from "react";
  7. import { actionGetMessageForChat } from "../../actions/actionGetMessageForChat";
  8. // import { ClassNames } from "@emotion/react";
  9. // const Test = ({messagesByChat}) => {
  10. // useEffect(() => {
  11. // console.log('i am from body')
  12. // return () => {
  13. // console.log('i was unMount')
  14. // }
  15. // }, [])
  16. // return (
  17. // <div style={{display: 'flex', flexDirection: 'column-reverse'}}>
  18. // </div>
  19. // )
  20. // }
  21. const MessagesArea = ({chats, chatId, getMessages}) => {
  22. // console.log(chats[chatId].messages)
  23. const messagesByChat = Object.values(chats[chatId]?.messages || []);
  24. const ref = useRef();
  25. let timer
  26. function infinityScroll () {
  27. // console.log('количество скроллов')
  28. clearTimeout(timer);
  29. timer = setTimeout(async() => {
  30. // console.log('количество таймеров')
  31. const offset = 600;
  32. const scrollElem = ref.current?.contentWrapperEl;
  33. if(scrollElem.scrollHeight - (scrollElem.clientHeight - scrollElem.scrollTop) < offset){
  34. let data = await getMessages(chatId);
  35. if (data.length < 20) ref.current?.contentWrapperEl.removeEventListener("scroll", infinityScroll);
  36. // console.log('вызов')
  37. }
  38. },30)
  39. }
  40. useEffect(() => {
  41. ref.current?.contentWrapperEl.addEventListener("scroll", infinityScroll);
  42. // Remove listener (like componentWillUnmount)
  43. // console.log('i am working from useEffect');
  44. return () => {
  45. ref.current.contentWrapperEl.scrollTop = 0;
  46. ref.current?.contentWrapperEl.removeEventListener("scroll", infinityScroll);
  47. console.log("unMount from parent")
  48. };
  49. }, [chatId]);
  50. return (
  51. <MessagesAreaWrapper >
  52. <SimpleBarWrapper ref={ref}>
  53. {messagesByChat.map((item) => <Message key={item._id} chatId={chatId} mes={item}/>)}
  54. </SimpleBarWrapper>
  55. </MessagesAreaWrapper>
  56. )
  57. }
  58. export default connect(state=>({chats: state.chats || {}}), {getMessages : actionGetMessageForChat})(MessagesArea)