/ common / components / GenerateTransactionFactory / GenerateTransactionFactory.tsx
GenerateTransactionFactory.tsx
  1  import React, { Component } from 'react';
  2  import { connect } from 'react-redux';
  3  import EthTx from 'ethereumjs-tx';
  4  import { addHexPrefix } from 'ethereumjs-util';
  5  
  6  import translate from 'translations';
  7  import { getTransactionFields, makeTransaction } from 'libs/transaction';
  8  import { AppState } from 'features/reducers';
  9  import * as derivedSelectors from 'features/selectors';
 10  import {
 11    transactionNetworkSelectors,
 12    transactionSignSelectors,
 13    transactionSelectors
 14  } from 'features/transaction';
 15  import { walletSelectors } from 'features/wallet';
 16  import { OfflineBroadcast } from 'components/SendButtonFactory/OfflineBroadcast';
 17  import { CodeBlock } from 'components/ui';
 18  import { WithSigner } from './Container';
 19  
 20  export interface CallbackProps {
 21    disabled: boolean;
 22    isWeb3Wallet: boolean;
 23    onClick(): void;
 24  }
 25  
 26  interface StateProps {
 27    transaction: EthTx;
 28    walletType: walletSelectors.IWalletType;
 29    serializedTransaction: AppState['transaction']['sign']['local']['signedTransaction'];
 30    networkRequestPending: boolean;
 31    isFullTransaction: boolean;
 32    isWeb3Wallet: boolean;
 33    validGasPrice: boolean;
 34    validGasLimit: boolean;
 35    signedTx: boolean;
 36  }
 37  
 38  interface OwnProps {
 39    withProps(props: CallbackProps): React.ReactElement<any> | null;
 40  }
 41  
 42  type Props = OwnProps & StateProps;
 43  
 44  export class GenerateTransactionFactoryClass extends Component<Props> {
 45    public render() {
 46      const {
 47        walletType,
 48        serializedTransaction,
 49        isFullTransaction,
 50        isWeb3Wallet,
 51        networkRequestPending,
 52        validGasPrice,
 53        validGasLimit,
 54        transaction,
 55        signedTx
 56      } = this.props;
 57  
 58      const getStringifiedTx = (serializedTx: Buffer) =>
 59        JSON.stringify(getTransactionFields(makeTransaction(serializedTx)), null, 2);
 60  
 61      const isButtonDisabled =
 62        !isFullTransaction || networkRequestPending || !validGasPrice || !validGasLimit;
 63  
 64      return (
 65        <React.Fragment>
 66          <WithSigner
 67            isWeb3={isWeb3Wallet}
 68            withSigner={signer =>
 69              this.props.withProps({
 70                disabled: isButtonDisabled,
 71                isWeb3Wallet,
 72                onClick: () => signer(transaction)
 73              })
 74            }
 75          />
 76          {signedTx && (
 77            <React.Fragment>
 78              {/* shows the json representation of the transaction */}
 79              <div className="col-xs-12">
 80                <label>
 81                  {walletType.isWeb3Wallet ? 'Transaction Parameters' : translate('SEND_RAW')}
 82                </label>
 83                <CodeBlock>{getStringifiedTx(serializedTransaction as Buffer)}</CodeBlock>
 84              </div>
 85              {serializedTransaction && (
 86                <div className="col-xs-12">
 87                  <label>
 88                    {walletType.isWeb3Wallet
 89                      ? 'Serialized Transaction Parameters'
 90                      : translate('SEND_SIGNED')}
 91                  </label>
 92                  <CodeBlock>{addHexPrefix(serializedTransaction.toString('hex'))}</CodeBlock>
 93                </div>
 94              )}
 95              <OfflineBroadcast />
 96            </React.Fragment>
 97          )}
 98        </React.Fragment>
 99      );
100    }
101  }
102  
103  export const GenerateTransactionFactory = connect((state: AppState) => ({
104    ...derivedSelectors.getTransaction(state),
105    walletType: walletSelectors.getWalletType(state),
106    serializedTransaction: derivedSelectors.getSerializedTransaction(state),
107    networkRequestPending: transactionNetworkSelectors.isNetworkRequestPending(state),
108    isWeb3Wallet: walletSelectors.getWalletType(state).isWeb3Wallet,
109    validGasPrice: transactionSelectors.isValidGasPrice(state),
110    validGasLimit: transactionSelectors.isValidGasLimit(state),
111    signedTx: !!transactionSignSelectors.getSignedTx(state)
112  }))(GenerateTransactionFactoryClass);