import { createSignal, For, Show } from 'solid-js' import MessageItem from './MessageItem' import IconClear from './icons/Clear' import type { ChatMessage } from '../types' export default () => { let inputRef: HTMLInputElement const [messageList, setMessageList] = createSignal([]) const [currentAssistantMessage, setCurrentAssistantMessage] = createSignal('') const [loading, setLoading] = createSignal(false) const handleButtonClick = async () => { const inputValue = inputRef.value if (!inputValue) { return } setLoading(true) // @ts-ignore if (window?.umami) umami.trackEvent('chat_generate') inputRef.value = '' setMessageList([ ...messageList(), { role: 'user', content: inputValue, }, ]) const response = await fetch('/api/generate', { method: 'POST', body: JSON.stringify({ messages: messageList(), }), }) if (!response.ok) { throw new Error(response.statusText) } const data = response.body if (!data) { throw new Error('No data') } const reader = data.getReader() const decoder = new TextDecoder('utf-8') let done = false while (!done) { const { value, done: readerDone } = await reader.read() if (value) { let char = decoder.decode(value) if (char === '\n' && currentAssistantMessage().endsWith('\n')) { continue } if (char) { setCurrentAssistantMessage(currentAssistantMessage() + char) } } done = readerDone } setMessageList([ ...messageList(), { role: 'assistant', content: currentAssistantMessage(), }, ]) setCurrentAssistantMessage('') setLoading(false) } const clear = () => { inputRef.value = '' setMessageList([]) setCurrentAssistantMessage('') } return (
{(message) => } { currentAssistantMessage() && }
AI is thinking...
}>
{ e.key === 'Enter' && !e.isComposing && handleButtonClick() }} w-full px-4 h-12 text-slate rounded-sm bg-slate bg-op-15 focus:bg-op-20 focus:ring-0 focus:outline-none placeholder:text-slate-400 placeholder:op-30 />
) }