@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.
185 lines (172 loc) • 6.94 kB
text/typescript
import type React from 'react';
import type { FlatList } from 'react-native';
import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
import type {
OnBeforeHandler,
PickPartial,
SendbirdFileMessage,
SendbirdFileMessageCreateParams,
SendbirdFileMessageUpdateParams,
SendbirdGroupChannel,
SendbirdMessage,
SendbirdUserMessage,
SendbirdUserMessageCreateParams,
SendbirdUserMessageUpdateParams,
} from '@sendbird/uikit-utils';
import type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';
import type { ChannelThreadMessageListProps } from '../../components/ChannelThreadMessageList';
import type { CommonComponent } from '../../types';
import type { PubSub } from '../../utils/pubsub';
export interface GroupChannelThreadProps {
Fragment: {
channel: SendbirdGroupChannel;
parentMessage: SendbirdUserMessage | SendbirdFileMessage;
startingPoint?: number;
onParentMessageDeleted: () => void;
onChannelDeleted: () => void;
onPressHeaderLeft: GroupChannelThreadProps['Header']['onPressLeft'];
onPressHeaderSubtitle?: GroupChannelThreadProps['Header']['onPressSubtitle'];
onPressMediaMessage?: GroupChannelThreadProps['MessageList']['onPressMediaMessage'];
onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;
onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;
onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;
onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;
renderMessage?: GroupChannelThreadProps['MessageList']['renderMessage'];
enableMessageGrouping?: GroupChannelThreadProps['MessageList']['enableMessageGrouping'];
keyboardAvoidOffset?: GroupChannelThreadProps['Provider']['keyboardAvoidOffset'];
flatListProps?: GroupChannelThreadProps['MessageList']['flatListProps'];
sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];
};
Header: {
onPressLeft: () => void;
onPressSubtitle: () => void;
};
ParentMessageInfo: {
channel: SendbirdGroupChannel;
currentUserId?: string;
onDeleteMessage: (message: SendbirdUserMessage | SendbirdFileMessage) => Promise<void>;
onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;
};
MessageList: Pick<
ChannelThreadMessageListProps<SendbirdGroupChannel>,
| 'enableMessageGrouping'
| 'currentUserId'
| 'channel'
| 'messages'
| 'newMessages'
| 'scrolledAwayFromBottom'
| 'onScrolledAwayFromBottom'
| 'onTopReached'
| 'onBottomReached'
| 'onResendFailedMessage'
| 'onDeleteMessage'
| 'onPressMediaMessage'
| 'renderMessage'
| 'flatListProps'
| 'hasNext'
| 'searchItem'
> & {
onResetMessageList: () => Promise<void>;
onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;
startingPoint?: number;
};
Input: PickPartial<
ChannelInputProps,
| 'shouldRenderInput'
| 'onPressSendUserMessage'
| 'onPressSendFileMessage'
| 'onPressUpdateUserMessage'
| 'onPressUpdateFileMessage'
| 'SuggestedMentionList'
| 'AttachmentsButton',
'inputDisabled'
>;
SuggestedMentionList: SuggestedMentionListProps;
Provider: {
channel: SendbirdGroupChannel;
keyboardAvoidOffset?: number;
groupChannelThreadPubSub: PubSub<GroupChannelThreadPubSubContextPayload>;
parentMessage: SendbirdUserMessage | SendbirdFileMessage;
threadedMessages: SendbirdMessage[];
};
}
/**
* Internal context for GroupChannelThread
* For example, the developer can create a custom header
* with getting data from the domain context
* */
export interface GroupChannelThreadContextsType {
Fragment: React.Context<{
headerTitle: string;
keyboardAvoidOffset?: number;
channel: SendbirdGroupChannel;
parentMessage: SendbirdUserMessage | SendbirdFileMessage;
messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;
setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;
}>;
PubSub: React.Context<PubSub<GroupChannelThreadPubSubContextPayload>>;
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(GroupChannelThreadContexts.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;
}>;
}
export interface GroupChannelThreadModule {
Provider: CommonComponent<GroupChannelThreadProps['Provider']>;
Header: CommonComponent<GroupChannelThreadProps['Header']>;
ParentMessageInfo: CommonComponent<GroupChannelThreadProps['ParentMessageInfo']>;
MessageList: CommonComponent<GroupChannelThreadProps['MessageList']>;
Input: CommonComponent<GroupChannelThreadProps['Input']>;
SuggestedMentionList: CommonComponent<GroupChannelThreadProps['SuggestedMentionList']>;
StatusEmpty: CommonComponent;
StatusLoading: CommonComponent;
}
export type GroupChannelThreadFragment = React.FC<GroupChannelThreadProps['Fragment']>;
export type GroupChannelThreadPubSubContextPayload =
| {
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;
};