Spaces:
Running
Running
import { useChat, type Message } from 'ai/react'; | |
import { toast } from 'react-hot-toast'; | |
import { useEffect, useState } from 'react'; | |
import { ChatEntity, MessageBase } from '../types'; | |
const useVisionAgent = (chat: ChatEntity) => { | |
const { messages: initialMessages, id, url } = chat; | |
const { | |
messages, | |
append, | |
reload, | |
stop, | |
isLoading, | |
input, | |
setInput, | |
setMessages, | |
} = useChat({ | |
sendExtraMessageFields: true, | |
api: '/api/vision-agent', | |
onResponse(response) { | |
if (response.status !== 200) { | |
toast.error(response.statusText); | |
} | |
}, | |
initialMessages: initialMessages, | |
body: { | |
url, | |
id, | |
}, | |
}); | |
const [loadingDots, setLoadingDots] = useState(''); | |
useEffect(() => { | |
let loadingInterval: NodeJS.Timeout; | |
if (isLoading) { | |
loadingInterval = setInterval(() => { | |
setLoadingDots(prevMessage => { | |
switch (prevMessage) { | |
case '': | |
return '.'; | |
case '.': | |
return '..'; | |
case '..': | |
return '...'; | |
case '...': | |
return ''; | |
default: | |
return ''; | |
} | |
}); | |
}, 500); | |
} | |
return () => { | |
clearInterval(loadingInterval); | |
}; | |
}, [isLoading]); | |
const assistantLoadingMessage = { | |
id: 'loading', | |
content: loadingDots, | |
role: 'assistant', | |
}; | |
const messageWithLoading = | |
isLoading && | |
messages.length && | |
messages[messages.length - 1].role !== 'assistant' | |
? [...messages, assistantLoadingMessage] | |
: messages; | |
return { | |
messages: messageWithLoading as MessageBase[], | |
append, | |
reload, | |
stop, | |
isLoading, | |
input, | |
setInput, | |
}; | |
}; | |
export default useVisionAgent; | |