/ common / components / NonceField.tsx
NonceField.tsx
 1  import React from 'react';
 2  import { connect } from 'react-redux';
 3  
 4  import translate from 'translations';
 5  import { AppState } from 'features/reducers';
 6  import { getOffline } from 'features/config';
 7  import { transactionNetworkActions, transactionNetworkSelectors } from 'features/transaction';
 8  import { Spinner, Input } from 'components/ui';
 9  import Help from 'components/ui/Help';
10  import { NonceFieldFactory } from 'components/NonceFieldFactory';
11  import './NonceField.scss';
12  
13  interface OwnProps {
14    alwaysDisplay: boolean;
15    showInvalidBeforeBlur?: boolean;
16  }
17  
18  interface StateProps {
19    isOffline: boolean;
20    noncePending: boolean;
21  }
22  
23  interface DispatchProps {
24    requestNonce: transactionNetworkActions.TGetNonceRequested;
25  }
26  
27  type Props = OwnProps & DispatchProps & StateProps;
28  
29  class NonceField extends React.Component<Props> {
30    public render() {
31      const {
32        alwaysDisplay,
33        showInvalidBeforeBlur,
34        requestNonce,
35        noncePending,
36        isOffline
37      } = this.props;
38      return (
39        <NonceFieldFactory
40          withProps={({ nonce: { raw, value }, onChange, readOnly, shouldDisplay }) => {
41            return alwaysDisplay || shouldDisplay ? (
42              <div className="input-group-wrapper Nonce-label">
43                <label className="input-group">
44                  <div className="input-group-header">
45                    {translate('OFFLINE_STEP2_LABEL_5')}
46                    <Help
47                      size="x1"
48                      link="https://support.mycrypto.com/transactions/what-is-nonce.html"
49                    />
50                  </div>
51                  <Input
52                    isValid={!!value}
53                    className="Nonce-field-input"
54                    type="number"
55                    placeholder="7"
56                    value={raw}
57                    readOnly={readOnly}
58                    onChange={onChange}
59                    disabled={noncePending}
60                    showInvalidWithoutValue={true}
61                    showInvalidBeforeBlur={showInvalidBeforeBlur}
62                  />
63                  {noncePending ? (
64                    <div className="Nonce-spinner">
65                      <Spinner />
66                    </div>
67                  ) : (
68                    !isOffline && (
69                      <button className="Nonce-refresh" onClick={requestNonce}>
70                        <i className="fa fa-refresh" />
71                      </button>
72                    )
73                  )}
74                </label>
75              </div>
76            ) : null;
77          }}
78        />
79      );
80    }
81  }
82  
83  const mapStateToProps = (state: AppState): StateProps => {
84    return {
85      isOffline: getOffline(state),
86      noncePending: transactionNetworkSelectors.nonceRequestPending(state)
87    };
88  };
89  
90  export default connect(mapStateToProps, {
91    requestNonce: transactionNetworkActions.getNonceRequested
92  })(NonceField);