import { Component, RefObject } from 'react'; import type { ReactNode } from 'react'; import PropTypes from 'prop-types'; import { Animated, FlatList } from 'react-native'; import type { KeyboardEvent, LayoutChangeEvent, StyleProp, TextStyle, ViewStyle } from 'react-native'; import { ActionSheetProvider, ActionSheetOptions } from '@expo/react-native-action-sheet'; import type { ParseShape } from 'react-native-parsed-text'; import type { LightboxProps } from 'react-native-lightbox-v2'; import * as utils from './utils/utils'; import Actions from './Actions'; import type { ActionsProps } from './Actions'; import Avatar from './Avatar'; import type { AvatarProps } from './Avatar'; import Bubble from './Bubble'; import SystemMessage from './SystemMessage'; import type { SystemMessageProps } from './SystemMessage'; import MessageImage from './MessageImage'; import type { MessageImageProps } from './MessageImage'; import MessageText from './MessageText'; import type { MessageTextProps } from './MessageText'; import Composer from './Composer'; import type { ComposerProps } from './Composer'; import Day from './Day'; import type { DayProps } from './Day'; import InputToolbar from './InputToolbar'; import type { InputToolbarProps } from './InputToolbar'; import LoadEarlier from './LoadEarlier'; import type { LoadEarlierProps } from './LoadEarlier'; import Message from './Message'; import MessageContainer from './MessageContainer'; import Send from './Send'; import type { SendProps } from './Send'; import Time from './Time'; import type { TimeProps } from './Time'; import type { QuickRepliesProps } from './QuickReplies'; import EasyAvatar from './EasyAvatar'; import type { IMessage, User, Reply, LeftRightStyle, MessageVideoProps, MessageAudioProps } from './Models'; export interface EasyChatProps { messages?: TMessage[]; isTyping?: boolean; messagesContainerStyle?: StyleProp; text?: string; alignTop?: boolean; wrapInSafeArea?: boolean; scrollToBottom?: boolean; scrollToBottomStyle?: StyleProp; initialText?: string; placeholder?: string; disableComposer?: boolean; user?: User; locale?: string; timeFormat?: string; dateFormat?: string; loadEarlier?: boolean; isLoadingEarlier?: boolean; showUserAvatar?: boolean; showAvatarForEveryMessage?: boolean; isKeyboardInternallyHandled?: boolean; renderAvatarOnTop?: boolean; inverted?: boolean; imageProps?: Message['props']; lightboxProps?: LightboxProps; bottomOffset?: number; minInputToolbarHeight?: number; listViewProps?: any; textInputProps?: any; keyboardShouldPersistTaps?: any; maxInputLength?: number; forceGetKeyboardHeight?: boolean; alwaysShowSend?: boolean; imageStyle?: StyleProp; extraData?: any; minComposerHeight?: number; maxComposerHeight?: number; options?: Record; optionTintColor?: string; quickReplyStyle?: StyleProp; quickReplyTextStyle?: StyleProp; isCustomViewBottom?: boolean; infiniteScroll?: boolean; timeTextStyle?: LeftRightStyle; actionSheet?(): { showActionSheetWithOptions: (options: ActionSheetOptions, callback: (i: number) => void) => void; }; onPressAvatar?(user: User): void; onLongPressAvatar?(user: User): void; messageIdGenerator?(message?: TMessage): string; onSend?(messages: TMessage[]): void; onLoadEarlier?(): void; renderLoading?(): ReactNode; renderLoadEarlier?(props: LoadEarlierProps): ReactNode; renderAvatar?(props: AvatarProps): ReactNode | null; renderBubble?(props: Bubble['props']): ReactNode; renderSystemMessage?(props: SystemMessageProps): ReactNode; onPress?(context: any, message: TMessage): void; onLongPress?(context: any, message: TMessage): void; renderMessage?(message: Message['props']): ReactNode; renderMessageText?(messageText: MessageTextProps): ReactNode; renderMessageImage?(props: MessageImageProps): ReactNode; renderMessageVideo?(props: MessageVideoProps): ReactNode; renderMessageAudio?(props: MessageAudioProps): ReactNode; renderCustomView?(props: Bubble['props']): ReactNode; renderDay?(props: DayProps): ReactNode; renderTime?(props: TimeProps): ReactNode; renderFooter?(): ReactNode; renderChatEmpty?(): ReactNode; renderChatFooter?(): ReactNode; renderInputToolbar?(props: InputToolbarProps): ReactNode; renderComposer?(props: ComposerProps): ReactNode; renderActions?(props: ActionsProps): ReactNode; renderSend?(props: SendProps): ReactNode; renderAccessory?(props: InputToolbarProps): ReactNode; onPressActionButton?(): void; onInputTextChanged?(text: string): void; parsePatterns?(linkStyle: TextStyle): ParseShape[]; onQuickReply?(replies: Reply[]): void; renderQuickReplies?(quickReplies: QuickRepliesProps): ReactNode; renderQuickReplySend?(): ReactNode; scrollToBottomComponent?(): ReactNode; shouldUpdateMessage?(props: Message['props'], nextProps: Message['props']): boolean; } export interface EasyChatState { isInitialized: boolean; composerHeight?: number; messagesContainerHeight?: number | Animated.Value; typingDisabled: boolean; text?: string; messages?: TMessage[]; } declare class EasyChat extends Component, EasyChatState> { static childContextTypes: { actionSheet: PropTypes.Requireable<(...args: any[]) => any>; getLocale: PropTypes.Requireable<(...args: any[]) => any>; }; static defaultProps: { actionSheet: null; alignTop: boolean; alwaysShowSend: boolean; audioProps: {}; bottomOffset: null; dateFormat: string; disableComposer: boolean; extraData: null; forceGetKeyboardHeight: boolean; imageProps: {}; imageStyle: undefined; infiniteScroll: boolean; initialText: undefined; inverted: boolean; isCustomViewBottom: boolean; isKeyboardInternallyHandled: boolean; isLoadingEarlier: boolean; isTyping: boolean; keyboardShouldPersistTaps: string; lightboxProps: {}; listViewProps: {}; loadEarlier: boolean; locale: null; maxComposerHeight: number; maxInputLength: null; messageIdGenerator: () => string; messages: never[]; messagesContainerStyle: undefined; minComposerHeight: number; minInputToolbarHeight: number; onInputTextChanged: null; onLoadEarlier: () => null; onPress: null; onLongPress: null; onLongPressAvatar: null; onPressActionButton: null; onPressAvatar: null; onQuickReply: undefined; onSend: () => null; options: undefined; optionTintColor: undefined; parsePatterns: undefined; placeholder: string; quickReplyStyle: undefined; quickReplyTextStyle: undefined; renderAccessory: null; renderActions: null; renderAvatar: undefined; renderAvatarOnTop: boolean; renderBubble: null; renderChatEmpty: null; renderChatFooter: null; renderComposer: null; renderCustomView: null; renderDay: null; renderFooter: null; renderInputToolbar: null; renderLoadEarlier: null; renderLoading: null; renderMessage: null; renderMessageAudio: null; renderMessageImage: null; renderMessageText: null; renderMessageVideo: null; renderQuickReplies: undefined; renderQuickReplySend: undefined; renderSend: null; renderSystemMessage: null; renderTime: null; renderUsernameOnMessage: boolean; scrollToBottom: boolean; scrollToBottomComponent: undefined; scrollToBottomStyle: undefined; shouldUpdateMessage: undefined; showAvatarForEveryMessage: boolean; showUserAvatar: boolean; text: undefined; textInputProps: {}; timeFormat: string; timeTextStyle: undefined; user: {}; videoProps: {}; wrapInSafeArea: boolean; }; static propTypes: { actionSheet: PropTypes.Requireable<(...args: any[]) => any>; alignTop: PropTypes.Requireable; audioProps: PropTypes.Requireable; bottomOffset: PropTypes.Requireable; dateFormat: PropTypes.Requireable; disableComposer: PropTypes.Requireable; extraData: PropTypes.Requireable; forceGetKeyboardHeight: PropTypes.Requireable; imageProps: PropTypes.Requireable; initialText: PropTypes.Requireable; inverted: PropTypes.Requireable; isCustomViewBottom: PropTypes.Requireable; isKeyboardInternallyHandled: PropTypes.Requireable; isLoadingEarlier: PropTypes.Requireable; keyboardShouldPersistTaps: PropTypes.Requireable; lightboxProps: PropTypes.Requireable; listViewProps: PropTypes.Requireable; loadEarlier: PropTypes.Requireable; locale: PropTypes.Requireable; maxComposerHeight: PropTypes.Requireable; maxInputLength: PropTypes.Requireable; messageIdGenerator: PropTypes.Requireable<(...args: any[]) => any>; messages: PropTypes.Requireable<(object | null | undefined)[]>; messagesContainerStyle: PropTypes.Requireable; minComposerHeight: PropTypes.Requireable; minInputToolbarHeight: PropTypes.Requireable; onInputTextChanged: PropTypes.Requireable<(...args: any[]) => any>; onLoadEarlier: PropTypes.Requireable<(...args: any[]) => any>; onLongPress: PropTypes.Requireable<(...args: any[]) => any>; onLongPressAvatar: PropTypes.Requireable<(...args: any[]) => any>; onPressActionButton: PropTypes.Requireable<(...args: any[]) => any>; onPressAvatar: PropTypes.Requireable<(...args: any[]) => any>; onSend: PropTypes.Requireable<(...args: any[]) => any>; placeholder: PropTypes.Requireable; renderAccessory: PropTypes.Requireable<(...args: any[]) => any>; renderActions: PropTypes.Requireable<(...args: any[]) => any>; renderAvatar: PropTypes.Requireable<(...args: any[]) => any>; renderAvatarOnTop: PropTypes.Requireable; renderBubble: PropTypes.Requireable<(...args: any[]) => any>; renderChatEmpty: PropTypes.Requireable<(...args: any[]) => any>; renderChatFooter: PropTypes.Requireable<(...args: any[]) => any>; renderComposer: PropTypes.Requireable<(...args: any[]) => any>; renderCustomView: PropTypes.Requireable<(...args: any[]) => any>; renderDay: PropTypes.Requireable<(...args: any[]) => any>; renderFooter: PropTypes.Requireable<(...args: any[]) => any>; renderInputToolbar: PropTypes.Requireable<(...args: any[]) => any>; renderLoadEarlier: PropTypes.Requireable<(...args: any[]) => any>; renderLoading: PropTypes.Requireable<(...args: any[]) => any>; renderMessage: PropTypes.Requireable<(...args: any[]) => any>; renderMessageImage: PropTypes.Requireable<(...args: any[]) => any>; renderMessageText: PropTypes.Requireable<(...args: any[]) => any>; renderSend: PropTypes.Requireable<(...args: any[]) => any>; renderSystemMessage: PropTypes.Requireable<(...args: any[]) => any>; renderTime: PropTypes.Requireable<(...args: any[]) => any>; renderUsernameOnMessage: PropTypes.Requireable; showUserAvatar: PropTypes.Requireable; text: PropTypes.Requireable; textInputProps: PropTypes.Requireable; timeFormat: PropTypes.Requireable; user: PropTypes.Requireable; videoProps: PropTypes.Requireable; wrapInSafeArea: PropTypes.Requireable; }; static append(currentMessages: TTMessage[], messages: TTMessage[], inverted?: boolean): TTMessage[]; static prepend(currentMessages: TTMessage[], messages: TTMessage[], inverted?: boolean): TTMessage[]; _isMounted: boolean; _keyboardHeight: number; _bottomOffset: number; _maxHeight?: number; _isFirstLayout: boolean; _locale: string; invertibleScrollViewProps: any; _actionSheetRef: RefObject; _messageContainerRef?: RefObject>; _isTextInputWasFocused: boolean; textInput?: any; constructor(props: EasyChatProps); getChildContext(): { actionSheet: () => import("@expo/react-native-action-sheet").ActionSheetProps | undefined; getLocale: () => string; }; componentDidMount(): void; componentDidUpdate(prevProps?: EasyChatProps): void; componentWillUnmount(): void; /** * Store text input focus status when keyboard hide to retrieve * it after wards if needed. * `onKeyboardWillHide` may be called twice in sequence so we * make a guard condition (eg. showing image picker) */ handleTextInputFocusWhenKeyboardHide(): void; /** * Refocus the text input only if it was focused before showing keyboard. * This is needed in some cases (eg. showing image picker). */ handleTextInputFocusWhenKeyboardShow(): void; setLocale(locale: string): void; getLocale: () => string; setTextFromProp(textProp?: string): void; getTextFromProp(fallback: string): string; setMessages(messages: TMessage[]): void; getMessages(): TMessage[]; setMaxHeight(height: number): void; getMaxHeight(): number; setKeyboardHeight(height: number): void; getKeyboardHeight(): number; setBottomOffset(value: number): void; getBottomOffset(): number; setIsFirstLayout(value: boolean): void; getIsFirstLayout(): boolean; setIsTypingDisabled(value: boolean): void; getIsTypingDisabled(): boolean; setIsMounted(value: boolean): void; getIsMounted(): boolean; getMinInputToolbarHeight(): number; /** * Returns the height, based on current window size, without taking the keyboard into account. */ getBasicMessagesContainerHeight(argComposerHeight?: number): number; /** * Returns the height, based on current window size, taking the keyboard into account. */ getMessagesContainerHeightWithKeyboard(argComposerHeight?: number): number; onKeyboardWillShow: (e: KeyboardEvent) => void; onKeyboardWillHide: (_e: KeyboardEvent) => void; onKeyboardDidShow: (e: KeyboardEvent) => void; onKeyboardDidHide: (e: KeyboardEvent) => void; onSend: (messages?: TMessage[], shouldResetInputToolbar?: boolean) => void; onInputSizeChanged: (size: { height: number; }) => void; onInputTextChanged: (text: string) => void; onInitialLayoutViewLayout: (e: LayoutChangeEvent) => void; onMainViewLayout: (e: LayoutChangeEvent) => void; initLocale(): void; focusTextInput(): void; calculateInputToolbarHeight(composerHeight: number): number; notifyInputTextReset(): void; scrollToBottom(animated?: boolean): void; resetInputToolbar(): void; renderMessages(): JSX.Element; renderInputToolbar(): ReactNode; renderChatFooter(): ReactNode; renderLoading(): ReactNode; render(): JSX.Element; } export * from './Models'; export { EasyChat, Actions, Avatar, Bubble, SystemMessage, MessageImage, MessageText, Composer, Day, InputToolbar, LoadEarlier, Message, MessageContainer, Send, Time, EasyAvatar, utils, };