mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
* refactor: expand container * chore: bump @codesandbox/sandpack-react to latest * WIP: first pass, show editor * feat: implement ArtifactCodeEditor and ArtifactTabs components for enhanced artifact management * refactor: fileKey * refactor: auto scrolling code editor and add messageId to artifact * feat: first pass, editing artifact * feat: first pass, robust artifact replacement * fix: robust artifact replacement & re-render when expected * feat: Download Artifacts * refactor: improve artifact editing UX * fix: layout shift of new download button * fix: enhance missing output checks and logging in StreamRunManager
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
// hooks/useAutoScroll.ts
|
|
import { useEffect, useState } from 'react';
|
|
|
|
interface UseAutoScrollProps {
|
|
ref: React.RefObject<HTMLElement>;
|
|
content: string;
|
|
isSubmitting: boolean;
|
|
}
|
|
|
|
export const useAutoScroll = ({ ref, content, isSubmitting }: UseAutoScrollProps) => {
|
|
const [userScrolled, setUserScrolled] = useState(false);
|
|
|
|
useEffect(() => {
|
|
const scrollContainer = ref.current;
|
|
if (!scrollContainer) {
|
|
return;
|
|
}
|
|
|
|
const handleScroll = () => {
|
|
const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
|
|
const isNearBottom = scrollHeight - scrollTop - clientHeight < 50;
|
|
|
|
if (!isNearBottom) {
|
|
setUserScrolled(true);
|
|
} else {
|
|
setUserScrolled(false);
|
|
}
|
|
};
|
|
|
|
scrollContainer.addEventListener('scroll', handleScroll);
|
|
|
|
return () => {
|
|
scrollContainer.removeEventListener('scroll', handleScroll);
|
|
};
|
|
}, [ref]);
|
|
|
|
useEffect(() => {
|
|
const scrollContainer = ref.current;
|
|
if (!scrollContainer || !isSubmitting || userScrolled) {
|
|
return;
|
|
}
|
|
|
|
scrollContainer.scrollTop = scrollContainer.scrollHeight;
|
|
}, [content, isSubmitting, userScrolled, ref]);
|
|
|
|
return { userScrolled };
|
|
};
|