UNPKG

@sendbird/uikit-react-native

Version:

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

212 lines (195 loc) 8.28 kB
import type React from 'react'; import type { FlatList } from 'react-native'; import type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel'; import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks'; import type { OnBeforeHandler, PickPartial, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdMessage, SendbirdSendableMessage, SendbirdUser, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams, } from '@sendbird/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 type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams; export interface GroupChannelProps { Fragment: { channel: SendbirdGroupChannel; onChannelDeleted: () => void; onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft']; onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight']; onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage']; onPressReplyMessageInThread?: GroupChannelProps['Provider']['onPressReplyMessageInThread']; onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>; onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>; onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>; onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>; renderMessage?: GroupChannelProps['MessageList']['renderMessage']; renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton']; renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton']; enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator']; enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping']; keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset']; flatListComponent?: GroupChannelProps['MessageList']['flatListComponent']; flatListProps?: GroupChannelProps['MessageList']['flatListProps']; sortComparator?: UseGroupChannelMessagesOptions['sortComparator']; searchItem?: GroupChannelProps['MessageList']['searchItem']; /** * @description You can specify the query parameters for the message list. * @example * ``` * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} /> * ``` * */ messageListQueryParams?: MessageListQueryParamsType; /** @deprecated Please use `messageListQueryParams` instead */ collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator']; }; 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' | 'flatListComponent' | 'flatListProps' | 'hasNext' | 'searchItem' > & { onResetMessageList: () => Promise<void>; onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>; // Changing the search item will trigger the focus animation on messages. onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void; }; Input: PickPartial< ChannelInputProps, | 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'SuggestedMentionList' | 'AttachmentsButton', 'inputDisabled' >; SuggestedMentionList: SuggestedMentionListProps; Provider: { channel: SendbirdGroupChannel; enableTypingIndicator: boolean; keyboardAvoidOffset?: number; groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>; messages: SendbirdMessage[]; // Changing the search item will trigger the focus animation on messages. onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void; onPressReplyMessageInThread: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void; }; } /** * 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>>; MessageList: React.Context<{ /** * ref object for FlatList of MessageList * */ flatListRef: React.MutableRefObject<FlatList | null>; /** * Function that scrolls to a message within a group channel. * @param messageId {number} - The id of the message to scroll. * @param options {object} - Scroll options (optional). * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling. * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0) * * @example * ``` * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList); * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 }); * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.'); * ``` * */ scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean; /** * Call the FlatList function asynchronously to scroll to bottom lazily * to avoid scrolling before data rendering has been committed. * */ lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void; /** * Call the FlatList function asynchronously to scroll to index lazily. * to avoid scrolling before data rendering has been committed. * */ lazyScrollToIndex: (params?: { index?: number; animated?: boolean; timeout?: number; viewPosition?: number; }) => void; onPressReplyMessageInThread?: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void; }>; } 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 = React.FC<GroupChannelProps['Fragment']>; export type GroupChannelPubSubContextPayload = | { type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS'; data: { message: SendbirdUserMessage | SendbirdFileMessage; }; } | { type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED'; data: { messages: SendbirdMessage[]; }; } | { type: 'TYPING_BUBBLE_RENDERED'; data?: undefined; };