mirror of https://github.com/msgbyte/tailchat
refactor: replace useConverseMessage with ConverseMessageProvider
helpful to get messages under componentspull/90/head
parent
aec9b7f150
commit
9be856210c
@ -0,0 +1,65 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import type { ChatMessage, SendMessagePayload } from '../model/message';
|
||||||
|
import { useConverseMessage } from '../redux/hooks/useConverseMessage';
|
||||||
|
import { createContextFactory } from './factory';
|
||||||
|
|
||||||
|
interface ConverseMessageContextProps {
|
||||||
|
messages: ChatMessage[];
|
||||||
|
loading: boolean;
|
||||||
|
error?: Error;
|
||||||
|
isLoadingMore: boolean;
|
||||||
|
hasMoreMessage: boolean;
|
||||||
|
fetchMoreMessage: () => Promise<void>;
|
||||||
|
sendMessage: (payload: SendMessagePayload) => Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
Context: ConverseMessageContext,
|
||||||
|
useContext: useConverseMessageContext,
|
||||||
|
} = createContextFactory<ConverseMessageContextProps>({
|
||||||
|
defaultValue: {} as ConverseMessageContextProps,
|
||||||
|
displayName: 'ConverseMessageContext',
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话消息列表相关上下文
|
||||||
|
*/
|
||||||
|
export const ConverseMessageProvider: React.FC<
|
||||||
|
React.PropsWithChildren<{
|
||||||
|
converseId: string;
|
||||||
|
isGroup: boolean;
|
||||||
|
}>
|
||||||
|
> = React.memo((props) => {
|
||||||
|
const { converseId, isGroup } = props;
|
||||||
|
const {
|
||||||
|
messages,
|
||||||
|
loading,
|
||||||
|
error,
|
||||||
|
isLoadingMore,
|
||||||
|
hasMoreMessage,
|
||||||
|
handleFetchMoreMessage: fetchMoreMessage,
|
||||||
|
handleSendMessage: sendMessage,
|
||||||
|
} = useConverseMessage({
|
||||||
|
converseId,
|
||||||
|
isGroup,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ConverseMessageContext.Provider
|
||||||
|
value={{
|
||||||
|
messages,
|
||||||
|
loading,
|
||||||
|
error,
|
||||||
|
isLoadingMore,
|
||||||
|
hasMoreMessage,
|
||||||
|
fetchMoreMessage,
|
||||||
|
sendMessage,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props.children}
|
||||||
|
</ConverseMessageContext.Provider>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
ConverseMessageProvider.displayName = 'ConverseMessageProvider';
|
||||||
|
|
||||||
|
export { useConverseMessageContext };
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
interface CreateContextFactoryOptions<Props> {
|
||||||
|
defaultValue: Props;
|
||||||
|
displayName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createContextFactory<Props>(
|
||||||
|
options: CreateContextFactoryOptions<Props>
|
||||||
|
) {
|
||||||
|
const Context = React.createContext(options.defaultValue);
|
||||||
|
Context.displayName = options.displayName;
|
||||||
|
|
||||||
|
function useContext(): Props {
|
||||||
|
return React.useContext(Context);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
Context,
|
||||||
|
useContext,
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue