react-reverse-portal
Version:
Build an element once, move it anywhere
61 lines (60 loc) • 2.44 kB
TypeScript
import * as React from 'react';
declare const ELEMENT_TYPE_HTML = "html";
declare const ELEMENT_TYPE_SVG = "svg";
type BaseOptions = {
attributes?: {
[key: string]: string;
};
};
type HtmlOptions = BaseOptions & {
containerElement?: keyof HTMLElementTagNameMap;
};
type SvgOptions = BaseOptions & {
containerElement?: keyof SVGElementTagNameMap;
};
type Component<P> = React.Component<P> | React.ComponentType<P>;
type ComponentProps<C extends Component<any>> = C extends Component<infer P> ? P : never;
interface PortalNodeBase<C extends Component<any>> {
setPortalProps(p: ComponentProps<C>): void;
getInitialPortalProps(): ComponentProps<C>;
mount(newParent: Node, placeholder: Node): void;
unmount(expectedPlaceholder?: Node): void;
}
export interface HtmlPortalNode<C extends Component<any> = Component<any>> extends PortalNodeBase<C> {
element: HTMLElement;
elementType: typeof ELEMENT_TYPE_HTML;
}
export interface SvgPortalNode<C extends Component<any> = Component<any>> extends PortalNodeBase<C> {
element: SVGElement;
elementType: typeof ELEMENT_TYPE_SVG;
}
type AnyPortalNode<C extends Component<any> = Component<any>> = HtmlPortalNode<C> | SvgPortalNode<C>;
interface InPortalProps {
node: AnyPortalNode;
children: React.ReactNode;
}
declare class InPortal extends React.PureComponent<InPortalProps, {
nodeProps: {};
}> {
constructor(props: InPortalProps);
addPropsChannel: () => void;
componentDidMount(): void;
componentDidUpdate(): void;
render(): React.ReactPortal;
}
type OutPortalProps<C extends Component<any>> = {
node: AnyPortalNode<C>;
} & Partial<ComponentProps<C>>;
declare class OutPortal<C extends Component<any>> extends React.PureComponent<OutPortalProps<C>> {
private placeholderNode;
private currentPortalNode?;
constructor(props: OutPortalProps<C>);
passPropsThroughPortal(): void;
componentDidMount(): void;
componentDidUpdate(): void;
componentWillUnmount(): void;
render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
}
declare const createHtmlPortalNode: <C extends Component<any> = Component<any>>(options?: HtmlOptions) => HtmlPortalNode<C>;
declare const createSvgPortalNode: <C extends Component<any> = Component<any>>(options?: SvgOptions) => SvgPortalNode<C>;
export { createHtmlPortalNode, createSvgPortalNode, InPortal, OutPortal, };