mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-18 16:38:10 +01:00
* feat: Integrate logger for MessageIcon component * feat: Enhance artifact sharing functionality with updated path checks and read-only state management * feat: Refactor Thinking and Reasoning components for improved structure and styling * feat: Enhance artifact sharing with context value management and responsive layout * feat: Enhance ShareView with theme and language management features * feat: Improve ThinkingButton accessibility and styling for better user interaction * feat: Introduce isArtifactRoute utility for route validation in Artifact components * feat: Add latest message text extraction in SharedView for improved message display * feat: Update locale handling in SharedView for dynamic date formatting * feat: Refactor ArtifactsContext and SharedView for improved context handling and styling adjustments * feat: Enhance artifact panel size management with local storage integration * chore: imports * refactor: move ShareArtifactsContainer out of ShareView --------- Co-authored-by: Danny Avila <danny@librechat.ai>
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { useRef, useEffect } from 'react';
|
|
import * as Tabs from '@radix-ui/react-tabs';
|
|
import type { SandpackPreviewRef } from '@codesandbox/sandpack-react/unstyled';
|
|
import type { CodeEditorRef } from '@codesandbox/sandpack-react';
|
|
import type { Artifact } from '~/common';
|
|
import { useCodeState } from '~/Providers/EditorContext';
|
|
import { useArtifactsContext } from '~/Providers';
|
|
import useArtifactProps from '~/hooks/Artifacts/useArtifactProps';
|
|
import { useAutoScroll } from '~/hooks/Artifacts/useAutoScroll';
|
|
import { ArtifactCodeEditor } from './ArtifactCodeEditor';
|
|
import { useGetStartupConfig } from '~/data-provider';
|
|
import { ArtifactPreview } from './ArtifactPreview';
|
|
|
|
export default function ArtifactTabs({
|
|
artifact,
|
|
editorRef,
|
|
previewRef,
|
|
isSharedConvo,
|
|
}: {
|
|
artifact: Artifact;
|
|
editorRef: React.MutableRefObject<CodeEditorRef>;
|
|
previewRef: React.MutableRefObject<SandpackPreviewRef>;
|
|
isSharedConvo?: boolean;
|
|
}) {
|
|
const { isSubmitting } = useArtifactsContext();
|
|
const { currentCode, setCurrentCode } = useCodeState();
|
|
const { data: startupConfig } = useGetStartupConfig();
|
|
const lastIdRef = useRef<string | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (artifact.id !== lastIdRef.current) {
|
|
setCurrentCode(undefined);
|
|
}
|
|
lastIdRef.current = artifact.id;
|
|
}, [setCurrentCode, artifact.id]);
|
|
|
|
const content = artifact.content ?? '';
|
|
const contentRef = useRef<HTMLDivElement>(null);
|
|
useAutoScroll({ ref: contentRef, content, isSubmitting });
|
|
|
|
const { files, fileKey, template, sharedProps } = useArtifactProps({ artifact });
|
|
|
|
return (
|
|
<div className="flex h-full w-full flex-col">
|
|
<Tabs.Content
|
|
ref={contentRef}
|
|
value="code"
|
|
id="artifacts-code"
|
|
className="h-full w-full flex-grow overflow-auto"
|
|
tabIndex={-1}
|
|
>
|
|
<ArtifactCodeEditor
|
|
files={files}
|
|
fileKey={fileKey}
|
|
template={template}
|
|
artifact={artifact}
|
|
editorRef={editorRef}
|
|
sharedProps={sharedProps}
|
|
readOnly={isSharedConvo}
|
|
/>
|
|
</Tabs.Content>
|
|
|
|
<Tabs.Content value="preview" className="h-full w-full flex-grow overflow-auto" tabIndex={-1}>
|
|
<ArtifactPreview
|
|
files={files}
|
|
fileKey={fileKey}
|
|
template={template}
|
|
previewRef={previewRef}
|
|
sharedProps={sharedProps}
|
|
currentCode={currentCode}
|
|
startupConfig={startupConfig}
|
|
/>
|
|
</Tabs.Content>
|
|
</div>
|
|
);
|
|
}
|