UNPKG

@plteam/chat-ui

Version:

CUI Kit is a free and open-source library for creating AI assistant chat interfaces, built with React, Material UI, and TypeScript

45 lines (44 loc) 2.17 kB
import * as React from 'react'; import { ThreadModel } from '../../models'; import { Threads } from '../../models/Threads'; import SnackbarModel from '../../models/SnackbarModel'; import { useAdapterContext } from '../adapter/AdapterContext'; import { useApiRefInitialization } from './useApiRefInitialization'; const Context = React.createContext(undefined); const ChatGlobalProviderComponent = ({ props, children, apiManager }) => { const threadAdapter = useAdapterContext(); const model = React.useMemo(() => new Threads(threadAdapter, props.threads, props.onUserMessageSent), [props.loading]); const snackbar = React.useMemo(() => new SnackbarModel(props.onShowAlert), [props.onShowAlert]); useApiRefInitialization(apiManager, model, props); React.useEffect(() => { if (!props.loading && props.initialThread) { apiManager.apiRef.current?.onChangeThread(props.initialThread.id); } }, [props.loading]); const value = React.useMemo(() => ({ ...props, apiRef: apiManager.apiRef, model, snackbar, actionsAssistant: (props.assistantActions ?? []).map(element => ({ element })), handleCreateNewThread: props.handleCreateNewThread ?? ThreadModel.createEmptyData, }), [model, props, props.loading]); return (React.createElement(Context.Provider, { value: value }, children)); }; const useChatContext = () => { const context = React.useContext(Context); if (!context) { throw new Error("useChatContext must be used within a ChatGlobalProvider"); } return context; }; export const useSafeChatContext = () => { return (React.useContext(Context) ?? {}); }; const useChatModel = () => useChatContext().model; const ChatGlobalProvider = React.memo(ChatGlobalProviderComponent, (prevProps, nextProps) => { return Object.keys(prevProps).join('') === Object.keys(nextProps).join('') // && prevProps.props.threads.length === nextProps.props.threads.length && prevProps.props.loading === nextProps.props.loading; }); export { ChatGlobalProvider, useChatContext, useChatModel };