import { MutableRefObject, PureComponent, ReactElement, ReactNode, RefObject } from 'react'; import { Placement } from 'bloko/common/metrics'; import { Behavior } from './common'; import { DropLayer } from './constants'; export interface DropBaseProps { /** Базовые класс для down / menu / info */ baseClassNames: string[]; /** Если у компонента должны быть определены padding'и, то они должны задаваться в классе передаваемом в этот проп */ paddingWrapperClassName?: string; /** Тип компонента */ behavior: Behavior; /** Флаг — закрывать ли компонент по клику извне */ closeByClickOutside?: boolean; /** Предпочтительное положение компонента */ placement: Placement; /** Выпадать только в заданном направлении, не обрабатывать другие кейсы */ onlySetPlacement?: boolean; /** Class z-index-а компонента */ layer: DropLayer; /** DOM нода хоста в рамках которого нужно рендерить компонент, по дефолту рендер будет в body */ host?: HTMLElement | null; /** Флаг отвечает за показ компонента, `true` - показать, `false` - скрыть */ show?: boolean; /** Элемент инициатор, относительно которого показывать всплывающую подсказку */ children: ReactElement; /** Метод-рендер контента */ render: (onClose?: () => void) => ReactNode; /** Data-qa компонента */ dataQa?: string; /** Колбек вызываемый при закрытии компонента. Срабатывает в случае клика на крестик или клика вне компонента */ onClose?: () => void; /** Метка, использовать ли тянущийся контент. * Тянущийся компоенент будет растягивать по контенту, ограничиваясь только размерами экрана */ flexible?: boolean; /** Заголовок дропа. Отображается если передан */ title?: ReactNode; /** Тянет содержимое на всю высоту страницы не зависимо от размера содержимого на XS */ stretchOnXS?: boolean; /** Элемент активатор, относительно которого показывать дроп */ activatorRef: MutableRefObject; } interface DropBaseState { animate: boolean; isFirstRender: boolean; show?: boolean; } export default class DropBase extends PureComponent { state: { show: boolean | undefined; animate: boolean; isFirstRender: boolean; }; dropRef: RefObject; sizeBoxRef: RefObject; arrowRef: RefObject; resizeObserver: ResizeObserver | undefined; baseResizeObserver: ResizeObserver | undefined; placement: Placement | null; clickedInsideTheDrop: boolean; initializeObserver(): void; componentDidMount(): void; componentDidUpdate(prevProps: DropBaseProps): void; componentWillUnmount(): void; handleResize: () => void; setupDropElement(): void; setupWidth: () => void; getHost(): HTMLElement; callOnClose: () => void; preventCloseCallback: () => void; updateDropPosition: () => void; renderTitle(): ReactNode; renderBody(): ReactNode; renderDrop(): ReactNode; renderOverlay(): ReactNode; render(): ReactNode; } export {};