react-use-hook-modal
Version:
A React Hook library for declaratively managing modals, eliminating the need for state declarations. Props can be passed directly through function calls, simplifying modal control in your application.
41 lines (40 loc) • 1.5 kB
TypeScript
export type ModalKey = string | number;
export interface ModalState<TProps = any> {
Component: React.ComponentType<TProps>;
props: TProps & {
isOpen: boolean;
};
key: ModalKey;
portalTarget?: HTMLElement | null;
}
export interface ModalStateContextType {
modals: ModalState[];
}
export interface OpenParams<TProps> extends Omit<ModalState<TProps>, 'props'> {
props?: Omit<TProps, 'isOpen'>;
}
export interface CloseParams extends Omit<CloseModalOptions, 'modalKey'> {
key: ModalKey;
}
export interface ModalDispatchContextType {
openModal: <TProps>(params: OpenParams<TProps>) => void;
closeModal: (params: CloseParams) => void;
clearModals: () => void;
}
type IsPropsRequired<TProps> = Exclude<keyof TProps, 'isOpen'> extends never ? false : Partial<Pick<TProps, Exclude<keyof TProps, 'isOpen'>>> extends Pick<TProps, Exclude<keyof TProps, 'isOpen'>> ? false : true;
export interface OpenModalOptions {
key?: ModalKey;
portalTarget?: HTMLElement | null;
}
export type OpenModal<TProps> = IsPropsRequired<TProps> extends true ? (props: Omit<TProps, 'isOpen'>, options?: OpenModalOptions) => void : (props?: Omit<TProps, 'isOpen'>, options?: OpenModalOptions) => void;
export interface CloseModalOptions {
key?: ModalKey;
clearTime?: number;
}
export type CloseModal = (options?: CloseModalOptions) => void;
export interface UseModalReturn<TProps> {
open: OpenModal<TProps>;
close: CloseModal;
key: ModalKey;
}
export {};