import React, { Component } from 'react'; import Transition from 'react-transition-group/Transition'; import { Route, Switch } from 'react-router-dom'; interface ModalTransitionProps { 'in': boolean; children?: React.ReactNode; onClose: (e: React.MouseEvent) => void; onOpen?: () => void; modalProps: any; } type TransitionState = 'entering' | 'entered' | 'exiting' | 'exited'; export const ModalTransition: (k: React.ComponentType, opts?: { enter?: number, exit?: number }) => React.ComponentType = (ModalType, { enter = 0, exit = 500 } = {}) => class InnerModalTransition extends Component { public componentDidUpdate(prevProps: ModalTransitionProps) { const { onOpen, in: nowIn } = this.props; const { in: prevIn } = prevProps; if (onOpen && nowIn && (prevIn !== nowIn)) { onOpen(); } } public render() { const { in: inProp, children, onClose, modalProps } = this.props; return ( { (transitionState: TransitionState) => { const open = transitionState === 'entered'; return ( {children} ); } } ); } }; interface RouteComponentPropTypes { path: string; exact?: boolean; children?: React.ReactNode[]; onClose: (e: React.MouseEvent) => void; onOpen?: () => void; } export const RouteModal: (k: React.ComponentType) => React.ComponentType = (ModalTransitionType) => { const routedComponent = (props: RouteComponentPropTypes) => { const { path, children, onClose, onOpen, exact = false, ...rest } = props; return ( ( {children} )} /> ( {children} )} /> ); }; return routedComponent; };