import type { EmojiCategory, SendbirdError, User } from '@sendbird/chat';
import { type FileMessage, FileMessageCreateParams, type MultipleFilesMessage, MultipleFilesMessageCreateParams, UserMessageCreateParams, UserMessageUpdateParams } from '@sendbird/chat/message';
import type { GroupChannel, MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';
import type { PubSubTypes } from '../../../lib/pubSub';
import type { ScrollTopics, ScrollTopicUnion } from './hooks/useMessageListScroll';
import type { SendableMessageType } from '../../../utils';
import type { UserProfileProviderProps } from '../../../lib/UserProfileContext';
import { ReplyType } from '../../../types';
import { useMessageActions } from './hooks/useMessageActions';
import { useGroupChannelMessages } from '@sendbird/uikit-tools';
import { ThreadReplySelectType } from './const';
import { PropsWithChildren } from 'react';
type MessageDataSource = ReturnType<typeof useGroupChannelMessages>;
export type MessageActions = ReturnType<typeof useMessageActions>;
export type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;
export type OnBeforeHandler<T> = (params: T) => T | Promise<T> | void | Promise<void>;
export type OnBeforeDownloadFileMessageType = (params: {
    message: FileMessage | MultipleFilesMessage;
    index?: number;
}) => Promise<boolean>;
export interface GroupChannelState extends GroupChannelProviderProps, Omit<InternalGroupChannelState, keyof GroupChannelProviderProps> {
}
interface InternalGroupChannelState extends MessageDataSource {
    currentChannel: GroupChannel | null;
    channelUrl: string;
    fetchChannelError: SendbirdError | null;
    nicknamesMap: Map<string, string>;
    quoteMessage: SendableMessageType | null;
    animatedMessageId: number | null;
    isScrollBottomReached: boolean;
    readState: string | null;
    newMessageIds: number[] | null;
    scrollRef: React.RefObject<HTMLDivElement>;
    scrollDistanceFromBottomRef: React.MutableRefObject<number>;
    scrollPositionRef: React.MutableRefObject<number>;
    messageInputRef: React.RefObject<HTMLDivElement>;
    isReactionEnabled: boolean;
    isMessageGroupingEnabled: boolean;
    isMultipleFilesMessageEnabled: boolean;
    autoscrollMessageOverflowToTop: boolean;
    showSearchIcon: boolean;
    replyType: ReplyType;
    threadReplySelectType: ThreadReplySelectType;
    disableMarkAsRead: boolean;
    scrollBehavior: 'smooth' | 'auto';
    markAsUnread?: (message: SendableMessageType) => void;
    markAsUnreadSourceRef: React.MutableRefObject<'manual' | 'internal' | null>;
    scrollPubSub: PubSubTypes<ScrollTopics, ScrollTopicUnion>;
}
export interface GroupChannelProviderProps extends PropsWithChildren<Pick<UserProfileProviderProps, 'renderUserProfile' | 'disableUserProfile' | 'onUserProfileMessage' | 'onStartDirectMessage'>> {
    channelUrl: string;
    isReactionEnabled?: boolean;
    isMessageGroupingEnabled?: boolean;
    isMultipleFilesMessageEnabled?: boolean;
    autoscrollMessageOverflowToTop?: boolean;
    showSearchIcon?: boolean;
    replyType?: ReplyType;
    threadReplySelectType?: ThreadReplySelectType;
    disableMarkAsRead?: boolean;
    scrollBehavior?: 'smooth' | 'auto';
    forceLeftToRightMessageLayout?: boolean;
    startingPoint?: number;
    animatedMessageId?: number | null;
    onMessageAnimated?: () => void;
    messageListQueryParams?: MessageListQueryParamsType;
    filterEmojiCategoryIds?: (message: SendableMessageType) => EmojiCategory['id'][];
    onBeforeSendUserMessage?: OnBeforeHandler<UserMessageCreateParams>;
    onBeforeSendFileMessage?: OnBeforeHandler<FileMessageCreateParams>;
    onBeforeSendVoiceMessage?: OnBeforeHandler<FileMessageCreateParams>;
    onBeforeSendMultipleFilesMessage?: OnBeforeHandler<MultipleFilesMessageCreateParams>;
    onBeforeUpdateUserMessage?: OnBeforeHandler<UserMessageUpdateParams>;
    onBeforeDownloadFileMessage?: OnBeforeDownloadFileMessageType;
    onBackClick?(): void;
    onChatHeaderActionClick?(event: React.MouseEvent<HTMLElement>): void;
    onReplyInThreadClick?: (props: {
        message: SendableMessageType;
    }) => void;
    onSearchClick?(): void;
    onQuoteMessageClick?: (props: {
        message: SendableMessageType;
    }) => void;
    renderUserMentionItem?: (props: {
        user: User;
    }) => JSX.Element;
}
export {};
