🚪 fix: ArtifactsPanel and SidePanel Rendering and Collapsing Behavior (#10537)
Some checks failed
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Waiting to run
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Waiting to run
Docker Dev Images Build / build (Dockerfile, librechat-dev, node) (push) Waiting to run
Docker Dev Images Build / build (Dockerfile.multi, librechat-dev-api, api-build) (push) Waiting to run
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Waiting to run
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Blocked by required conditions
Publish `librechat-data-provider` to NPM / build (push) Has been cancelled
Publish `@librechat/data-schemas` to NPM / build-and-publish (push) Has been cancelled
Publish `librechat-data-provider` to NPM / publish-npm (push) Has been cancelled

* 🚪 fix: ArtifactsPanel and SidePanel Rendering and Collapsing Behavior

* refactor: improve side panel behavior when artifacts panel renders null
This commit is contained in:
Danny Avila 2025-11-16 13:55:35 -05:00 committed by GitHub
parent 0a2f40cc50
commit 1b2f1ff09b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 6 additions and 19 deletions

View file

@ -2,8 +2,6 @@ import { useRef, useEffect, memo } from 'react';
import { ResizableHandleAlt, ResizablePanel } from '@librechat/client';
import type { ImperativePanelHandle } from 'react-resizable-panels';
const ANIMATION_DURATION = 500;
interface ArtifactsPanelProps {
artifacts: React.ReactNode | null;
currentLayout: number[];
@ -24,14 +22,9 @@ const ArtifactsPanel = memo(function ArtifactsPanel({
onRenderChange,
}: ArtifactsPanelProps) {
const artifactsPanelRef = useRef<ImperativePanelHandle>(null);
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
useEffect(() => {
if (artifacts != null) {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
timeoutRef.current = null;
}
onRenderChange(true);
requestAnimationFrame(() => {
requestAnimationFrame(() => {
@ -39,17 +32,8 @@ const ArtifactsPanel = memo(function ArtifactsPanel({
});
});
} else if (shouldRender) {
artifactsPanelRef.current?.collapse();
timeoutRef.current = setTimeout(() => {
onRenderChange(false);
}, ANIMATION_DURATION);
}
return () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, [artifacts, shouldRender, onRenderChange]);
if (!shouldRender) {

View file

@ -162,6 +162,9 @@ const SidePanel = ({
transition: 'width 0.2s ease, visibility 0s linear 0.2s',
}}
onExpand={() => {
if (isCollapsed && (fullCollapse || collapsedSize === 0)) {
return;
}
setIsCollapsed(false);
localStorage.setItem('react-resizable-panels:collapsed', 'false');
}}

View file

@ -138,9 +138,9 @@ const SidePanelGroup = memo(
setCollapsedSize={setCollapsedSize}
fullCollapse={fullCollapse}
setFullCollapse={setFullCollapse}
defaultSize={currentLayout[currentLayout.length - 1]}
hasArtifacts={artifacts != null}
interfaceConfig={interfaceConfig}
hasArtifacts={shouldRenderArtifacts}
defaultSize={currentLayout[currentLayout.length - 1]}
/>
)}
</ResizablePanelGroup>