import type * as React from 'react'; import type { ModalCardProps } from '../../components/ModalCard/types'; import type { ModalPageProps } from '../../components/ModalPage/types'; import type { ModalRootProps } from '../../components/ModalRoot/types'; import type { HasDataAttribute } from '../../types'; export type UseModalManagerProps = Omit & { saveHistory?: boolean | undefined; }; export type OpenModalPageProps = Omit & HasDataAttribute; export type OpenModalCardProps = Omit & HasDataAttribute; export type CustomModalPageItem = Pick & { type: 'page'; id: string; component: React.ComponentType; additionalProps?: any | undefined; modalProps?: OpenModalPageProps | undefined; }; export type CustomModalCardItem = Pick & { type: 'card'; id: string; component: React.ComponentType; additionalProps?: any | undefined; modalProps?: OpenModalCardProps | undefined; }; export type ModalManagerItem = CustomModalPageItem | CustomModalCardItem; export type OpenModalReturn = { id: string; close: () => void; update: (props: T) => void; onClose: (resolve?: () => R, reject?: VoidFunction) => Promise; }; type UpdateArgs = | [id: string, type: 'card', props: Omit] | [id: string, type: 'page', props: Omit]; export type OpenCardReturn = OpenModalReturn>; export type OpenPageReturn = OpenModalReturn>; export type CustomModalProps< BaseProps extends OpenModalCardProps | OpenModalPageProps, AdditionalProps extends object = object, > = AdditionalProps & Pick>, 'close' | 'update'> & { modalProps: BaseProps; }; export type CustomModalPayload< BaseProps extends OpenModalCardProps | OpenModalPageProps, AdditionalProps extends object = object, > = { id?: string | undefined; component: React.ComponentType>; baseProps?: BaseProps | undefined; additionalProps?: AdditionalProps | undefined; }; /** * API предоставляемое хуком `useModalManager` */ export type ModalManagerApi = { /** * Метод для открытия `ModalCard`, принимает свойства `ModalCard`. * Возвращает объект типа `OpenModalReturn`. */ openModalCard: (props: OpenModalCardProps) => OpenCardReturn; /** * Метод для открытия `ModalPage`, принимает свойства `ModalPage`. * Возвращает объект типа `OpenModalReturn`. */ openModalPage: (props: OpenModalPageProps) => OpenPageReturn; /** * Метод для открытия кастомного модального окна на базе `ModalCard`. */ openCustomModalCard: ( props: | CustomModalPayload | React.ComponentType>, ) => OpenCardReturn; /** * Метод для открытия кастомного модального окна на базе `ModalPage`. */ openCustomModalPage: ( props: | CustomModalPayload | React.ComponentType>, ) => OpenPageReturn; /** * Метод для изменения свойств уже созданных модалок. Принимает `id` и новые свойства, которые нужно переопределить. */ update: (...args: UpdateArgs) => void; /** * Метод для закрытия определенного модального окна. Принимает `id` модального окна. */ close: (id: string) => void; /** * Метод для закрытия всех модальных окон. */ closeAll: () => void; /** * Метод для изменения флага `saveHistory` */ setSaveHistory: (saveHistory: boolean) => void; }; export type UseModalManagerReturn = [ModalManagerApi, React.ReactElement | null];