UNPKG

@gathertown/uikit-react-native

Version:

Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

152 lines (137 loc) 5.68 kB
import type React from 'react'; import type { UseGroupChannelMessagesOptions } from '@gathertown/uikit-chat-hooks'; import type { OnBeforeHandler, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdMessage, SendbirdUser, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams, } from '@gathertown/uikit-utils'; import type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput'; import type { ChannelMessageListProps } from '../../components/ChannelMessageList'; import type { CommonComponent } from '../../types'; import type { PubSub } from '../../utils/pubsub'; export interface GroupChannelProps { Fragment: { channel: SendbirdGroupChannel; onChannelDeleted: () => void; onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft']; onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight']; onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage']; onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>; onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>; onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>; onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>; onAfterSendUserMessage?: (message: SendbirdUserMessage) => Promise<void>; onAfterSendFileMessage?: (message: SendbirdFileMessage) => Promise<void>; onAfterUpdateUserMessage?: (message: SendbirdUserMessage) => Promise<void>; onAfterUpdateFileMessage?: (message: SendbirdFileMessage) => Promise<void>; onAfterDeleteMessage?: (message: SendbirdUserMessage | SendbirdFileMessage) => Promise<void>; renderMessage?: GroupChannelProps['MessageList']['renderMessage']; renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton']; renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton']; enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator']; enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping']; keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset']; flatListProps?: GroupChannelProps['MessageList']['flatListProps']; sortComparator?: UseGroupChannelMessagesOptions['sortComparator']; collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator']; searchItem?: GroupChannelProps['MessageList']['searchItem']; }; Header: { shouldHideRight: () => boolean; onPressHeaderLeft: () => void; onPressHeaderRight: () => void; }; MessageList: Pick< ChannelMessageListProps<SendbirdGroupChannel>, | 'enableMessageGrouping' | 'currentUserId' | 'channel' | 'messages' | 'newMessages' | 'scrolledAwayFromBottom' | 'onScrolledAwayFromBottom' | 'onTopReached' | 'onBottomReached' | 'onResendFailedMessage' | 'onDeleteMessage' | 'onPressMediaMessage' | 'renderMessage' | 'renderNewMessagesButton' | 'renderScrollToBottomButton' | 'flatListProps' | 'hasNext' | 'searchItem' > & { onResetMessageList: (callback?: () => void) => void; onResetMessageListWithStartingPoint: (startingPoint: number, callback?: () => void) => void; // Changing the search item will trigger the focus animation on messages. onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void; }; Input: Pick< ChannelInputProps, | 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'SuggestedMentionList' | 'AttachmentsButton' >; SuggestedMentionList: SuggestedMentionListProps; Provider: { channel: SendbirdGroupChannel; enableTypingIndicator: boolean; keyboardAvoidOffset?: number; groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>; }; } /** * Internal context for GroupChannel * For example, the developer can create a custom header * with getting data from the domain context * */ export interface GroupChannelContextsType { Fragment: React.Context<{ headerTitle: string; keyboardAvoidOffset?: number; channel: SendbirdGroupChannel; messageToEdit?: SendbirdUserMessage | SendbirdFileMessage; setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void; messageToReply?: SendbirdUserMessage | SendbirdFileMessage; setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void; }>; TypingIndicator: React.Context<{ typingUsers: SendbirdUser[]; }>; PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>; } export interface GroupChannelModule { Provider: CommonComponent<GroupChannelProps['Provider']>; Header: CommonComponent<GroupChannelProps['Header']>; MessageList: CommonComponent<GroupChannelProps['MessageList']>; Input: CommonComponent<GroupChannelProps['Input']>; SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>; StatusEmpty: CommonComponent; StatusLoading: CommonComponent; } export type GroupChannelFragment = CommonComponent<GroupChannelProps['Fragment']>; export type GroupChannelPubSubContextPayload = | { type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS'; data: { message: SendbirdUserMessage | SendbirdFileMessage; }; } | { type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED'; data: { messages: SendbirdMessage[]; }; };