mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-02 00:28:51 +01:00
* 🔧 chore: Add missing optional `scraperTimeout` to webSearchSchema
* chore: Add missing optional `scraperTimeout` to web search authentication result
* chore: linting
* feat: Integrate attachment handling and citation processing in message components
- Added `useAttachments` hook to manage message attachments and search results.
- Updated `MessageParts`, `ContentParts`, and `ContentRender` components to utilize the new hook for improved attachment handling.
- Enhanced `useCopyToClipboard` to format citations correctly, including support for composite citations and deduplication.
- Introduced utility functions for citation processing and cleanup.
- Added tests for the new `useCopyToClipboard` functionality to ensure proper citation formatting and handling.
* feat: Add configuration for LibreChat Code Interpreter API and Web Search variables
* fix: Update searchResults type to use SearchResultData for better type safety
* feat: Add web search configuration validation and logging
- Introduced `checkWebSearchConfig` function to validate web search configuration values, ensuring they are environment variable references.
- Added logging for proper configuration and warnings for incorrect values.
- Created unit tests for `checkWebSearchConfig` to cover various scenarios, including valid and invalid configurations.
* docs: Update README to include Web Search feature details
- Added a section for the Web Search feature, highlighting its capabilities to search the internet and enhance AI context.
- Included links for further information on the Web Search functionality.
* ci: Add mock for checkWebSearchConfig in AppService tests
* chore: linting
* feat: Enhance Shared Messages with Web Search UI by adding searchResults prop to SearchContent and MinimalHoverButtons components
* chore: linting
* refactor: remove Meilisearch index sync from importConversations function
* feat: update safeSearch implementation to use SafeSearchTypes enum
* refactor: remove commented-out code in loadTools function
* fix: ensure responseMessageId handles latestMessage ID correctly
* feat: enhance Vite configuration for improved chunking and caching
- Added additional globIgnores for map files in Workbox configuration.
- Implemented high-impact chunking for various large libraries to optimize performance.
- Increased chunkSizeWarningLimit from 1200 to 1500 for better handling of larger chunks.
* refactor: move health check hook to Root, fix bad setState for Temporary state
- Enhanced the `useHealthCheck` hook to initiate health checks only when the user is authenticated.
- Added logic for managing health check intervals and handling window focus events.
- Introduced a new test suite for `useHealthCheck` to cover various scenarios including authentication state changes and error handling.
- Removed the health check invocation from `ChatRoute` and added it to `Root` for global health monitoring.
* fix: update font alias in Vite configuration for correct path resolution
81 lines
3.1 KiB
TypeScript
81 lines
3.1 KiB
TypeScript
import { memo } from 'react';
|
|
import { useParams } from 'react-router-dom';
|
|
import { useGetSharedMessages } from 'librechat-data-provider/react-query';
|
|
import { useLocalize, useDocumentTitle } from '~/hooks';
|
|
import { useGetStartupConfig } from '~/data-provider';
|
|
import { ShareContext } from '~/Providers';
|
|
import { Spinner } from '~/components/svg';
|
|
import MessagesView from './MessagesView';
|
|
import { buildTree } from '~/utils';
|
|
import Footer from '../Chat/Footer';
|
|
|
|
function SharedView() {
|
|
const localize = useLocalize();
|
|
const { data: config } = useGetStartupConfig();
|
|
const { shareId } = useParams();
|
|
const { data, isLoading } = useGetSharedMessages(shareId ?? '');
|
|
const dataTree = data && buildTree({ messages: data.messages });
|
|
const messagesTree = dataTree?.length === 0 ? null : (dataTree ?? null);
|
|
|
|
// configure document title
|
|
let docTitle = '';
|
|
if (config?.appTitle != null && data?.title != null) {
|
|
docTitle = `${data.title} | ${config.appTitle}`;
|
|
} else {
|
|
docTitle = data?.title ?? config?.appTitle ?? document.title;
|
|
}
|
|
|
|
useDocumentTitle(docTitle);
|
|
|
|
let content: JSX.Element;
|
|
if (isLoading) {
|
|
content = (
|
|
<div className="flex h-screen items-center justify-center">
|
|
<Spinner className="" />
|
|
</div>
|
|
);
|
|
} else if (data && messagesTree && messagesTree.length !== 0) {
|
|
content = (
|
|
<>
|
|
<div className="final-completion group mx-auto flex min-w-[40rem] flex-col gap-3 pb-6 pt-4 md:max-w-[47rem] md:px-5 lg:px-1 xl:max-w-[55rem] xl:px-5">
|
|
<h1 className="text-4xl font-bold">{data.title}</h1>
|
|
<div className="border-b border-border-medium pb-6 text-base text-text-secondary">
|
|
{new Date(data.createdAt).toLocaleDateString('en-US', {
|
|
month: 'long',
|
|
day: 'numeric',
|
|
year: 'numeric',
|
|
})}
|
|
</div>
|
|
</div>
|
|
|
|
<MessagesView messagesTree={messagesTree} conversationId={data.conversationId} />
|
|
</>
|
|
);
|
|
} else {
|
|
content = (
|
|
<div className="flex h-screen items-center justify-center">
|
|
{localize('com_ui_shared_link_not_found')}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<ShareContext.Provider value={{ isSharedConvo: true }}>
|
|
<main
|
|
className="relative flex w-full grow overflow-hidden dark:bg-surface-secondary"
|
|
style={{ paddingBottom: '50px' }}
|
|
>
|
|
<div className="transition-width relative flex h-full w-full flex-1 flex-col items-stretch overflow-hidden pt-0 dark:bg-surface-secondary">
|
|
<div className="flex h-full flex-col text-text-primary" role="presentation">
|
|
{content}
|
|
<div className="w-full border-t-0 pl-0 pt-2 md:w-[calc(100%-.5rem)] md:border-t-0 md:border-transparent md:pl-0 md:pt-0 md:dark:border-transparent">
|
|
<Footer className="fixed bottom-0 left-0 right-0 z-50 flex items-center justify-center gap-2 bg-gradient-to-t from-surface-secondary to-transparent px-2 pb-2 pt-8 text-xs text-text-secondary md:px-[60px]" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</ShareContext.Provider>
|
|
);
|
|
}
|
|
|
|
export default memo(SharedView);
|