| import React, { createContext, useContext, useMemo } from 'react'; |
| import { useAddedChatContext } from './AddedChatContext'; |
| import { useChatContext } from './ChatContext'; |
|
|
| interface MessagesViewContextValue { |
| |
| conversation: ReturnType<typeof useChatContext>['conversation']; |
| conversationId: string | null | undefined; |
|
|
| |
| isSubmitting: ReturnType<typeof useChatContext>['isSubmitting']; |
| isSubmittingFamily: boolean; |
| abortScroll: ReturnType<typeof useChatContext>['abortScroll']; |
| setAbortScroll: ReturnType<typeof useChatContext>['setAbortScroll']; |
|
|
| |
| ask: ReturnType<typeof useChatContext>['ask']; |
| regenerate: ReturnType<typeof useChatContext>['regenerate']; |
| handleContinue: ReturnType<typeof useChatContext>['handleContinue']; |
|
|
| |
| index: ReturnType<typeof useChatContext>['index']; |
| latestMessage: ReturnType<typeof useChatContext>['latestMessage']; |
| setLatestMessage: ReturnType<typeof useChatContext>['setLatestMessage']; |
| getMessages: ReturnType<typeof useChatContext>['getMessages']; |
| setMessages: ReturnType<typeof useChatContext>['setMessages']; |
| } |
|
|
| const MessagesViewContext = createContext<MessagesViewContextValue | undefined>(undefined); |
|
|
| export function MessagesViewProvider({ children }: { children: React.ReactNode }) { |
| const chatContext = useChatContext(); |
| const addedChatContext = useAddedChatContext(); |
|
|
| const { |
| ask, |
| index, |
| regenerate, |
| isSubmitting: isSubmittingRoot, |
| conversation, |
| latestMessage, |
| setAbortScroll, |
| handleContinue, |
| setLatestMessage, |
| abortScroll, |
| getMessages, |
| setMessages, |
| } = chatContext; |
|
|
| const { isSubmitting: isSubmittingAdditional } = addedChatContext; |
|
|
| |
| const conversationValues = useMemo( |
| () => ({ |
| conversation, |
| conversationId: conversation?.conversationId, |
| }), |
| [conversation], |
| ); |
|
|
| |
| const submissionStates = useMemo( |
| () => ({ |
| isSubmitting: isSubmittingRoot, |
| isSubmittingFamily: isSubmittingRoot || isSubmittingAdditional, |
| abortScroll, |
| setAbortScroll, |
| }), |
| [isSubmittingRoot, isSubmittingAdditional, abortScroll, setAbortScroll], |
| ); |
|
|
| |
| const messageOperations = useMemo( |
| () => ({ |
| ask, |
| regenerate, |
| getMessages, |
| setMessages, |
| handleContinue, |
| }), |
| [ask, regenerate, handleContinue, getMessages, setMessages], |
| ); |
|
|
| |
| const messageState = useMemo( |
| () => ({ |
| index, |
| latestMessage, |
| setLatestMessage, |
| }), |
| [index, latestMessage, setLatestMessage], |
| ); |
|
|
| |
| const contextValue = useMemo<MessagesViewContextValue>( |
| () => ({ |
| ...conversationValues, |
| ...submissionStates, |
| ...messageOperations, |
| ...messageState, |
| }), |
| [conversationValues, submissionStates, messageOperations, messageState], |
| ); |
|
|
| return ( |
| <MessagesViewContext.Provider value={contextValue}>{children}</MessagesViewContext.Provider> |
| ); |
| } |
|
|
| export function useMessagesViewContext() { |
| const context = useContext(MessagesViewContext); |
| if (!context) { |
| throw new Error('useMessagesViewContext must be used within MessagesViewProvider'); |
| } |
| return context; |
| } |
|
|
| |
| export function useMessagesConversation() { |
| const { conversation, conversationId } = useMessagesViewContext(); |
| return useMemo(() => ({ conversation, conversationId }), [conversation, conversationId]); |
| } |
|
|
| |
| export function useMessagesSubmission() { |
| const { isSubmitting, isSubmittingFamily, abortScroll, setAbortScroll } = |
| useMessagesViewContext(); |
| return useMemo( |
| () => ({ isSubmitting, isSubmittingFamily, abortScroll, setAbortScroll }), |
| [isSubmitting, isSubmittingFamily, abortScroll, setAbortScroll], |
| ); |
| } |
|
|
| |
| export function useMessagesOperations() { |
| const { ask, regenerate, handleContinue, getMessages, setMessages } = useMessagesViewContext(); |
| return useMemo( |
| () => ({ ask, regenerate, handleContinue, getMessages, setMessages }), |
| [ask, regenerate, handleContinue, getMessages, setMessages], |
| ); |
| } |
|
|
| |
| export function useMessagesState() { |
| const { index, latestMessage, setLatestMessage } = useMessagesViewContext(); |
| return useMemo( |
| () => ({ index, latestMessage, setLatestMessage }), |
| [index, latestMessage, setLatestMessage], |
| ); |
| } |
|
|