import { Conversation, ConversationState } from '@janhq/core' import { atom } from 'jotai' /** * Stores the current active conversation id. */ const activeConversationIdAtom = atom(undefined) export const getActiveConvoIdAtom = atom((get) => get(activeConversationIdAtom)) export const setActiveConvoIdAtom = atom( null, (_get, set, convoId: string | undefined) => { set(activeConversationIdAtom, convoId) } ) export const waitingToSendMessage = atom(undefined) /** * Stores all conversation states for the current user */ export const conversationStatesAtom = atom>( {} ) export const currentConvoStateAtom = atom( (get) => { const activeConvoId = get(activeConversationIdAtom) if (!activeConvoId) { console.debug('Active convo id is undefined') return undefined } return get(conversationStatesAtom)[activeConvoId] } ) export const addNewConversationStateAtom = atom( null, (get, set, conversationId: string, state: ConversationState) => { const currentState = { ...get(conversationStatesAtom) } currentState[conversationId] = state set(conversationStatesAtom, currentState) } ) export const updateConversationWaitingForResponseAtom = atom( null, (get, set, conversationId: string, waitingForResponse: boolean) => { const currentState = { ...get(conversationStatesAtom) } currentState[conversationId] = { ...currentState[conversationId], waitingForResponse, error: undefined, } set(conversationStatesAtom, currentState) } ) export const updateConversationErrorAtom = atom( null, (get, set, conversationId: string, error?: Error) => { const currentState = { ...get(conversationStatesAtom) } currentState[conversationId] = { ...currentState[conversationId], error, } set(conversationStatesAtom, currentState) } ) export const updateConversationHasMoreAtom = atom( null, (get, set, conversationId: string, hasMore: boolean) => { const currentState = { ...get(conversationStatesAtom) } currentState[conversationId] = { ...currentState[conversationId], hasMore } set(conversationStatesAtom, currentState) } ) export const updateConversationAtom = atom( null, (get, set, conversation: Conversation) => { const id = conversation.id if (!id) return const convo = get(userConversationsAtom).find((c) => c.id === id) if (!convo) return const newConversations: Conversation[] = get(userConversationsAtom).map( (c) => (c.id === id ? conversation : c) ) // sort new conversations based on updated at newConversations.sort((a, b) => { const aDate = new Date(a.updatedAt ?? 0) const bDate = new Date(b.updatedAt ?? 0) return bDate.getTime() - aDate.getTime() }) set(userConversationsAtom, newConversations) } ) /** * Stores all conversations for the current user */ export const userConversationsAtom = atom([]) export const currentConversationAtom = atom((get) => get(userConversationsAtom).find((c) => c.id === get(getActiveConvoIdAtom)) )