| import { useRef, useEffect, memo } from 'react'; |
| import { ResizableHandleAlt, ResizablePanel } from '@librechat/client'; |
| import type { ImperativePanelHandle } from 'react-resizable-panels'; |
|
|
| interface ArtifactsPanelProps { |
| artifacts: React.ReactNode | null; |
| currentLayout: number[]; |
| minSizeMain: number; |
| shouldRender: boolean; |
| onRenderChange: (shouldRender: boolean) => void; |
| } |
|
|
| |
| |
| |
| |
| const ArtifactsPanel = memo(function ArtifactsPanel({ |
| artifacts, |
| currentLayout, |
| minSizeMain, |
| shouldRender, |
| onRenderChange, |
| }: ArtifactsPanelProps) { |
| const artifactsPanelRef = useRef<ImperativePanelHandle>(null); |
|
|
| useEffect(() => { |
| if (artifacts != null) { |
| onRenderChange(true); |
| requestAnimationFrame(() => { |
| requestAnimationFrame(() => { |
| artifactsPanelRef.current?.expand(); |
| }); |
| }); |
| } else if (shouldRender) { |
| onRenderChange(false); |
| } |
| }, [artifacts, shouldRender, onRenderChange]); |
|
|
| if (!shouldRender) { |
| return null; |
| } |
|
|
| return ( |
| <> |
| {artifacts != null && ( |
| <ResizableHandleAlt withHandle className="bg-border-medium text-text-primary" /> |
| )} |
| <ResizablePanel |
| ref={artifactsPanelRef} |
| defaultSize={artifacts != null ? currentLayout[1] : 0} |
| minSize={minSizeMain} |
| maxSize={70} |
| collapsible={true} |
| collapsedSize={0} |
| order={2} |
| id="artifacts-panel" |
| > |
| <div className="h-full min-w-[400px] overflow-hidden">{artifacts}</div> |
| </ResizablePanel> |
| </> |
| ); |
| }); |
|
|
| ArtifactsPanel.displayName = 'ArtifactsPanel'; |
|
|
| export default ArtifactsPanel; |
|
|