2019-08-10 08:57:55 +02:00
|
|
|
import React, { Component } from 'react';
|
2020-06-18 17:49:36 +02:00
|
|
|
import { View, ActivityIndicator, Text, TouchableOpacity, StyleSheet, StatusBar } from 'react-native';
|
2019-08-10 08:57:55 +02:00
|
|
|
import {
|
|
|
|
BlueButton,
|
|
|
|
SafeBlueArea,
|
|
|
|
BlueTransactionOutgoingIcon,
|
|
|
|
BlueTransactionPendingIcon,
|
|
|
|
BlueTransactionIncomingIcon,
|
|
|
|
BlueCard,
|
|
|
|
BlueText,
|
|
|
|
BlueLoading,
|
|
|
|
BlueSpacing20,
|
|
|
|
BlueNavigationStyle,
|
|
|
|
} from '../../BlueComponents';
|
|
|
|
import PropTypes from 'prop-types';
|
2020-03-11 20:16:51 +01:00
|
|
|
import { HDSegwitBech32Transaction } from '../../class';
|
2019-08-10 08:57:55 +02:00
|
|
|
import { BitcoinUnit } from '../../models/bitcoinUnits';
|
|
|
|
import { Icon } from 'react-native-elements';
|
2019-08-14 01:08:38 +02:00
|
|
|
import Handoff from 'react-native-handoff';
|
2020-03-30 15:50:19 +02:00
|
|
|
import HandoffSettings from '../../class/handoff';
|
2020-07-15 19:32:59 +02:00
|
|
|
import { BlueCurrentTheme } from '../../components/themes';
|
2019-08-10 08:57:55 +02:00
|
|
|
/** @type {AppStorage} */
|
2020-06-01 14:54:23 +02:00
|
|
|
const BlueApp = require('../../BlueApp');
|
|
|
|
const loc = require('../../loc');
|
2019-08-10 08:57:55 +02:00
|
|
|
|
|
|
|
const buttonStatus = Object.freeze({
|
|
|
|
possible: 1,
|
|
|
|
unknown: 2,
|
|
|
|
notPossible: 3,
|
|
|
|
});
|
|
|
|
|
2020-05-24 11:17:26 +02:00
|
|
|
const styles = StyleSheet.create({
|
|
|
|
root: {
|
|
|
|
flex: 1,
|
|
|
|
},
|
|
|
|
container: {
|
|
|
|
flex: 1,
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
},
|
|
|
|
center: {
|
|
|
|
alignItems: 'center',
|
|
|
|
},
|
|
|
|
value: {
|
2020-07-15 19:32:59 +02:00
|
|
|
color: BlueCurrentTheme.colors.alternativeTextColor2,
|
2020-05-24 11:17:26 +02:00
|
|
|
fontSize: 36,
|
|
|
|
fontWeight: '600',
|
|
|
|
},
|
|
|
|
valueUnit: {
|
2020-07-15 19:32:59 +02:00
|
|
|
color: BlueCurrentTheme.colors.alternativeTextColor2,
|
2020-05-24 11:17:26 +02:00
|
|
|
fontSize: 16,
|
|
|
|
fontWeight: '600',
|
|
|
|
},
|
|
|
|
memo: {
|
|
|
|
alignItems: 'center',
|
|
|
|
marginVertical: 8,
|
|
|
|
},
|
|
|
|
memoText: {
|
|
|
|
color: '#9aa0aa',
|
|
|
|
fontSize: 14,
|
|
|
|
},
|
|
|
|
iconRoot: {
|
2020-07-15 19:32:59 +02:00
|
|
|
backgroundColor: BlueCurrentTheme.colors.success,
|
2020-05-24 11:17:26 +02:00
|
|
|
width: 120,
|
|
|
|
height: 120,
|
|
|
|
borderRadius: 60,
|
|
|
|
alignSelf: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
marginTop: 43,
|
|
|
|
marginBottom: 53,
|
|
|
|
},
|
|
|
|
iconWrap: {
|
|
|
|
minWidth: 30,
|
|
|
|
minHeight: 30,
|
|
|
|
alignItems: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
alignSelf: 'flex-end',
|
|
|
|
borderRadius: 15,
|
|
|
|
},
|
|
|
|
margin: {
|
|
|
|
marginBottom: -40,
|
|
|
|
},
|
|
|
|
icon: {
|
|
|
|
width: 25,
|
|
|
|
},
|
|
|
|
fee: {
|
|
|
|
marginTop: 15,
|
|
|
|
marginBottom: 13,
|
|
|
|
},
|
|
|
|
feeText: {
|
|
|
|
fontSize: 11,
|
|
|
|
fontWeight: '500',
|
|
|
|
marginBottom: 4,
|
|
|
|
color: '#00c49f',
|
|
|
|
alignSelf: 'center',
|
|
|
|
},
|
|
|
|
confirmations: {
|
|
|
|
borderRadius: 11,
|
2020-07-15 19:32:59 +02:00
|
|
|
backgroundColor: BlueCurrentTheme.colors.lightButton,
|
2020-05-24 11:17:26 +02:00
|
|
|
width: 109,
|
|
|
|
height: 21,
|
|
|
|
alignSelf: 'center',
|
|
|
|
alignItems: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
},
|
|
|
|
confirmationsText: {
|
|
|
|
color: '#9aa0aa',
|
|
|
|
fontSize: 11,
|
|
|
|
},
|
|
|
|
actions: {
|
|
|
|
alignSelf: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
},
|
|
|
|
cancel: {
|
|
|
|
marginVertical: 16,
|
|
|
|
},
|
|
|
|
cancelText: {
|
|
|
|
color: '#d0021b',
|
|
|
|
fontSize: 15,
|
|
|
|
fontWeight: '500',
|
|
|
|
textAlign: 'center',
|
|
|
|
},
|
|
|
|
details: {
|
|
|
|
flexDirection: 'row',
|
|
|
|
alignItems: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
marginBottom: 16,
|
|
|
|
},
|
|
|
|
detailsText: {
|
|
|
|
color: '#9aa0aa',
|
|
|
|
fontSize: 14,
|
|
|
|
marginRight: 8,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2019-08-10 08:57:55 +02:00
|
|
|
export default class TransactionsStatus extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2020-06-01 14:54:23 +02:00
|
|
|
const hash = props.route.params.hash;
|
2019-08-10 08:57:55 +02:00
|
|
|
let foundTx = {};
|
|
|
|
let from = [];
|
|
|
|
let to = [];
|
2020-06-01 14:54:23 +02:00
|
|
|
for (const tx of BlueApp.getTransactions()) {
|
2019-08-10 08:57:55 +02:00
|
|
|
if (tx.hash === hash) {
|
|
|
|
foundTx = tx;
|
2020-06-01 14:54:23 +02:00
|
|
|
for (const input of foundTx.inputs) {
|
2019-08-10 08:57:55 +02:00
|
|
|
from = from.concat(input.addresses);
|
|
|
|
}
|
2020-06-01 14:54:23 +02:00
|
|
|
for (const output of foundTx.outputs) {
|
2019-08-10 08:57:55 +02:00
|
|
|
if (output.addresses) to = to.concat(output.addresses);
|
|
|
|
if (output.scriptPubKey && output.scriptPubKey.addresses) to = to.concat(output.scriptPubKey.addresses);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let wallet = false;
|
2020-06-01 14:54:23 +02:00
|
|
|
for (const w of BlueApp.getWallets()) {
|
|
|
|
for (const t of w.getTransactions()) {
|
2019-08-10 08:57:55 +02:00
|
|
|
if (t.hash === hash) {
|
|
|
|
console.log('tx', hash, 'belongs to', w.getLabel());
|
|
|
|
wallet = w;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.state = {
|
|
|
|
isLoading: true,
|
|
|
|
tx: foundTx,
|
|
|
|
from,
|
|
|
|
to,
|
|
|
|
wallet,
|
|
|
|
isCPFPpossible: buttonStatus.unknown,
|
|
|
|
isRBFBumpFeePossible: buttonStatus.unknown,
|
|
|
|
isRBFCancelPossible: buttonStatus.unknown,
|
2020-03-30 15:50:19 +02:00
|
|
|
isHandOffUseEnabled: false,
|
2019-08-10 08:57:55 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
async componentDidMount() {
|
|
|
|
console.log('transactions/details - componentDidMount');
|
2020-03-30 15:50:19 +02:00
|
|
|
const isHandOffUseEnabled = await HandoffSettings.isHandoffUseEnabled();
|
2019-08-10 08:57:55 +02:00
|
|
|
this.setState({
|
|
|
|
isLoading: false,
|
2020-03-30 15:50:19 +02:00
|
|
|
isHandOffUseEnabled,
|
2019-08-10 08:57:55 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
await this.checkPossibilityOfCPFP();
|
|
|
|
await this.checkPossibilityOfRBFBumpFee();
|
|
|
|
await this.checkPossibilityOfRBFCancel();
|
|
|
|
} catch (_) {
|
|
|
|
this.setState({
|
|
|
|
isCPFPpossible: buttonStatus.notPossible,
|
|
|
|
isRBFBumpFeePossible: buttonStatus.notPossible,
|
|
|
|
isRBFCancelPossible: buttonStatus.notPossible,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async checkPossibilityOfCPFP() {
|
2020-03-11 20:16:51 +01:00
|
|
|
if (!this.state.wallet.allowRBF()) {
|
2019-08-10 08:57:55 +02:00
|
|
|
return this.setState({ isCPFPpossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
|
2020-06-01 14:54:23 +02:00
|
|
|
const tx = new HDSegwitBech32Transaction(null, this.state.tx.hash, this.state.wallet);
|
2019-08-10 08:57:55 +02:00
|
|
|
if ((await tx.isToUsTransaction()) && (await tx.getRemoteConfirmationsNum()) === 0) {
|
|
|
|
return this.setState({ isCPFPpossible: buttonStatus.possible });
|
|
|
|
} else {
|
|
|
|
return this.setState({ isCPFPpossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async checkPossibilityOfRBFBumpFee() {
|
2020-03-11 20:16:51 +01:00
|
|
|
if (!this.state.wallet.allowRBF()) {
|
2019-08-10 08:57:55 +02:00
|
|
|
return this.setState({ isRBFBumpFeePossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
|
2020-06-01 14:54:23 +02:00
|
|
|
const tx = new HDSegwitBech32Transaction(null, this.state.tx.hash, this.state.wallet);
|
2019-08-10 08:57:55 +02:00
|
|
|
if ((await tx.isOurTransaction()) && (await tx.getRemoteConfirmationsNum()) === 0 && (await tx.isSequenceReplaceable())) {
|
|
|
|
return this.setState({ isRBFBumpFeePossible: buttonStatus.possible });
|
|
|
|
} else {
|
|
|
|
return this.setState({ isRBFBumpFeePossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async checkPossibilityOfRBFCancel() {
|
2020-03-11 20:16:51 +01:00
|
|
|
if (!this.state.wallet.allowRBF()) {
|
2019-08-10 08:57:55 +02:00
|
|
|
return this.setState({ isRBFCancelPossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
|
2020-06-01 14:54:23 +02:00
|
|
|
const tx = new HDSegwitBech32Transaction(null, this.state.tx.hash, this.state.wallet);
|
2019-08-10 08:57:55 +02:00
|
|
|
if (
|
|
|
|
(await tx.isOurTransaction()) &&
|
|
|
|
(await tx.getRemoteConfirmationsNum()) === 0 &&
|
|
|
|
(await tx.isSequenceReplaceable()) &&
|
|
|
|
(await tx.canCancelTx())
|
|
|
|
) {
|
|
|
|
return this.setState({ isRBFCancelPossible: buttonStatus.possible });
|
|
|
|
} else {
|
|
|
|
return this.setState({ isRBFCancelPossible: buttonStatus.notPossible });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
2020-06-01 14:54:23 +02:00
|
|
|
if (this.state.isLoading || !('tx' in this.state)) {
|
2019-08-10 08:57:55 +02:00
|
|
|
return <BlueLoading />;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
2020-05-24 11:17:26 +02:00
|
|
|
<SafeBlueArea forceInset={{ horizontal: 'always' }} style={styles.root}>
|
2020-03-30 15:50:19 +02:00
|
|
|
{this.state.isHandOffUseEnabled && (
|
|
|
|
<Handoff
|
|
|
|
title={`Bitcoin Transaction ${this.state.tx.hash}`}
|
|
|
|
type="io.bluewallet.bluewallet"
|
|
|
|
url={`https://blockstream.info/tx/${this.state.tx.hash}`}
|
|
|
|
/>
|
|
|
|
)}
|
2020-07-15 19:32:59 +02:00
|
|
|
<StatusBar barStyle="default" />
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.container}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueCard>
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.center}>
|
|
|
|
<Text style={styles.value}>
|
2019-08-10 08:57:55 +02:00
|
|
|
{loc.formatBalanceWithoutSuffix(this.state.tx.value, this.state.wallet.preferredBalanceUnit, true)}{' '}
|
|
|
|
{this.state.wallet.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && (
|
2020-05-24 11:17:26 +02:00
|
|
|
<Text style={styles.valueUnit}>{this.state.wallet.preferredBalanceUnit}</Text>
|
2019-08-10 08:57:55 +02:00
|
|
|
)}
|
|
|
|
</Text>
|
|
|
|
</View>
|
|
|
|
|
|
|
|
{(() => {
|
|
|
|
if (BlueApp.tx_metadata[this.state.tx.hash]) {
|
2020-06-01 14:54:23 +02:00
|
|
|
if (BlueApp.tx_metadata[this.state.tx.hash].memo) {
|
2019-08-10 08:57:55 +02:00
|
|
|
return (
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.memo}>
|
2020-06-01 14:54:23 +02:00
|
|
|
<Text style={styles.memoText}>{BlueApp.tx_metadata[this.state.tx.hash].memo}</Text>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueSpacing20 />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.iconRoot}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<View>
|
2020-07-15 19:32:59 +02:00
|
|
|
<Icon name="check" size={50} type="font-awesome" color={BlueCurrentTheme.colors.successCheck} />
|
2019-08-10 08:57:55 +02:00
|
|
|
</View>
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={[styles.iconWrap, styles.margin]}>
|
2019-08-10 08:57:55 +02:00
|
|
|
{(() => {
|
|
|
|
if (!this.state.tx.confirmations) {
|
|
|
|
return (
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.icon}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueTransactionPendingIcon />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
} else if (this.state.tx.value < 0) {
|
|
|
|
return (
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.icon}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueTransactionOutgoingIcon />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return (
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.icon}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueTransactionIncomingIcon />
|
|
|
|
</View>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
|
2020-06-01 14:54:23 +02:00
|
|
|
{'fee' in this.state.tx && (
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.fee}>
|
|
|
|
<BlueText style={styles.feeText}>
|
2019-08-10 08:57:55 +02:00
|
|
|
{loc.send.create.fee.toLowerCase()}{' '}
|
|
|
|
{loc.formatBalanceWithoutSuffix(this.state.tx.fee, this.state.wallet.preferredBalanceUnit, true)}{' '}
|
|
|
|
{this.state.wallet.preferredBalanceUnit !== BitcoinUnit.LOCAL_CURRENCY && this.state.wallet.preferredBalanceUnit}
|
|
|
|
</BlueText>
|
|
|
|
</View>
|
|
|
|
)}
|
|
|
|
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.confirmations}>
|
|
|
|
<Text style={styles.confirmationsText}>
|
2019-08-10 08:57:55 +02:00
|
|
|
{this.state.tx.confirmations > 6 ? '6+' : this.state.tx.confirmations} confirmations
|
|
|
|
</Text>
|
|
|
|
</View>
|
|
|
|
</BlueCard>
|
|
|
|
|
2020-05-24 11:17:26 +02:00
|
|
|
<View style={styles.actions}>
|
2019-08-10 08:57:55 +02:00
|
|
|
{(() => {
|
|
|
|
if (this.state.isCPFPpossible === buttonStatus.unknown) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2019-08-10 08:57:55 +02:00
|
|
|
<ActivityIndicator />
|
|
|
|
<BlueSpacing20 />
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
} else if (this.state.isCPFPpossible === buttonStatus.possible) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueButton
|
|
|
|
onPress={() =>
|
|
|
|
this.props.navigation.navigate('CPFP', {
|
|
|
|
txid: this.state.tx.hash,
|
|
|
|
wallet: this.state.wallet,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
title="Bump Fee"
|
|
|
|
/>
|
|
|
|
<BlueSpacing20 />
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
|
|
|
|
{(() => {
|
|
|
|
if (this.state.isRBFBumpFeePossible === buttonStatus.unknown) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2019-08-10 08:57:55 +02:00
|
|
|
<ActivityIndicator />
|
|
|
|
<BlueSpacing20 />
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
} else if (this.state.isRBFBumpFeePossible === buttonStatus.possible) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2019-08-10 08:57:55 +02:00
|
|
|
<BlueButton
|
|
|
|
onPress={() =>
|
|
|
|
this.props.navigation.navigate('RBFBumpFee', {
|
|
|
|
txid: this.state.tx.hash,
|
|
|
|
wallet: this.state.wallet,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
title="Bump Fee"
|
|
|
|
/>
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
2019-08-13 17:33:15 +02:00
|
|
|
{(() => {
|
2019-08-10 08:57:55 +02:00
|
|
|
if (this.state.isRBFCancelPossible === buttonStatus.unknown) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2019-08-10 08:57:55 +02:00
|
|
|
<ActivityIndicator />
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
} else if (this.state.isRBFCancelPossible === buttonStatus.possible) {
|
|
|
|
return (
|
2020-06-01 14:54:23 +02:00
|
|
|
<>
|
2020-05-24 11:17:26 +02:00
|
|
|
<TouchableOpacity style={styles.cancel}>
|
2019-08-10 08:57:55 +02:00
|
|
|
<Text
|
|
|
|
onPress={() =>
|
|
|
|
this.props.navigation.navigate('RBFCancel', {
|
|
|
|
txid: this.state.tx.hash,
|
|
|
|
wallet: this.state.wallet,
|
|
|
|
})
|
|
|
|
}
|
2020-05-24 11:17:26 +02:00
|
|
|
style={styles.cancelText}
|
2019-08-10 08:57:55 +02:00
|
|
|
>
|
2020-06-01 14:54:23 +02:00
|
|
|
Cancel Transaction
|
2019-08-10 08:57:55 +02:00
|
|
|
</Text>
|
|
|
|
</TouchableOpacity>
|
2020-06-01 14:54:23 +02:00
|
|
|
</>
|
2019-08-10 08:57:55 +02:00
|
|
|
);
|
|
|
|
}
|
2019-08-13 17:33:15 +02:00
|
|
|
})()}
|
2019-08-10 08:57:55 +02:00
|
|
|
|
|
|
|
<TouchableOpacity
|
2020-05-24 11:17:26 +02:00
|
|
|
style={styles.details}
|
2019-08-10 08:57:55 +02:00
|
|
|
onPress={() => this.props.navigation.navigate('TransactionDetails', { hash: this.state.tx.hash })}
|
|
|
|
>
|
2020-05-24 11:17:26 +02:00
|
|
|
<Text style={styles.detailsText}>{loc.send.create.details.toLowerCase()}</Text>
|
2019-08-10 08:57:55 +02:00
|
|
|
<Icon name="angle-right" size={18} type="font-awesome" color="#9aa0aa" />
|
|
|
|
</TouchableOpacity>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
</SafeBlueArea>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TransactionsStatus.propTypes = {
|
|
|
|
navigation: PropTypes.shape({
|
|
|
|
goBack: PropTypes.func,
|
|
|
|
navigate: PropTypes.func,
|
|
|
|
state: PropTypes.shape({
|
|
|
|
params: PropTypes.shape({
|
|
|
|
hash: PropTypes.string,
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
}),
|
2020-05-27 13:12:17 +02:00
|
|
|
route: PropTypes.shape({
|
|
|
|
params: PropTypes.object,
|
|
|
|
}),
|
2019-08-10 08:57:55 +02:00
|
|
|
};
|
2020-07-15 19:32:59 +02:00
|
|
|
|
|
|
|
TransactionsStatus.navigationOptions = () => ({
|
|
|
|
...BlueNavigationStyle(),
|
|
|
|
title: '',
|
|
|
|
headerStyle: {
|
|
|
|
...BlueNavigationStyle().headerStyle,
|
|
|
|
backgroundColor: BlueCurrentTheme.colors.customHeader,
|
|
|
|
},
|
|
|
|
});
|