ChatContentContainer.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import ChatHeader from '@/new-components/chat/header/ChatHeader';
  2. import dynamic from 'next/dynamic';
  3. import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';
  4. const ChatCompletion = dynamic(() => import('@/new-components/chat/content/ChatCompletion'), { ssr: false });
  5. // eslint-disable-next-line no-empty-pattern
  6. const ChatContentContainer = ({}, ref: React.ForwardedRef<any>) => {
  7. const scrollRef = useRef<HTMLDivElement>(null);
  8. const [isScrollToTop, setIsScrollToTop] = useState<boolean>(false);
  9. useImperativeHandle(ref, () => {
  10. return scrollRef.current;
  11. });
  12. useEffect(() => {
  13. if (scrollRef.current) {
  14. scrollRef.current.addEventListener('scroll', () => {
  15. const st = scrollRef.current?.scrollTop || 0;
  16. if (st >= 42 + 32) {
  17. setIsScrollToTop(true);
  18. } else {
  19. setIsScrollToTop(false);
  20. }
  21. });
  22. }
  23. return () => {
  24. // eslint-disable-next-line react-hooks/exhaustive-deps
  25. scrollRef.current && scrollRef.current.removeEventListener('scroll', () => {});
  26. };
  27. }, []);
  28. return (
  29. <div className='flex flex-1 overflow-hidden'>
  30. <div ref={scrollRef} className='h-full w-full mx-auto overflow-y-auto'>
  31. <ChatHeader isScrollToTop={isScrollToTop} />
  32. <ChatCompletion />
  33. </div>
  34. </div>
  35. );
  36. };
  37. export default forwardRef(ChatContentContainer);