generative-ui/components/chat.tsx (64 lines of code) (raw):
'use client'
import React, { useState, useEffect } from 'react'
interface ChatProps {
onSendMessage: (message: string) => void
suggestion?: string
}
const Chat: React.FC<ChatProps> = ({ onSendMessage, suggestion }) => {
const [inputMessageText, setinputMessageText] = useState<string>('')
// Whenever suggestion changes, update the input field
useEffect(() => {
if (suggestion !== undefined) {
setinputMessageText(suggestion)
}
}, [suggestion])
return (
<div className="flex w-full flex-col gap-1.5 rounded-[26px] p-1.5 transition-colors bg-white">
<div className="flex items-center gap-1.5 md:gap-2 pl-4">
<div className="flex min-w-0 flex-1 flex-col">
<textarea
id="prompt-textarea"
tabIndex={0}
dir="auto"
rows={1}
placeholder="Generate a UI component for..."
className="m-0 resize-none border-0 focus:outline-none text-sm bg-transparent px-0 py-2 max-h-[20dvh]"
value={inputMessageText}
onChange={e => setinputMessageText(e.target.value)}
onKeyDown={e => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault()
onSendMessage(inputMessageText)
setinputMessageText('')
}
}}
/>
</div>
<button
disabled={!inputMessageText}
data-testid="send-button"
className="flex size-8 items-center justify-center rounded-full bg-black text-white transition-colors hover:opacity-70 focus-visible:outline-none focus-visible:outline-black disabled:bg-[#D7D7D7] disabled:text-[#f4f4f4] disabled:hover:opacity-100"
onClick={() => {
onSendMessage(inputMessageText)
setinputMessageText('')
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M5 12h14" />
<path d="m12 5 7 7-7 7" />
</svg>
</button>
</div>
</div>
)
}
export default Chat