60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
import { toChatMessage } from '@models/ChatMessage'
|
|
import { executeSerial } from '@services/pluginService'
|
|
import { useAtomValue, useSetAtom } from 'jotai'
|
|
import { useEffect } from 'react'
|
|
import { DataService } from '@janhq/core'
|
|
import { getActiveConvoIdAtom } from '@helpers/atoms/Conversation.atom'
|
|
import {
|
|
getCurrentChatMessagesAtom,
|
|
setCurrentChatMessagesAtom,
|
|
} from '@helpers/atoms/ChatMessage.atom'
|
|
|
|
/**
|
|
* Custom hooks to get chat messages for current(active) conversation
|
|
*/
|
|
const useChatMessages = () => {
|
|
const setMessages = useSetAtom(setCurrentChatMessagesAtom)
|
|
const messages = useAtomValue(getCurrentChatMessagesAtom)
|
|
const activeConvoId = useAtomValue(getActiveConvoIdAtom)
|
|
|
|
const getMessages = async (convoId: string) => {
|
|
const data: any = await executeSerial(
|
|
DataService.GetConversationMessages,
|
|
convoId
|
|
)
|
|
if (!data) {
|
|
return []
|
|
}
|
|
|
|
return parseMessages(data)
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (!activeConvoId) {
|
|
console.error('active convo is undefined')
|
|
return
|
|
}
|
|
|
|
getMessages(activeConvoId)
|
|
.then((messages) => {
|
|
setMessages(messages)
|
|
})
|
|
.catch((err) => {
|
|
console.error(err)
|
|
})
|
|
}, [activeConvoId])
|
|
|
|
return { messages }
|
|
}
|
|
|
|
function parseMessages(messages: RawMessage[]): ChatMessage[] {
|
|
const newMessages: ChatMessage[] = []
|
|
for (const m of messages) {
|
|
const chatMessage = toChatMessage(m)
|
|
newMessages.push(chatMessage)
|
|
}
|
|
return newMessages
|
|
}
|
|
|
|
export default useChatMessages
|