/**
 * ToDo
 * 1. Сейчас не оптимально структура компонентов выстроена, из-за чего нарушается
 * отзывчивость компонентов на изменения. В частности renderHeader() выполняется
 * из активного элемента, а не текущего, и после сохранения объекта не
 * прекращается индикатор загрузки. Пришлось хакнуть принудительным обновлением через 2 сек.
 *
 * 2. Вынести методы в контекст.
      createTemplate,
      updateTemplate,
      deleteTemplate,
 */
import React from 'react';
import { EditableObject } from 'apollo-cms';
import { EditorContextValue } from '../context';
import { PrismaCmsContext } from '@prisma-cms/context';
import { EditorComponentObject, EditorComponentProps, EditorComponentState } from './interfaces';
import { ElementWithReactComponent } from '..';
export * from './interfaces';
export declare class EditorComponent<P extends EditorComponentProps = EditorComponentProps, S extends EditorComponentState = EditorComponentState> extends EditableObject<P, S> {
    context: PrismaCmsContext;
    static Name: string;
    static saveable: boolean;
    static help_url: string;
    static defaultProps: {
        errorDelay: number;
        SaveIcon: React.ComponentType<{}>;
        ResetIcon: React.ComponentType<import("material-ui/SvgIcon").SvgIconProps>;
        EditIcon: React.ComponentType<import("material-ui/SvgIcon").SvgIconProps>;
        cacheKeyPrefix: string;
    } & {
        contentEditable: boolean | undefined;
    } & Record<string, any>;
    component: EditorComponent | undefined;
    constructor(props: P);
    /**
     * Пока что имеются коллизии с обновляемыми объектами, взятыми из кеша,
     * так что пока кеш отключаем
     */
    container: EditorComponent | ElementWithReactComponent | Text | null;
    reactComponent: EditorComponent | null;
    componentDidMount(): void;
    addEventListeners(): void;
    componentWillUnmount(): void;
    /**
     * @deprecated
     */
    processMeta(_meta?: {}): void;
    /**
     * Редактировать можно в следующих случаях:
     * 1. Если нет родителя и нет id
     * 2. Если есть ID и пользователь является владельцем
     */
    prepareDirty(data: P['_dirty']): P['_dirty'] | undefined;
    /**
     * Обновление данных объекта.
     * Так как компоненты рендерятся на основании передаваемых свойств,
     * надо обновить данные абсолютного родителя, а не просто текущего элемента
     */
    updateObject(data: P['_dirty']): void;
    onDragStart: (event: React.DragEvent) => void;
    /**
     * Создаем новый элемент, который будет добавлен в схему при перетаскивании
     */
    prepareDragItem(): EditorComponentObject;
    prepareDragItemProps(): {};
    prepareDragItemComponents(): never[];
    onDragEnd: () => void;
    onDrop(event: React.DragEvent): true | undefined;
    prepareNewItem(item: P['object']): P['object'] | undefined;
    /**
     * Двигаем блок вверх
     */
    moveBlockUp(event?: React.MouseEvent): void;
    /**
     * Двигаем блок вниз
     */
    moveBlockDown(event?: React.MouseEvent): void;
    /**
     * Обновить мы должны текущий элемент или предка
     */
    addComponent(newItem: P['object']): void;
    /**
     * Перетираем компоненты текущего объекта
     */
    setComponents(components: P['object']['components']): void;
    /**
     * Удаление элемента.
     * Если это корневой элемент, удаляем его.
     * Если нет, то удаляем из родительского
     */
    delete: (event?: React.MouseEvent<Element, MouseEvent> | undefined) => false | undefined;
    isDeletable(): boolean;
    /**
     * Надо обновить components, чтобы в объекте было актуальное свойство
    //  */
    /**
     * Проходимся вверх до тех пор, пока не найдем родителя с id
     */
    getActiveParent(): EditorComponent;
    /**
     * При клике по активному элементу в документе,
     * отмечаем его, чтобы можно было редактировать его свойства
     */
    onClick(event: React.MouseEvent): void;
    setActiveItem: (component: EditorContextValue['activeItem']) => void;
    inMainMode: () => boolean;
    onMouseOver(event: React.MouseEvent): void;
    onMouseLeave(event: React.MouseEvent): void;
    isHovered(): S["hovered"];
    onDragEnter(event: React.DragEvent): true | undefined;
    /**
     * Учитывается при наведении.
     * Определяет может ли быть брошен сюда перетаскиваемый элемент
     */
    /**
     * Возможно этот метод будет оставлен (или переименован).
     * Получается следующая логика:
     * При перетаскивании, дочерний элемент смотрим, хочет ли он стать дочерним
     * через метод canBeChild(), в котором смотрит
     *
     */
    canBeDropped(child: EditorContextValue['dragItem']): boolean;
    /**
     * В новом компоненте проверяет может ли компонент на странице стать родительским для него.
     */
    canBeParent(parent: P['parent']): boolean;
    /**
     * В родительском компоненте проверяет может ли новый компонент стать дочерним.
     */
    canBeChild(child: EditorComponent): boolean;
    /**
     * Note: If using in canBeParent, should pass parent instead this
     */
    findInParent(parent: EditorComponent, condition: (parent: EditorComponent) => EditorComponent | null): EditorComponent | null;
    /**
     * Поиск реакт-объекта в дочерних
     * this.findReactChild(editableObject._reactInternalFiber.child, stateNode => stateNode instanceof Editable);
     */
    onDragOver(event: React.DragEvent): true | undefined;
    getComponentProps(component: EditorComponent): P['object']['props'];
    getRenderProps(componentProps?: {}): any;
    renderPanelView(content?: React.ReactNode): React.ReactNode;
    onAddButtonClick: (event: React.MouseEvent) => void;
    renderAddButton(content?: React.ReactNode): React.ReactNode;
    unsetActiveItem: (event: React.MouseEvent) => void;
    onInputSettings: (event: React.ChangeEvent<HTMLInputElement>) => void;
    expandStructure: (event: React.MouseEvent<HTMLInputElement>) => void;
    renderSettingsView(content?: React.ReactNode): JSX.Element | null;
    /**
     * Сохраняем в самостоятельный компонент
     */
    saveSeparatedComponent(parentId: P['object']['id']): Promise<false | undefined>;
    isRoot(): boolean;
    getStructure(item: EditorComponent): {
        __typename?: string | undefined;
        id?: string | undefined;
        name: string;
        description?: string | null | undefined;
        component: string | EditorComponent<EditorComponentProps, EditorComponentState>;
        components: EditorComponentObject<Record<string, any>>[];
        props: Record<string, any> & {
            text?: string | null | undefined;
            tag?: keyof JSX.IntrinsicElements | undefined;
            query?: string | undefined;
            first?: number | undefined;
            style?: React.CSSProperties | undefined;
        };
        createdAt?: string | undefined;
        updatedAt?: string | undefined;
    } | {};
    getEditorField(props: any): JSX.Element | null;
    renderUploader(props?: Record<string, any>): JSX.Element;
    onChangeProps(event: React.ChangeEvent, style: any): void;
    updateProps(node: any, style: any): void;
    updateComponentProperty(name: keyof P['object']['props'], value: any, style?: any): void;
    /**
     * Обновления свойств объекта.
     * Здесь важно понимать когда свойства текущего объекта надо изменить (если корневой или с id),
     * а когда родительский (с плавающей вложенностью)
     */
    updateComponentProps(data: Partial<P['object']['props']>): void;
    /**
     * ToDo. Сейчас при перетаскивании элементов с id возникают проблемы,
     * потому что у одного родителя может быть сразу несколько потомков с одним и тем же id.
     * По этой причине мы не можем сейчас четко определить какой же элемент двигался.
     */
    getComponentInParent(): EditorComponentObject<Record<string, any>> | null | undefined;
    removeProps(name: keyof P['object']['props']): void;
    getActiveItem(): EditorComponent<EditorComponentProps, EditorComponentState> | null | undefined;
    isActive: () => boolean;
    stopPropagation: (event: React.MouseEvent) => void;
    renderMainView(renderProps?: Record<string, any>): React.ReactNode;
    renderBadgeTitle(title: React.ReactNode): React.ReactNode;
    renderBadge(badge: React.ReactNode): React.ReactNode;
    renderAddButtons(content: React.ReactNode): React.ReactNode;
    renderActionPanel(content: React.ReactNode): React.ReactNode;
    isVoidElement(): boolean;
    prepareRootElementProps(props: P & Record<string, any>): Record<string, any>;
    getRootElement(): React.ReactNode;
    renderChildren(): React.ReactNode;
    getComponents(itemComponents: P['object']['components']): P["object"]["components"];
    renderComponent(objectComponent: P['object'], index: number): JSX.Element | null | undefined;
    deleteComponentByIndex: (index: number) => void;
    inEditorMode(): boolean;
    /**
     * Do not render header for all components.
     * If in render, use renderComponentHeader()
     */
    renderHeader(): null;
    renderComponentHeader(): React.ReactNode;
    getTitle(): string | undefined;
    renderEmpty(): React.ReactNode;
    renderEditableView(): React.ReactNode;
    renderDefaultView(): React.ReactNode;
    editorContext: EditorContextValue;
    getEditorContext: () => EditorContextValue;
    render(): JSX.Element;
}
export default EditorComponent;
