import { useStore } from '@nanostores/react'; import * as Tooltip from '@radix-ui/react-tooltip'; import { useLoaderData } from '@remix-run/react'; import classNames from 'classnames'; import { useAnimate } from 'framer-motion'; import { useEffect, useState } from 'react'; import { ClientOnly } from 'remix-utils/client-only'; import { useShortcuts, useSnapScroll } from '~/lib/hooks'; import { useChatMessage } from '~/lib/hooks/useChatMessage'; import { aiState, setChatId, setChatStarted } from '~/lib/stores/ai-state'; import { webBuilderStore } from '~/lib/stores/web-builder'; import type { ChatMessage, ChatWithMessages } from '~/types/chat'; import { renderLogger } from '~/utils/logger'; import { Menu } from '../sidebar/Menu.client'; import { WebBuilder } from '../webbuilder/WebBuilder.client'; import styles from './BaseChat.module.scss'; import ChatAlert from './ChatAlert'; import { ChatTextarea } from './ChatTextarea'; import { ExamplePrompts } from './ExamplePrompts'; import FilePreview from './FilePreview'; import { Messages } from './Messages.client'; import ProgressCompilation from './ProgressCompilation'; import { ScreenshotStateManager } from './ScreenshotStateManager'; export type ImageData = { file: File; base64?: string; }; export function Chat() { renderLogger.trace('Chat'); const { id, chat } = useLoaderData<{ id?: string; chat: ChatWithMessages }>(); const { showChat, chatStarted } = useStore(aiState); const actionAlert = useStore(webBuilderStore.chatStore.alert); useShortcuts(); const [animationScope] = useAnimate(); const [scrollRef] = useSnapScroll(); const { progressAnnotations, abort, sendChatMessage } = useChatMessage({ initialId: id, initialMessages: chat?.messages as unknown as ChatMessage[], }); const [uploadFiles, setUploadFiles] = useState([]); useEffect(() => { if (id) { setChatId(id); } }, [id]); useEffect(() => { if (!chat) { return; } const { messages } = chat; if (messages.length > 0) { setChatStarted(true); } webBuilderStore.chatStore.setReloadedMessages(messages.map((m) => m.id)); }, [chat]); const handleSendMessage = (messageInput?: string) => { if (!messageInput) { return; } sendChatMessage({ messageContent: messageInput, files: uploadFiles }); }; return ( <> {
{() => }
{!chatStarted && (

使用 UPage 构建网站

将想法快速转变成现实,并通过可视化实时呈现。

)}
{() => { return chatStarted ? ( ) : null; }}
{actionAlert && ( { handleSendMessage?.(message); }} /> )}
{progressAnnotations && }
{ setUploadFiles?.(uploadFiles.filter((_, i) => i !== index)); }} /> {() => }
{!chatStarted && ExamplePrompts((_event, messageInput) => { handleSendMessage?.(messageInput); })}
{() => }
} ); }