UNPKG

@sendbird/uikit-chat-hooks

Version:

A set of React hooks for integrating Sendbird chat functionality into your React app.

449 lines (392 loc) 12.3 kB
import type { ReplyType } from '@sendbird/chat/message'; import type { SendbirdChatSDK, SendbirdError, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdGroupChannelCollection, SendbirdGroupChannelListQuery, SendbirdMessage, SendbirdMessageCollection, SendbirdOpenChannel, SendbirdOpenChannelListQuery, SendbirdPreviousMessageListQuery, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams, UserStruct, } from '@sendbird/uikit-utils'; export interface CustomQueryInterface<Data> { isLoading: boolean; next: () => Promise<Data[]>; hasNext: boolean; } export interface CustomBidirectionalQueryInterface<Data> { isLoading: boolean; next: () => Promise<Data[]>; hasNext: () => boolean; prev: () => Promise<Data[]>; hasPrev: () => boolean; } /** * @deprecated This hook is deprecated and will be replaced by the '@sendbird/uikit-tools' package. * * @interface UseGroupChannelList * @description interface for group channel list hook * */ export interface UseGroupChannelList { (sdk: SendbirdChatSDK, userId?: string, options?: UseGroupChannelListOptions): { /** * Loading state, only available on first render * */ loading: boolean; /** * Refreshing state, status is changes when the refresh is called. * */ refreshing: boolean; /** * Refresh, clear and reload messages from latest * @return {Promise<void>} * */ refresh: () => Promise<void>; /** * Get group channels state * */ groupChannels: SendbirdGroupChannel[]; /** * Fetch next channels to state * @return {Promise<void>} * */ next: () => Promise<void>; }; } export type UseGroupChannelListOptions = { queryCreator?: () => SendbirdGroupChannelListQuery; collectionCreator?: () => SendbirdGroupChannelCollection; enableCollectionWithoutLocalCache?: boolean; }; /** * @deprecated This hook is deprecated and will be replaced by the '@sendbird/uikit-tools' package. * * @interface UseGroupChannelMessages * @description interface for group channel messages hook * - Receive new messages from other users & should count new messages -> append to state(newMessages) * - onTopReached -> prev() -> fetch prev messages and append to state(messages) * - onBottomReached -> next() -> fetch next messages and append to state(messages) * */ export interface UseGroupChannelMessages { (sdk: SendbirdChatSDK, channel: SendbirdGroupChannel, userId?: string, options?: UseGroupChannelMessagesOptions): { /** * Loading state, only available on first render * */ loading: boolean; /** * Refreshing state, status is changes when the refresh is called. * */ refreshing: boolean; /** * Refresh, clear and reload messages from latest * @return {Promise<void>} * */ refresh: () => Promise<void>; /** * Get messages, this state is for render * For example, if a user receives a new messages while searching for an old message * for this case, new messages will be included here. * @return {SendbirdMessage[]} * */ messages: SendbirdMessage[]; /** * Fetch prev messages to state * @return {Promise<void>} * */ prev: () => Promise<void>; /** * Check if there are more prev messages to fetch * @return {boolean} * */ hasPrev: () => boolean; /** * Fetch next messages to state * @return {Promise<void>} * */ next: () => Promise<void>; /** * Check if there are more next messages to fetch * @return {boolean} * */ hasNext: () => boolean; /** * A new message means a message that meets the below conditions * - Not admin message * - Not updated message * - Not current user's message * */ newMessages: SendbirdMessage[]; /** * reset message list with starting point * */ resetWithStartingPoint: (startingPoint: number, callback?: () => void) => void; /** * Reset new messages * */ resetNewMessages: () => void; /** * Send file message * @param params file message params * @param callback sent message callback * @return pending message * */ sendFileMessage: ( params: SendbirdFileMessageCreateParams, onPending?: (message: SendbirdFileMessage, error?: SendbirdError) => void, ) => Promise<SendbirdFileMessage>; /** * Send user message * @param params user message params * @param callback sent message callback * @return pending message * */ sendUserMessage: ( params: SendbirdUserMessageCreateParams, onPending?: (message: SendbirdUserMessage, error?: SendbirdError) => void, ) => Promise<SendbirdUserMessage>; /** * Update file message * @param messageId * @param params file message params * @return updated message * */ updateFileMessage: (messageId: number, params: SendbirdFileMessageUpdateParams) => Promise<SendbirdFileMessage>; /** * Update user message * @param messageId * @param params user message params * @return updated message * */ updateUserMessage: (messageId: number, params: SendbirdUserMessageUpdateParams) => Promise<SendbirdUserMessage>; /** * Resend failed message * @param failedMessage failed message to resend * @return {Promise<void>} * */ resendMessage: (failedMessage: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>; /** * Delete message * @param message sent or failed message * @return {Promise<void>} * */ deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>; }; } export type UseGroupChannelMessagesOptions = { replyType?: ReplyType; sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number; queryCreator?: () => SendbirdPreviousMessageListQuery; collectionCreator?: (options?: Pick<UseGroupChannelMessagesOptions, 'startingPoint'>) => SendbirdMessageCollection; enableCollectionWithoutLocalCache?: boolean; onChannelDeleted?: () => void; shouldCountNewMessages?: () => boolean; startingPoint?: number; onMessagesReceived?: (messages: SendbirdMessage[]) => void; onMessagesUpdated?: (messages: SendbirdMessage[]) => void; }; /** * @interface UseOpenChannelList * @description interface for open channel list hook * */ export interface UseOpenChannelList { (sdk: SendbirdChatSDK, userId?: string, options?: UseOpenChannelListOptions): { /** * Loading state, only available on first render * */ loading: boolean; /** * Refreshing state, status is changes when the refresh is called. * */ refreshing: boolean; /** * Refresh, clear and reload messages from latest * @return {Promise<void>} * */ refresh: () => Promise<void>; /** * Error state * */ error: unknown | null; /** * Get open channels state * */ openChannels: SendbirdOpenChannel[]; /** * Fetch next channels to state * @return {Promise<void>} * */ next: () => Promise<void>; }; } export type UseOpenChannelListOptions = { queryCreator?: () => SendbirdOpenChannelListQuery; }; /** * @interface UseOpenChannelMessages * @description interface for open channel messages hook * - Receive new messages from other users & should count new messages -> append to state(newMessages) * - onTopReached -> prev() -> fetch prev messages and append to state(messages) * - onBottomReached -> noop * */ export interface UseOpenChannelMessages { (sdk: SendbirdChatSDK, channel: SendbirdOpenChannel, userId?: string, options?: UseOpenChannelMessagesOptions): { /** * Loading state, only available on first render * */ loading: boolean; /** * Refreshing state, status is changes when the refresh is called. * */ refreshing: boolean; /** * Refresh, clear and reload messages from latest * @return {Promise<void>} * */ refresh: () => Promise<void>; /** * Get messages, this state is for render * For example, if a user receives a new messages while searching for an old message * for this case, new messages will be included here. * @return {SendbirdMessage[]} * */ messages: SendbirdMessage[]; /** * Fetch prev messages to state * @return {Promise<void>} * */ prev: () => Promise<void>; /** * Check if there are more prev messages to fetch * @return {boolean} * */ hasPrev: () => boolean; /** * A new message means a message that meets the below conditions * - Not admin message * - Not updated message * - Not current user's message * */ newMessages: SendbirdMessage[]; /** * Reset new messages * */ resetNewMessages: () => void; /** * Fetch next messages to state * @return {Promise<void>} * */ next: () => Promise<void>; /** * Check if there are more next messages to fetch * @return {boolean} * */ hasNext: () => boolean; /** * Send file message * @param params file message params * @param callback sent message callback * @return pending message * */ sendFileMessage: ( params: SendbirdFileMessageCreateParams, onPending?: (message: SendbirdFileMessage, error?: SendbirdError) => void, ) => Promise<SendbirdFileMessage>; /** * Send user message * @param params user message params * @param callback sent message callback * @return pending message * */ sendUserMessage: ( params: SendbirdUserMessageCreateParams, onPending?: (message: SendbirdUserMessage, error?: SendbirdError) => void, ) => Promise<SendbirdUserMessage>; /** * Update file message * @param messageId * @param params file message params * @return updated message * */ updateFileMessage: (messageId: number, params: SendbirdFileMessageUpdateParams) => Promise<SendbirdFileMessage>; /** * Update user message * @param messageId * @param params user message params * @return updated message * */ updateUserMessage: (messageId: number, params: SendbirdUserMessageUpdateParams) => Promise<SendbirdUserMessage>; /** * Resend failed message * @param failedMessage failed message to resend * @return {Promise<void>} * */ resendMessage: (failedMessage: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>; /** * Delete message * @param message sent or failed message * @return {Promise<void>} * */ deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>; }; } export type UseOpenChannelMessagesOptions = { sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number; queryCreator?: () => SendbirdPreviousMessageListQuery; onChannelDeleted?: () => void; onError?: (error?: unknown) => void; shouldCountNewMessages?: () => boolean; onMessagesReceived?: (messages: SendbirdMessage[]) => void; }; /** * @interface UseUserListReturn * @description interface for user list hook return value * */ export interface UseUserListReturn<User extends UserStruct> { /** * Loading state, only available on first render * */ loading: boolean; /** * Refreshing state, status is changes when the refresh is called. * */ refreshing: boolean; /** * Error state * */ error: unknown | null; /** * Refresh, clear and reload messages from latest * @return {Promise<void>} * */ refresh: () => Promise<void>; /** * Get users state * */ users: User[]; /** * Update or Insert user to list * */ upsertUser: (user: User) => void; /** * Delete user from list * */ deleteUser: (userId: User['userId']) => void; /** * Fetch next users to state * @return {Promise<void>} * */ next: () => Promise<void>; } export type UseUserListOptions<User extends UserStruct> = { sortComparator?: (a: User, b: User) => number; queryCreator?: () => CustomQueryInterface<User>; };