@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
JavaScript
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 };