import React, { useContext } from "react" import { Card } from "antd" import { PlaygroundForm } from "./PlaygroundForm" import { PlaygroundChat } from "./PlaygroundChat" import { useMessageOption } from "@/hooks/useMessageOption" import { webUIResumeLastChat } from "@/services/app" import { PlaygroundData } from '@/components/Common/Playground/Data.tsx' import { PlaygroundScene } from "@/components/Common/Playground/Scene.tsx" import { formatToChatHistory, formatToMessage, getPromptById, getRecentChatFromWebUI } from "@/db" import { getLastUsedChatSystemPrompt } from "@/services/model-settings" import { useStoreChatModelSettings } from "@/store/model" import { useSmartScroll } from "@/hooks/useSmartScroll" import { ChevronDown } from "lucide-react" import { PlaygroundTeam } from "@/components/Common/Playground/Team.tsx" import { PlaygroundTokenStatistics } from "@/components/Common/Playground/TokenStatistics.tsx" import { PlaygroundHistory } from "@/components/Common/Playground/History.tsx" import { PlaygroundIodRelevant } from "@/components/Common/Playground/IodRelevant.tsx" import { HistoryContext } from "@/components/Layouts/Layout.tsx" export const Playground = () => { const drop = React.useRef(null) const [dropedFile, setDropedFile] = React.useState() const { selectedKnowledge, messages, setHistoryId, setHistory, setMessages, setSelectedSystemPrompt, streaming } = useMessageOption() const { setSystemPrompt } = useStoreChatModelSettings() const { containerRef, isAtBottom, scrollToBottom } = useSmartScroll( messages, streaming ) const [dropState, setDropState] = React.useState< "idle" | "dragging" | "error" >("idle") React.useEffect(() => { if (selectedKnowledge) { return } if (!drop.current) { return } const handleDragOver = (e: DragEvent) => { e.preventDefault() e.stopPropagation() } const handleDrop = (e: DragEvent) => { e.preventDefault() e.stopPropagation() setDropState("idle") const files = Array.from(e.dataTransfer?.files || []) const isImage = files.every((file) => file.type.startsWith("image/")) if (!isImage) { setDropState("error") return } const newFiles = Array.from(e.dataTransfer?.files || []).slice(0, 1) if (newFiles.length > 0) { setDropedFile(newFiles[0]) } } const handleDragEnter = (e: DragEvent) => { e.preventDefault() e.stopPropagation() setDropState("dragging") } const handleDragLeave = (e: DragEvent) => { e.preventDefault() e.stopPropagation() setDropState("idle") } drop.current.addEventListener("dragover", handleDragOver) drop.current.addEventListener("drop", handleDrop) drop.current.addEventListener("dragenter", handleDragEnter) drop.current.addEventListener("dragleave", handleDragLeave) return () => { if (drop.current) { drop.current.removeEventListener("dragover", handleDragOver) drop.current.removeEventListener("drop", handleDrop) drop.current.removeEventListener("dragenter", handleDragEnter) drop.current.removeEventListener("dragleave", handleDragLeave) } } }, [selectedKnowledge]) const setRecentMessagesOnLoad = async () => { const isEnabled = await webUIResumeLastChat() if (!isEnabled) { return } if (messages.length === 0) { const recentChat = await getRecentChatFromWebUI() if (recentChat) { setHistoryId(recentChat.history.id) setHistory(formatToChatHistory(recentChat.messages)) setMessages(formatToMessage(recentChat.messages)) const lastUsedPrompt = await getLastUsedChatSystemPrompt( recentChat.history.id ) if (lastUsedPrompt) { if (lastUsedPrompt.prompt_id) { const prompt = await getPromptById(lastUsedPrompt.prompt_id) if (prompt) { setSelectedSystemPrompt(lastUsedPrompt.prompt_id) setSystemPrompt(lastUsedPrompt.prompt_content) } } setSystemPrompt(lastUsedPrompt.prompt_content) } } } } React.useEffect(() => { setRecentMessagesOnLoad() }, []) const { show } = useContext(HistoryContext) return (
{!isAtBottom && (
)}
{messages.length && (
)}
) }