import { useMemo } from 'react'; import { EModelEndpoint, isAssistantsEndpoint, Constants } from 'librechat-data-provider'; import { useGetEndpointsQuery, useGetStartupConfig } from 'librechat-data-provider/react-query'; import type { ReactNode } from 'react'; import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui'; import { useChatContext, useAssistantsMapContext } from '~/Providers'; import { useGetAssistantDocsQuery } from '~/data-provider'; import ConvoIcon from '~/components/Endpoints/ConvoIcon'; import { useLocalize, useSubmitMessage } from '~/hooks'; import { BirthdayIcon } from '~/components/svg'; import { getIconEndpoint, cn } from '~/utils'; import ConvoStarter from './ConvoStarter'; export default function Landing({ Header }: { Header?: ReactNode }) { const { conversation } = useChatContext(); const assistantMap = useAssistantsMapContext(); const { data: startupConfig } = useGetStartupConfig(); const { data: endpointsConfig } = useGetEndpointsQuery(); const localize = useLocalize(); let { endpoint = '' } = conversation ?? {}; const { assistant_id = null } = conversation ?? {}; if ( endpoint === EModelEndpoint.chatGPTBrowser || endpoint === EModelEndpoint.azureOpenAI || endpoint === EModelEndpoint.gptPlugins ) { endpoint = EModelEndpoint.openAI; } const iconURL = conversation?.iconURL; endpoint = getIconEndpoint({ endpointsConfig, iconURL, endpoint }); const { data: documentsMap = new Map() } = useGetAssistantDocsQuery(endpoint, { select: (data) => new Map(data.map((dbA) => [dbA.assistant_id, dbA])), }); const isAssistant = isAssistantsEndpoint(endpoint); const assistant = isAssistant ? assistantMap?.[endpoint][assistant_id ?? ''] : undefined; const assistantName = assistant?.name ?? ''; const assistantDesc = assistant?.description ?? ''; const avatar = assistant?.metadata?.avatar ?? ''; const conversation_starters = useMemo(() => { /* The user made updates, use client-side cache, */ if (assistant?.conversation_starters) { return assistant.conversation_starters; } /* If none in cache, we use the latest assistant docs */ const assistantDocs = documentsMap.get(assistant_id ?? ''); return assistantDocs?.conversation_starters ?? []; }, [documentsMap, assistant_id, assistant?.conversation_starters]); const containerClassName = 'shadow-stroke relative flex h-full items-center justify-center rounded-full bg-white text-black'; const { submitMessage } = useSubmitMessage(); const sendConversationStarter = (text: string) => submitMessage({ text }); return (
{Header != null ? Header : null}
{startupConfig?.showBirthdayIcon === true ? (
{localize('com_ui_happy_birthday')}
) : null}
{assistantName ? (
{assistantName}
{assistantDesc ? assistantDesc : localize('com_nav_welcome_message')}
{/*
By Daniel Avila
*/}
) : (

{isAssistant ? conversation?.greeting ?? localize('com_nav_welcome_assistant') : conversation?.greeting ?? localize('com_nav_welcome_message')}

)}
{conversation_starters.length > 0 && conversation_starters .slice(0, Constants.MAX_CONVO_STARTERS) .map((text, index) => ( sendConversationStarter(text)} /> ))}
); }