BlueWallet/screen/wallets/addresses.js

160 lines
4 KiB
JavaScript
Raw Normal View History

2021-02-04 04:05:37 -03:00
import React, { useCallback, useState, useContext } from 'react';
2021-04-16 15:14:06 +02:00
import { ActivityIndicator, FlatList, StyleSheet, View, StatusBar } from 'react-native';
2021-04-17 13:43:39 -04:00
import { useFocusEffect, useNavigation, useRoute, useTheme } from '@react-navigation/native';
2021-02-04 04:05:37 -03:00
import Privacy from '../../blue_modules/Privacy';
import { BlueStorageContext } from '../../blue_modules/storage-context';
import loc from '../../loc';
import navigationStyle from '../../components/navigationStyle';
import { AddressItem } from '../../components/addresses/AddressItem';
import { WatchOnlyWallet } from '../../class';
2021-04-12 11:06:30 -03:00
export const totalBalance = ({ c, u } = { c: 0, u: 0 }) => c + u;
export const getAddress = (wallet, index, isInternal) => {
2021-02-04 04:05:37 -03:00
let address;
let balance = 0;
if (isInternal) {
address = wallet._getInternalAddressByIndex(index);
2021-04-12 11:06:30 -03:00
balance = totalBalance(wallet._balances_by_internal_index[index]);
2021-02-04 04:05:37 -03:00
} else {
address = wallet._getExternalAddressByIndex(index);
2021-04-12 11:06:30 -03:00
balance = totalBalance(wallet._balances_by_external_index[index]);
2021-02-04 04:05:37 -03:00
}
return {
key: address,
index,
address,
isInternal,
balance,
transactions: 0,
};
};
2021-04-12 11:06:30 -03:00
export const sortByIndexAndType = (a, b) => {
2021-02-04 04:05:37 -03:00
if (a.isInternal > b.isInternal) return 1;
if (a.isInternal < b.isInternal) return -1;
if (a.index > b.index) return 1;
if (a.index < b.index) return -1;
};
const WalletAddresses = () => {
const [showAddresses, setShowAddresses] = useState(false);
const [addresses, setAddresses] = useState([]);
const { wallets } = useContext(BlueStorageContext);
2021-04-16 10:24:48 -04:00
const { walletID } = useRoute().params;
2021-02-04 04:05:37 -03:00
const wallet = wallets.find(w => w.getID() === walletID);
const balanceUnit = wallet.getPreferredBalanceUnit();
const walletInstance = wallet.type === WatchOnlyWallet.type ? wallet._hdWalletInstance : wallet;
2021-04-14 14:24:46 -03:00
const { colors } = useTheme();
2021-04-17 13:43:39 -04:00
const { navigate } = useNavigation();
2021-04-14 14:24:46 -03:00
const stylesHook = StyleSheet.create({
root: {
backgroundColor: colors.elevated,
},
});
2021-02-04 04:05:37 -03:00
const getAddresses = () => {
const addressList = [];
for (let index = 0; index < walletInstance.next_free_change_address_index + walletInstance.gap_limit; index++) {
const address = getAddress(walletInstance, index, true);
addressList.push(address);
}
for (let index = 0; index < walletInstance.next_free_address_index + walletInstance.gap_limit; index++) {
const address = getAddress(walletInstance, index, false);
addressList.push(address);
}
setAddresses(addressList.sort(sortByIndexAndType));
setShowAddresses(true);
};
useFocusEffect(
useCallback(() => {
Privacy.enableBlur();
getAddresses();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []),
);
2021-04-17 13:43:39 -04:00
const navigateToReceive = item => {
navigate('ReceiveDetailsRoot', {
screen: 'ReceiveDetails',
params: {
walletID,
address: item.item.address,
},
});
};
2021-02-04 04:05:37 -03:00
const render = () => {
if (showAddresses) {
2021-04-16 15:14:06 +02:00
return (
<View style={stylesHook.root}>
<StatusBar barStyle="default" />
2021-04-17 13:43:39 -04:00
<FlatList
style={stylesHook.root}
data={addresses}
renderItem={item => <AddressItem {...item} balanceUnit={balanceUnit} onPress={() => navigateToReceive(item)} />}
/>
2021-04-16 15:14:06 +02:00
</View>
);
2021-02-04 04:05:37 -03:00
}
return (
2021-04-14 14:24:46 -03:00
<View style={[stylesHook.root, styles.loading]}>
2021-02-04 04:05:37 -03:00
<ActivityIndicator />
</View>
);
};
return render();
};
WalletAddresses.navigationOptions = navigationStyle({
title: loc.addresses.addresses_title,
});
export default WalletAddresses;
2021-04-16 15:14:06 +02:00
const styles = StyleSheet.create({
root: {
flex: 1,
},
loading: {
flex: 1,
justifyContent: 'center',
},
loadMoreButton: {
borderRadius: 9,
minHeight: 49,
paddingHorizontal: 8,
justifyContent: 'center',
alignItems: 'center',
flexDirection: 'row',
alignSelf: 'auto',
flexGrow: 1,
marginHorizontal: 16,
},
loadMoreText: {
fontSize: 16,
},
});