import { AfterViewInit, ChangeDetectorRef, ComponentFactoryResolver, ComponentRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, Type } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { UserResponse } from 'stream-chat';
import { AttachmentService } from '../attachment.service';
import { ChannelService } from '../channel.service';
import { NotificationService } from '../notification.service';
import { AttachmentPreviewListContext, AttachmentUpload, AudioRecording, CustomAttachmentUploadContext, DefaultStreamChatGenerics, EmojiPickerContext, StreamMessage } from '../types';
import { MessageInputConfigService } from './message-input-config.service';
import { TextareaInterface } from './textarea.interface';
import { EmojiInputService } from './emoji-input.service';
import { CustomTemplatesService } from '../custom-templates.service';
import { MessageActionsService } from '../message-actions.service';
import { VoiceRecorderService } from './voice-recorder.service';
import { AudioRecorderService } from '../voice-recorder/audio-recorder.service';
import * as i0 from "@angular/core";
/**
 * The `MessageInput` component displays an input where users can type their messages and upload files, and sends the message to the active channel. The component can be used to compose new messages or update existing ones. To send messages, the chat user needs to have the necessary [channel capability](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript).
 */
export declare class MessageInputComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {
    private channelService;
    private notificationService;
    readonly attachmentService: AttachmentService;
    private configService;
    private textareaType;
    private componentFactoryResolver;
    private cdRef;
    private emojiInputService;
    private customTemplatesService;
    private messageActionsService;
    readonly voiceRecorderService: VoiceRecorderService;
    audioRecorder?: AudioRecorderService | undefined;
    /**
     * If file upload is enabled, the user can open a file selector from the input. Please note that the user also needs to have the necessary [channel capability](https://getstream.io/chat/docs/javascript/channel_capabilities/?language=javascript). If no value is provided, it is set from the [`MessageInputConfigService`](../services/MessageInputConfigService.mdx).
     */
    isFileUploadEnabled: boolean | undefined;
    /**
     * If true, users can mention other users in messages. You also [need to use the `AutocompleteTextarea`](../concepts/opt-in-architecture.mdx) for this feature to work. If no value is provided, it is set from the [`MessageInputConfigService`](../services/MessageInputConfigService.mdx).
     */
    areMentionsEnabled: boolean | undefined;
    /**
     * The scope for user mentions, either members of the current channel of members of the application. If no value is provided, it is set from the [`MessageInputConfigService`](../services/MessageInputConfigService.mdx).
     */
    mentionScope: 'channel' | 'application' | undefined;
    /**
     * Determines if the message is being dispalyed in a channel or in a [thread](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
     */
    mode: 'thread' | 'main';
    /**
     * If true, users can select multiple files to upload. If no value is provided, it is set from the [`MessageInputConfigService`](../services/MessageInputConfigService.mdx).
     */
    isMultipleFileUploadEnabled: boolean | undefined;
    /**
     * The message to edit
     */
    message: StreamMessage | undefined;
    /**
     * An observable that can be used to trigger message sending from the outside
     */
    sendMessage$: Observable<void> | undefined;
    /**
     * In `desktop` mode the `Enter` key will trigger message sending, in `mobile` mode the `Enter` key will insert a new line to the message input. If no value is provided, it is set from the [`MessageInputConfigService`](../services/MessageInputConfigService.mdx).
     */
    inputMode: 'desktop' | 'mobile';
    /**
     * Enables or disables auto focus on the textarea element
     */
    autoFocus: boolean;
    /**
     * By default the input will react to changes in `messageToEdit$` from [`MessageActionsService`](../services/MessageActionsService.mdx) and display the message to be edited (taking into account the current `mode`).
     *
     * If you don't need that behavior, you can turn this of with this flag. In that case you should create your own edit message UI.
     */
    watchForMessageToEdit: boolean;
    /**
     * Use this input to control wether a send button is rendered or not. If you don't render a send button, you can still trigger message send using the `sendMessage$` input.
     */
    displaySendButton: boolean;
    /**
     * You can enable/disable voice recordings with this input
     */
    displayVoiceRecordingButton: boolean;
    /**
     * Emits when a message was successfuly sent or updated
     */
    readonly messageUpdate: EventEmitter<{
        message: StreamMessage;
    }>;
    voiceRecorderRef: TemplateRef<{
        service: VoiceRecorderService;
    }> | undefined;
    class: string;
    isVoiceRecording: boolean;
    isFileUploadAuthorized: boolean | undefined;
    canSendLinks: boolean | undefined;
    canSendMessages: boolean | undefined;
    attachmentUploads$: Observable<AttachmentUpload[]>;
    attachmentUploadInProgressCounter$: Observable<number>;
    textareaValue: string;
    textareaRef: ComponentRef<TextareaInterface & Partial<OnChanges>> | undefined;
    mentionedUsers: UserResponse[];
    quotedMessage: undefined | StreamMessage;
    typingStart$: Subject<void>;
    cooldown$: Observable<number> | undefined;
    isCooldownInProgress: boolean;
    emojiPickerTemplate: TemplateRef<EmojiPickerContext> | undefined;
    customAttachmentUploadTemplate: TemplateRef<CustomAttachmentUploadContext> | undefined;
    attachmentPreviewListTemplate: TemplateRef<AttachmentPreviewListContext> | undefined;
    textareaPlaceholder: string;
    fileInputId: string;
    private fileInput;
    private textareaAnchor;
    private subscriptions;
    private hideNotification;
    private isViewInited;
    private channel;
    private sendMessageSubcription;
    private readonly defaultTextareaPlaceholder;
    private readonly slowModeTextareaPlaceholder;
    private messageToEdit?;
    constructor(channelService: ChannelService, notificationService: NotificationService, attachmentService: AttachmentService, configService: MessageInputConfigService, textareaType: Type<TextareaInterface>, componentFactoryResolver: ComponentFactoryResolver, cdRef: ChangeDetectorRef, emojiInputService: EmojiInputService, customTemplatesService: CustomTemplatesService, messageActionsService: MessageActionsService, voiceRecorderService: VoiceRecorderService, audioRecorder?: AudioRecorderService | undefined);
    ngOnInit(): void;
    ngAfterViewInit(): void;
    ngOnChanges(changes: SimpleChanges): void;
    ngOnDestroy(): void;
    messageSent(): Promise<void>;
    get containsLinks(): boolean;
    get quotedMessageAttachments(): import("stream-chat").Attachment<{
        attachmentType: import("stream-chat").UR & import("../types").UnknownType & {
            asset_url?: string | undefined;
            id?: string | undefined;
            images?: import("stream-chat").Attachment<DefaultStreamChatGenerics>[] | undefined;
            mime_type?: string | undefined;
            isCustomAttachment?: boolean | undefined;
        };
        channelType: import("stream-chat").UR & import("../types").UnknownType & {
            image?: string | undefined;
            member_count?: number | undefined;
            subtitle?: string | undefined;
        };
        commandType: string;
        eventType: import("stream-chat").UR & import("../types").UnknownType;
        messageType: {};
        pollOptionType: import("stream-chat").UR;
        pollType: import("stream-chat").UR;
        reactionType: import("stream-chat").UR & import("../types").UnknownType;
        userType: import("stream-chat").UR & import("../types").UnknownType & import("../types").DefaultUserTypeInternal & {
            mutes?: import("stream-chat").Mute<DefaultStreamChatGenerics>[] | undefined;
        };
    }>[];
    get disabledTextareaText(): "" | "streamChat.You can't send thread replies in this channel" | "streamChat.You can't send messages in this channel";
    filesSelected(fileList: FileList | null): Promise<void>;
    deselectMessageToQuote(): void;
    deselectMessageToEdit(): void;
    getEmojiPickerContext(): EmojiPickerContext;
    getAttachmentPreviewListContext(): AttachmentPreviewListContext;
    getAttachmentUploadContext(): CustomAttachmentUploadContext;
    startVoiceRecording(): Promise<void>;
    voiceRecordingReady(recording: AudioRecording): Promise<void>;
    get isUpdate(): boolean;
    private deleteUpload;
    private retryUpload;
    private clearFileInput;
    private initTextarea;
    private setCanSendMessages;
    private get parentMessageId();
    private startCooldown;
    private stopCooldown;
    private checkIfInEditMode;
    private messageToUpdateChanged;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessageInputComponent, [null, null, null, null, null, null, null, null, null, null, null, { optional: true; }]>;
    static ɵcmp: i0.ɵɵComponentDeclaration<MessageInputComponent, "stream-message-input", never, { "isFileUploadEnabled": "isFileUploadEnabled"; "areMentionsEnabled": "areMentionsEnabled"; "mentionScope": "mentionScope"; "mode": "mode"; "isMultipleFileUploadEnabled": "isMultipleFileUploadEnabled"; "message": "message"; "sendMessage$": "sendMessage$"; "inputMode": "inputMode"; "autoFocus": "autoFocus"; "watchForMessageToEdit": "watchForMessageToEdit"; "displaySendButton": "displaySendButton"; "displayVoiceRecordingButton": "displayVoiceRecordingButton"; }, { "messageUpdate": "messageUpdate"; }, ["voiceRecorderRef"], ["[message-input-start]", "[message-input-end]"], false, never>;
}
