import type { AttachmentManagerConfig, MinimumUploadRequestResult, UploadRequestFn, UploadRequestOptions } from './configuration';
import { AttachmentPostUploadMiddlewareExecutor, AttachmentPreUploadMiddlewareExecutor } from './middleware/attachmentManager';
import { StateStore } from '../store';
import type { AttachmentLoadingState, FileLike, FileReference, LocalAttachment, LocalUploadAttachment, UploadPermissionCheckResult } from './types';
import type { DraftMessage, LocalMessage } from '../types';
import type { MessageComposer } from './messageComposer';
export type FileUploadFilter = (file: Partial<LocalUploadAttachment>) => boolean;
export type AttachmentManagerState = {
    attachments: LocalAttachment[];
};
export type AttachmentManagerSnapshot = AttachmentManagerState;
export type AttachmentManagerOptions = {
    composer: MessageComposer;
    message?: DraftMessage | LocalMessage;
};
export declare class AttachmentManager {
    readonly state: StateStore<AttachmentManagerState>;
    readonly composer: MessageComposer;
    readonly preUploadMiddlewareExecutor: AttachmentPreUploadMiddlewareExecutor;
    readonly postUploadMiddlewareExecutor: AttachmentPostUploadMiddlewareExecutor;
    private attachmentsByIdGetterCache;
    constructor({ composer, message }: AttachmentManagerOptions);
    get attachmentsById(): Record<string, LocalAttachment>;
    get client(): import("..").StreamChat;
    get channel(): import("..").Channel;
    get config(): AttachmentManagerConfig;
    get acceptedFiles(): AttachmentManagerConfig["acceptedFiles"];
    set acceptedFiles(acceptedFiles: AttachmentManagerConfig['acceptedFiles']);
    get fileUploadFilter(): AttachmentManagerConfig["fileUploadFilter"];
    set fileUploadFilter(fileUploadFilter: AttachmentManagerConfig['fileUploadFilter']);
    get maxNumberOfFilesPerMessage(): AttachmentManagerConfig["maxNumberOfFilesPerMessage"];
    set maxNumberOfFilesPerMessage(maxNumberOfFilesPerMessage: AttachmentManagerConfig['maxNumberOfFilesPerMessage']);
    setCustomUploadFn: (doUploadRequest: UploadRequestFn) => void;
    get attachments(): LocalAttachment[];
    get hasUploadPermission(): boolean;
    get isUploadEnabled(): boolean;
    get successfulUploads(): LocalAttachment[];
    get successfulUploadsCount(): number;
    get uploadsInProgressCount(): number;
    get failedUploadsCount(): number;
    get blockedUploadsCount(): number;
    get pendingUploadsCount(): number;
    get availableUploadSlots(): number;
    getUploadsByState(state: AttachmentLoadingState): LocalAttachment[];
    cancelAttachmentUploads: (attachments?: LocalAttachment[]) => void;
    private normalizeSnapshotAttachment;
    initState: ({ message }?: {
        message?: DraftMessage | LocalMessage;
    }) => void;
    getSnapshot: () => AttachmentManagerSnapshot;
    restoreSnapshot: (snapshot: AttachmentManagerSnapshot) => void;
    setAttachments: (attachments: LocalAttachment[]) => void;
    clearAttachments: () => void;
    getAttachmentIndex: (localId: string) => number;
    private prepareAttachmentUpdate;
    updateAttachment: (attachmentToUpdate: LocalAttachment) => void;
    upsertAttachments: (attachmentsToUpsert: LocalAttachment[]) => void;
    removeAttachments: (localAttachmentIds: string[]) => void;
    getUploadConfigCheck: (fileLike: FileReference | FileLike) => Promise<UploadPermissionCheckResult>;
    static toLocalUploadAttachment: (fileLike: FileReference | FileLike) => LocalUploadAttachment;
    fileToLocalUploadAttachment: (fileLike: FileReference | FileLike) => Promise<LocalUploadAttachment>;
    private ensureLocalUploadAttachment;
    /**
     * Method to perform the default upload behavior without checking for custom upload functions
     * to prevent recursive calls
     */
    doDefaultUploadRequest: (fileLike: FileReference | FileLike, options?: UploadRequestOptions) => Promise<{
        blocklist?: import("..").BlockListResponse;
        file: string;
        thumb_url?: string;
    }>;
    /**
     * todo: docs how to customize the image and file upload by overriding do
     */
    doUploadRequest: (fileLike: FileReference | FileLike, options?: UploadRequestOptions) => Promise<MinimumUploadRequestResult | {
        blocklist?: import("..").BlockListResponse;
        file: string;
        thumb_url?: string;
    }>;
    uploadAttachment: (attachment: LocalUploadAttachment) => Promise<LocalUploadAttachment | undefined>;
    uploadFile: (file: FileReference | FileLike) => Promise<LocalUploadAttachment>;
    uploadFiles: (files: FileReference[] | FileList | FileLike[]) => Promise<LocalUploadAttachment[] | undefined>;
    private upload;
}
