mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-30 14:25:19 +01:00
* ✨ feat: Enhance Artifact Management with Version Control and UI Improvements ✨ feat: Improve mobile layout and responsiveness in Artifacts component ✨ feat: Refactor imports and remove unnecessary props in Artifact components ✨ feat: Enhance Artifacts and SidePanel components with improved mobile responsiveness and layout transitions feat: Enhance artifact panel animations and improve UI responsiveness - Updated Thinking component button styles for smoother transitions. - Implemented dynamic rendering for artifacts panel with animation effects. - Refactored localization keys for consistency across multiple languages. - Added new CSS animations for iOS-inspired smooth transitions. - Improved Tailwind CSS configuration to support enhanced animation effects. ✨ feat: Add fullWidth and icon support to Radio component for enhanced flexibility refactor: Remove unused PreviewProps import in ArtifactPreview component refactor: Improve button class handling and blur effect constants in Artifact components ✨ feat: Refactor Artifacts component structure and add mobile/desktop variants for improved UI chore: Bump @librechat/client version to 0.3.2 refactor: Update button styles and transition durations for improved UI responsiveness refactor: revert back localization key refactor: remove unused scaling and animation properties for cleaner CSS refactor: remove unused animation properties for cleaner configuration * ✨ refactor: Simplify className usage in ArtifactTabs, ArtifactsHeader, and SidePanelGroup components * refactor: Remove cycleArtifact function from useArtifacts hook * ✨ feat: Implement Chromium resize lag fix with performance optimizations and new ArtifactsPanel component * ✨ feat: Update Badge component for responsive design and improve tap scaling behavior * chore: Update react-resizable-panels dependency to version 3.0.6 * ✨ feat: Refactor Artifacts components for improved structure and performance; remove unused files and optimize styles * ✨ style: Update text color for improved visibility in Artifacts component * ✨ style: Remove text color class for improved Spinner styling in Artifacts component * refactor: Split EditorContext into MutationContext and CodeContext to optimize re-renders; update related components to use new hooks * refactor: Optimize debounced mutation handling in CodeEditor component using refs to maintain current values and reduce re-renders * fix: Correct endpoint for message artifacts by changing URL segment from 'artifacts' to 'artifact' * feat: Enhance useEditArtifact mutation with optimistic updates and rollback on error; improve type safety with context management * fix: proper switch to preview as soon as artifact becomes enclosed * refactor: Remove optimistic updates from useEditArtifact mutation to prevent errors; simplify onMutate logic * test: Add comprehensive unit tests for useArtifacts hook to validate artifact handling, tab switching, and state management * test: Enhance unit tests for useArtifacts hook to cover new conversation transitions and null message handling --------- Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com>
71 lines
1.8 KiB
TypeScript
71 lines
1.8 KiB
TypeScript
import React, { memo, useMemo, type MutableRefObject } from 'react';
|
|
import { SandpackPreview, SandpackProvider } from '@codesandbox/sandpack-react/unstyled';
|
|
import type {
|
|
SandpackProviderProps,
|
|
SandpackPreviewRef,
|
|
} from '@codesandbox/sandpack-react/unstyled';
|
|
import type { TStartupConfig } from 'librechat-data-provider';
|
|
import type { ArtifactFiles } from '~/common';
|
|
import { sharedFiles, sharedOptions } from '~/utils/artifacts';
|
|
|
|
export const ArtifactPreview = memo(function ({
|
|
files,
|
|
fileKey,
|
|
template,
|
|
sharedProps,
|
|
previewRef,
|
|
currentCode,
|
|
startupConfig,
|
|
}: {
|
|
files: ArtifactFiles;
|
|
fileKey: string;
|
|
template: SandpackProviderProps['template'];
|
|
sharedProps: Partial<SandpackProviderProps>;
|
|
previewRef: MutableRefObject<SandpackPreviewRef>;
|
|
currentCode?: string;
|
|
startupConfig?: TStartupConfig;
|
|
}) {
|
|
const artifactFiles = useMemo(() => {
|
|
if (Object.keys(files).length === 0) {
|
|
return files;
|
|
}
|
|
const code = currentCode ?? '';
|
|
if (!code) {
|
|
return files;
|
|
}
|
|
return {
|
|
...files,
|
|
[fileKey]: { code },
|
|
};
|
|
}, [currentCode, files, fileKey]);
|
|
|
|
const options: typeof sharedOptions = useMemo(() => {
|
|
if (!startupConfig) {
|
|
return sharedOptions;
|
|
}
|
|
return {
|
|
...sharedOptions,
|
|
bundlerURL: template === 'static' ? startupConfig.staticBundlerURL : startupConfig.bundlerURL,
|
|
};
|
|
}, [startupConfig, template]);
|
|
|
|
if (Object.keys(artifactFiles).length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<SandpackProvider
|
|
files={{ ...artifactFiles, ...sharedFiles }}
|
|
options={options}
|
|
{...sharedProps}
|
|
template={template}
|
|
>
|
|
<SandpackPreview
|
|
showOpenInCodeSandbox={false}
|
|
showRefreshButton={false}
|
|
tabIndex={0}
|
|
ref={previewRef}
|
|
/>
|
|
</SandpackProvider>
|
|
);
|
|
});
|