Spaces:
Sleeping
Sleeping
| import { useState } from "react"; | |
| import { Input } from "@/components/ui/input"; | |
| import { Button } from "@/components/ui/button"; | |
| import { v4 as uuidv4 } from "uuid"; | |
| import { | |
| useChatInteract, | |
| useChatMessages, | |
| IStep, | |
| } from "@chainlit/react-client"; | |
| export function Playground() { | |
| const [inputValue, setInputValue] = useState(""); | |
| const { sendMessage } = useChatInteract(); | |
| const { messages } = useChatMessages(); | |
| const handleSendMessage = () => { | |
| const content = inputValue.trim(); | |
| if (content) { | |
| const message: IStep = { | |
| id: uuidv4(), | |
| name: "user", | |
| type: "user_message", | |
| output: content, | |
| createdAt: new Date().toISOString(), | |
| }; | |
| sendMessage(message, []); | |
| setInputValue(""); | |
| } | |
| }; | |
| const renderMessage = (message: IStep) => { | |
| const dateOptions: Intl.DateTimeFormatOptions = { | |
| hour: "2-digit", | |
| minute: "2-digit", | |
| }; | |
| const date = new Date(message.createdAt).toLocaleTimeString(undefined, dateOptions); | |
| return ( | |
| <div key={message.id} className="flex items-start space-x-2"> | |
| <div className="w-20 text-sm text-green-500">{message.name}</div> | |
| <div className="flex-1 border rounded-lg p-2"> | |
| <p className="text-black dark:text-white">{message.output}</p> | |
| <small className="text-xs text-gray-500">{date}</small> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| return ( | |
| // Apply the scrollable container to the entire Playground | |
| <div className="playground-container bg-gray-100 dark:bg-gray-900 flex flex-col" style={{ borderRadius: '10px' }}> | |
| <div style={{ backgroundColor: '#d00404', height: '50px' }}> | |
| {/* Add your content for the red section here */} | |
| </div> | |
| <div className="flex-1 overflow-auto p-6"> | |
| <div className="space-y-4"> | |
| {messages.map((message) => renderMessage(message))} | |
| </div> | |
| </div> | |
| <div className="border-t p-4 bg-white dark:bg-gray-800"> | |
| <div className="flex items-center space-x-2"> | |
| <Input | |
| autoFocus | |
| className="flex-1" | |
| id="message-input" | |
| placeholder="Type a message" | |
| value={inputValue} | |
| onChange={(e) => setInputValue(e.target.value)} | |
| onKeyUp={(e) => { | |
| if (e.key === "Enter") { | |
| handleSendMessage(); | |
| } | |
| }} | |
| /> | |
| <Button onClick={handleSendMessage} type="submit"> | |
| Send | |
| </Button> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |