Files

113 lines
3.6 KiB
TypeScript
Raw Permalink Normal View History

2017-12-18 16:23:31 -05:00
import React, { Component } from 'react';
import { connect } from 'react-redux';
import EthTx from 'ethereumjs-tx';
import { addHexPrefix } from 'ethereumjs-util';
import translate from 'translations';
import { getTransactionFields, makeTransaction } from 'libs/transaction';
import { AppState } from 'features/reducers';
import * as derivedSelectors from 'features/selectors';
import {
transactionNetworkSelectors,
transactionSignSelectors,
transactionSelectors
} from 'features/transaction';
import { walletSelectors } from 'features/wallet';
import { OfflineBroadcast } from 'components/SendButtonFactory/OfflineBroadcast';
import { CodeBlock } from 'components/ui';
import { WithSigner } from './Container';
2017-12-18 16:23:31 -05:00
2018-01-29 16:58:07 -06:00
export interface CallbackProps {
disabled: boolean;
isWeb3Wallet: boolean;
onClick(): void;
}
2017-12-18 16:23:31 -05:00
interface StateProps {
transaction: EthTx;
walletType: walletSelectors.IWalletType;
serializedTransaction: AppState['transaction']['sign']['local']['signedTransaction'];
2017-12-18 16:23:31 -05:00
networkRequestPending: boolean;
isFullTransaction: boolean;
isWeb3Wallet: boolean;
2018-01-21 13:41:20 -05:00
validGasPrice: boolean;
validGasLimit: boolean;
signedTx: boolean;
2017-12-18 16:23:31 -05:00
}
2018-01-29 16:58:07 -06:00
interface OwnProps {
withProps(props: CallbackProps): React.ReactElement<any> | null;
}
type Props = OwnProps & StateProps;
2018-04-15 03:21:33 +05:00
export class GenerateTransactionFactoryClass extends Component<Props> {
2017-12-18 16:23:31 -05:00
public render() {
2018-01-15 01:51:35 -05:00
const {
walletType,
serializedTransaction,
2018-01-15 01:51:35 -05:00
isFullTransaction,
isWeb3Wallet,
networkRequestPending,
2018-01-21 13:41:20 -05:00
validGasPrice,
2018-01-29 16:58:07 -06:00
validGasLimit,
transaction,
signedTx
2018-01-15 01:51:35 -05:00
} = this.props;
2018-01-21 13:41:20 -05:00
const getStringifiedTx = (serializedTx: Buffer) =>
JSON.stringify(getTransactionFields(makeTransaction(serializedTx)), null, 2);
2018-01-21 13:41:20 -05:00
const isButtonDisabled =
2018-01-24 21:41:39 -05:00
!isFullTransaction || networkRequestPending || !validGasPrice || !validGasLimit;
2018-04-15 03:21:33 +05:00
2017-12-18 16:23:31 -05:00
return (
<React.Fragment>
<WithSigner
isWeb3={isWeb3Wallet}
withSigner={signer =>
this.props.withProps({
disabled: isButtonDisabled,
isWeb3Wallet,
onClick: () => signer(transaction)
})
}
/>
{signedTx && (
<React.Fragment>
{/* shows the json representation of the transaction */}
<div className="col-xs-12">
<label>
{walletType.isWeb3Wallet ? 'Transaction Parameters' : translate('SEND_RAW')}
</label>
<CodeBlock>{getStringifiedTx(serializedTransaction as Buffer)}</CodeBlock>
</div>
{serializedTransaction && (
<div className="col-xs-12">
<label>
{walletType.isWeb3Wallet
? 'Serialized Transaction Parameters'
: translate('SEND_SIGNED')}
</label>
<CodeBlock>{addHexPrefix(serializedTransaction.toString('hex'))}</CodeBlock>
</div>
)}
<OfflineBroadcast />
</React.Fragment>
)}
</React.Fragment>
2017-12-18 16:23:31 -05:00
);
}
}
2018-01-29 16:58:07 -06:00
export const GenerateTransactionFactory = connect((state: AppState) => ({
...derivedSelectors.getTransaction(state),
walletType: walletSelectors.getWalletType(state),
serializedTransaction: derivedSelectors.getSerializedTransaction(state),
networkRequestPending: transactionNetworkSelectors.isNetworkRequestPending(state),
isWeb3Wallet: walletSelectors.getWalletType(state).isWeb3Wallet,
validGasPrice: transactionSelectors.isValidGasPrice(state),
validGasLimit: transactionSelectors.isValidGasLimit(state),
signedTx: !!transactionSignSelectors.getSignedTx(state)
2018-01-29 16:58:07 -06:00
}))(GenerateTransactionFactoryClass);