import React, { PropsWithChildren, useContext, useState } from 'react'; import { getDisplayName } from '../utils/getDisplayName'; import type { StyleProp, TextStyle } from 'react-native'; import type { Attachment } from 'stream-chat'; import type { Alignment, MessageContextValue } from '../messageContext/MessageContext'; import type { MessagesContextValue } from '../messagesContext/MessagesContext'; import type { GroupType, MessageType } from '../../components/MessageList/hooks/useMessageList'; import type { MessageActionsProps } from '../../components/MessageOverlay/MessageActions'; import type { OverlayReactionListProps } from '../../components/MessageOverlay/OverlayReactionList'; import type { OverlayReactionsProps } from '../../components/MessageOverlay/OverlayReactions'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../types/types'; import type { ReactionData } from '../../utils/utils'; export type MessageAction = { action: () => void; title: string; icon?: React.ReactElement; titleStyle?: StyleProp; }; export type MessageOverlayData< 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, > = { alignment?: Alignment; clientId?: string; files?: Attachment[]; groupStyles?: GroupType[]; handleReaction?: (reactionType: string) => Promise; images?: Attachment[]; message?: MessageType; messageActions?: MessageAction[]; messageContext?: MessageContextValue; messageReactionTitle?: string; messagesContext?: MessagesContextValue; onlyEmojis?: boolean; otherAttachments?: Attachment[]; OverlayReactionList?: React.ComponentType>; supportedReactions?: ReactionData[]; threadList?: boolean; }; export type MessageOverlayContextValue< 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, > = { /** * Custom UI component for rendering [message actions](https://github.com/GetStream/stream-chat-react-native/blob/master/screenshots/docs/2.png) in overlay. * * **Default** [MessageActions](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageOverlay/MessageActions.tsx) */ MessageActions: React.ComponentType>; /** * Custom UI component for rendering [reaction selector](https://github.com/GetStream/stream-chat-react-native/blob/master/screenshots/docs/2.png) in overlay (which shows up on long press on message). * * **Default** [OverlayReactionList](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageOverlay/OverlayReactionList.tsx) */ OverlayReactionList: React.ComponentType>; /** * Custom UI component for rendering [reactions list](https://github.com/GetStream/stream-chat-react-native/blob/master/screenshots/docs/2.png), in overlay (which shows up on long press on message). * * **Default** [OverlayReactions](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageOverlay/OverlayReactions.tsx) */ OverlayReactions: React.ComponentType; reset: () => void; setData: React.Dispatch>>; data?: MessageOverlayData; }; export const MessageOverlayContext = React.createContext({} as MessageOverlayContextValue); export const MessageOverlayProvider = < 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?: MessageOverlayContextValue; }>) => { const [data, setData] = useState(value?.data); const reset = () => { setData(value?.data); }; const messageOverlayContext = { data, reset, setData, }; return ( {children} ); }; export const useMessageOverlayContext = < 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(MessageOverlayContext) as unknown as MessageOverlayContextValue< At, Ch, Co, Ev, Me, Re, Us >; /** * Typescript currently does not support partial inference so if MessageOverlayContext * typing is desired while using the HOC withMessageOverlayContextContext the Props for the * wrapped component must be provided as the first generic. */ export const withMessageOverlayContext = < 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 WithMessageOverlayContextComponent = ( props: Omit>, ) => { const messageContext = useMessageOverlayContext(); return ; }; WithMessageOverlayContextComponent.displayName = `WithMessageOverlayContext${getDisplayName( Component, )}`; return WithMessageOverlayContextComponent; };