import React, { Component } from 'react'; import { connect } from 'react-redux'; import { AppState } from 'features/reducers'; import * as derivedSelectors from 'features/selectors'; import { getOffline } from 'features/config'; import { transactionBroadcastTypes, transactionSignActions, transactionSignSelectors, transactionSelectors } from 'features/transaction'; import { notificationsActions } from 'features/notifications'; import { ConfirmationModal } from 'components/ConfirmationModal'; interface StateProps { offline: boolean; currentTransaction: false | transactionBroadcastTypes.ITransactionStatus | null; transactionBroadcasted: boolean; signaturePending: boolean; signedTx: boolean; } interface State { showModal: boolean; } interface DispatchProps { showNotification: notificationsActions.TShowNotification; signTransactionRequested: transactionSignActions.TSignTransactionRequested; } interface OwnProps { Modal: typeof ConfirmationModal; withOnClick(onClick: { openModal(): void; signer(signer: any): void; }): React.ReactElement | null; } const INITIAL_STATE: State = { showModal: false }; type Props = OwnProps & StateProps & DispatchProps; class OnlineSendClass extends Component { public state: State = INITIAL_STATE; public render() { return ( {this.props.withOnClick({ openModal: this.openModal, signer: this.props.signTransactionRequested })} ); } public UNSAFE_componentWillReceiveProps(nextProps: Props) { if (nextProps.transactionBroadcasted && this.state.showModal) { this.closeModal(); } } private openModal = () => { const { currentTransaction } = this.props; if ( currentTransaction && (currentTransaction.broadcastSuccessful || currentTransaction.isBroadcasting) ) { return this.props.showNotification( 'warning', 'The current transaction is already broadcasting or has been successfully broadcasted' ); } this.setState({ showModal: true }); }; private closeModal = () => this.setState({ showModal: false }); } export const OnlineSend = connect( (state: AppState) => ({ offline: getOffline(state), currentTransaction: transactionSelectors.getCurrentTransactionStatus(state), transactionBroadcasted: transactionSelectors.currentTransactionBroadcasted(state), signaturePending: derivedSelectors.signaturePending(state).isSignaturePending, signedTx: !!transactionSignSelectors.getSignedTx(state) || !!transactionSignSelectors.getWeb3Tx(state) }), { showNotification: notificationsActions.showNotification, signTransactionRequested: transactionSignActions.signTransactionRequested } )(OnlineSendClass);