import React, { PropsWithChildren, useContext } from 'react'; import { getDisplayName } from '../utils/getDisplayName'; import type { ChannelState } from 'stream-chat'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../types/types'; export type PaginatedMessageListContextValue< At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, > = { /** * Has more messages to load */ hasMore: boolean; /** * Is loading more messages */ loadingMore: boolean; /** * Is loading more recent messages */ loadingMoreRecent: boolean; /** * Load more messages */ loadMore: (limit?: number) => Promise; /** * Load more recent messages */ loadMoreRecent: (limit?: number) => Promise; /** * Messages from client state */ messages: ChannelState['messages']; /** * Set loadingMore */ setLoadingMore: React.Dispatch>; /** * Set loadingMoreRecent */ setLoadingMoreRecent: React.Dispatch>; }; export const PaginatedMessageListContext = React.createContext( {} as PaginatedMessageListContextValue, ); export const PaginatedMessageListProvider = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >({ children, value, }: PropsWithChildren<{ value?: PaginatedMessageListContextValue; }>) => ( {children} ); export const usePaginatedMessageListContext = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >() => useContext(PaginatedMessageListContext) as unknown as PaginatedMessageListContextValue< At, Ch, Co, Ev, Me, Re, Us >; /** * Typescript currently does not support partial inference so if MessageListContextValue * typing is desired while using the HOC withMessageListContext the Props for the * wrapped component must be provided as the first generic. */ export const withPaginatedMessageListContext = < P extends UnknownType, At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( Component: React.ComponentType

, ): React.FC>> => { const WithPaginatedMessageListContextComponent = ( props: Omit>, ) => { const paginatedMessageListContext = usePaginatedMessageListContext(); return ; }; WithPaginatedMessageListContextComponent.displayName = `WithPaginatedMessageListContext${getDisplayName( Component, )}`; return WithPaginatedMessageListContextComponent; };