|
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"; |
|
import { useState } from "react"; |
|
|
|
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 ( |
|
<div className="min-h-screen bg-gray-100 dark:bg-gray-900 flex flex-col"> |
|
<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> |
|
); |
|
} |
|
|