diff --git a/src/components/AdvancedOptions/EthereumKind.js b/src/components/AdvancedOptions/EthereumKind.js
index 0fac97b3..e70e5f3f 100644
--- a/src/components/AdvancedOptions/EthereumKind.js
+++ b/src/components/AdvancedOptions/EthereumKind.js
@@ -25,7 +25,7 @@ export default translate()(({ gasLimit, onChangeGasLimit, t }: Props) => (
{
- const gasLimit = parseInt(str, 10)
+ const gasLimit = parseInt(str || 0, 10)
if (!isNaN(gasLimit) && isFinite(gasLimit)) onChangeGasLimit(gasLimit)
else onChangeGasLimit(0x5208)
}}
diff --git a/src/components/FeesField/BitcoinKind.js b/src/components/FeesField/BitcoinKind.js
index e9458045..0410eae4 100644
--- a/src/components/FeesField/BitcoinKind.js
+++ b/src/components/FeesField/BitcoinKind.js
@@ -50,10 +50,9 @@ const customItem = {
feePerByte: 0,
}
-class FeesField extends Component<
- Props & { fees?: Fees, error?: Error },
- { isFocused: boolean, items: FeeItem[], selectedItem: FeeItem },
-> {
+type State = { isFocused: boolean, items: FeeItem[], selectedItem: FeeItem }
+
+class FeesField extends Component {
state = {
items: [customItem],
selectedItem: customItem,
@@ -103,10 +102,21 @@ class FeesField extends Component<
onSelectChange = selectedItem => {
const { onChange } = this.props
- this.setState({ selectedItem })
- if (selectedItem.feePerByte) onChange(selectedItem.feePerByte)
+ const patch: $Shape = { selectedItem }
+ if (selectedItem.feePerByte) {
+ onChange(selectedItem.feePerByte)
+ } else {
+ const { input } = this
+ if (!selectedItem.feePerByte && input.current) {
+ patch.isFocused = true
+ input.current.select()
+ }
+ }
+ this.setState(patch)
}
+ input = React.createRef()
+
render() {
const { account, feePerByte, error, onChange, t } = this.props
const { items, selectedItem } = this.state
@@ -118,6 +128,7 @@ class FeesField extends Component<
{
componentDidMount() {
this.sync()
}
+ componentWillUnmount() {
+ this.syncId++
+ }
+ syncId = 0
async sync() {
const api = apiForEndpointConfig(this.props.account.endpointConfig)
+ const syncId = ++this.syncId
try {
await api.connect()
const info = await api.getServerInfo()
+ if (syncId !== this.syncId) return
const serverFee = parseAPIValue(info.validatedLedger.baseFeeXRP)
if (!this.props.fee) {
this.props.onChange(serverFee)
diff --git a/src/components/base/Input/index.js b/src/components/base/Input/index.js
index ce210cc1..44ac36cc 100644
--- a/src/components/base/Input/index.js
+++ b/src/components/base/Input/index.js
@@ -151,9 +151,12 @@ class Input extends PureComponent {
onBlur(e)
}
- handleSelectEverything = () => {
- this._input && this._input.setSelectionRange(0, this._input.value.length)
- this._input && this._input.focus()
+ select = () => {
+ const { _input } = this
+ if (_input) {
+ _input.select()
+ _input.focus()
+ }
}
_input = null
diff --git a/src/components/base/InputCurrency/index.js b/src/components/base/InputCurrency/index.js
index 336124e2..1e03d901 100644
--- a/src/components/base/InputCurrency/index.js
+++ b/src/components/base/InputCurrency/index.js
@@ -190,6 +190,16 @@ class InputCurrency extends PureComponent {
)
}
+ select = () => {
+ // TODO we should fowardRef so InputCurrency ref is on Input
+ this.input && this.input.select()
+ }
+
+ input: ?Input
+ onRef = (input: ?Input) => {
+ this.input = input
+ }
+
render() {
const { renderRight, showAllDigits, unit, subMagnitude } = this.props
const { displayValue } = this.state
@@ -198,6 +208,7 @@ class InputCurrency extends PureComponent {
{
}
}
componentWillUnmount() {
- this.unmount = true
+ this.syncId++
}
- unmount = false
+ syncId = 0
async resync() {
const { account, bridge, transaction } = this.props
+ const syncId = ++this.syncId
const canBeSpent = await bridge.canBeSpent(account, transaction)
- if (this.unmount) return
+ if (this.syncId !== syncId) return
this.setState({ canBeSpent })
}
diff --git a/src/components/modals/Send/fields/RecipientField.js b/src/components/modals/Send/fields/RecipientField.js
index f01dd558..f7974c54 100644
--- a/src/components/modals/Send/fields/RecipientField.js
+++ b/src/components/modals/Send/fields/RecipientField.js
@@ -33,16 +33,17 @@ class RecipientField extends Component, { isVali
}
}
componentWillUnmount() {
- this.unmount = true
+ this.syncId++
}
- unmount = false
+ syncId = 0
async resync() {
const { account, bridge, transaction } = this.props
+ const syncId = ++this.syncId
const isValid = await bridge.isRecipientValid(
account.currency,
bridge.getTransactionRecipient(account, transaction),
)
- if (this.unmount) return
+ if (syncId !== this.syncId) return
this.setState({ isValid })
}
diff --git a/src/components/modals/Send/steps/01-step-amount.js b/src/components/modals/Send/steps/01-step-amount.js
index efa72337..0e2524d0 100644
--- a/src/components/modals/Send/steps/01-step-amount.js
+++ b/src/components/modals/Send/steps/01-step-amount.js
@@ -112,14 +112,16 @@ export class StepAmountFooter extends PureComponent<
}
componentWillUnmount() {
- this._isUnmounted = true
+ this.syncId++
}
- _isUnmounted = false
+ syncId = 0
async resync() {
const { account, bridge, transaction } = this.props
+ const syncId = ++this.syncId
+
if (!account || !transaction || !bridge) {
return
}
@@ -128,9 +130,9 @@ export class StepAmountFooter extends PureComponent<
try {
const totalSpent = await bridge.getTotalSpent(account, transaction)
- if (this._isUnmounted) return
+ if (syncId !== this.syncId) return
const canBeSpent = await bridge.canBeSpent(account, transaction)
- if (this._isUnmounted) return
+ if (syncId !== this.syncId) return
this.setState({ totalSpent, canBeSpent, isSyncing: false })
} catch (err) {
this.setState({ isSyncing: false })