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