import hoistNonReactStatics from 'hoist-non-react-statics'; import React, { ComponentType, FunctionComponent, useEffect } from 'react'; import { connect, MapDispatchToPropsParam, MapStateToPropsParam } from 'react-redux'; import { useDispatch } from 'app/types'; import { cleanUpAction, CleanUpAction } from '../actions/cleanUp'; export const connectWithCleanUp = ( mapStateToProps: MapStateToPropsParam, mapDispatchToProps: MapDispatchToPropsParam, cleanupAction: CleanUpAction ) => (Component: ComponentType) => { const ConnectedComponent = connect( mapStateToProps, mapDispatchToProps // @ts-ignore )(Component); const ConnectedComponentWithCleanUp: FunctionComponent = (props) => { const dispatch = useDispatch(); useEffect(() => { return function cleanUp() { dispatch(cleanUpAction({ cleanupAction: cleanupAction })); }; }, [dispatch]); // @ts-ignore return ; }; ConnectedComponentWithCleanUp.displayName = `ConnectWithCleanUp(${ConnectedComponent.displayName})`; hoistNonReactStatics(ConnectedComponentWithCleanUp, Component); type Hoisted = typeof ConnectedComponentWithCleanUp & Statics; return ConnectedComponentWithCleanUp as Hoisted; };