BlueWallet/screen/wallets/details.js

700 lines
25 KiB
JavaScript
Raw Normal View History

import { useRoute } from '@react-navigation/native';
2024-05-18 00:34:39 +02:00
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2019-09-27 16:49:56 +02:00
import {
ActivityIndicator,
2019-09-27 16:49:56 +02:00
Alert,
I18nManager,
InteractionManager,
2019-09-27 16:49:56 +02:00
Keyboard,
KeyboardAvoidingView,
Platform,
2021-08-03 03:27:54 +02:00
ScrollView,
StyleSheet,
Switch,
Text,
TextInput,
TouchableOpacity,
TouchableWithoutFeedback,
View,
2019-09-27 16:49:56 +02:00
} from 'react-native';
import { BlueCard, BlueLoading, BlueSpacing10, BlueSpacing20, BlueText } from '../../BlueComponents';
import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback';
import Notifications from '../../blue_modules/notifications';
2024-05-18 00:34:39 +02:00
import { useStorage } from '../../blue_modules/storage-context';
import {
HDAezeedWallet,
HDSegwitBech32Wallet,
LegacyWallet,
LightningLdkWallet,
MultisigHDWallet,
SegwitBech32Wallet,
SegwitP2SHWallet,
WatchOnlyWallet,
} from '../../class';
2021-02-04 08:05:37 +01:00
import { AbstractHDElectrumWallet } from '../../class/wallets/abstract-hd-electrum-wallet';
import { LightningCustodianWallet } from '../../class/wallets/lightning-custodian-wallet';
import presentAlert from '../../components/Alert';
import Button from '../../components/Button';
import ListItem from '../../components/ListItem';
import { SecondButton } from '../../components/SecondButton';
import { useTheme } from '../../components/themes';
import prompt from '../../helpers/prompt';
2024-03-24 15:52:10 +01:00
import { useExtendedNavigation } from '../../hooks/useExtendedNavigation';
import loc, { formatBalanceWithoutSuffix } from '../../loc';
import { BitcoinUnit, Chain } from '../../models/bitcoinUnits';
import SaveFileButton from '../../components/SaveFileButton';
2024-04-18 03:05:48 +02:00
import { useSettings } from '../../components/Context/SettingsContext';
2024-05-11 00:47:22 +02:00
import HeaderRightButton from '../../components/HeaderRightButton';
2024-05-08 20:08:52 +02:00
import { writeFileAndExport } from '../../blue_modules/fs';
2024-05-18 00:34:39 +02:00
import { useBiometrics } from '../../hooks/useBiometrics';
2018-01-30 23:42:38 +01:00
const styles = StyleSheet.create({
scrollViewContent: {
flexGrow: 1,
},
address: {
alignItems: 'center',
flex: 1,
},
textLabel1: {
fontWeight: '500',
fontSize: 14,
marginVertical: 12,
2021-05-22 05:36:34 +02:00
writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr',
},
textLabel2: {
fontWeight: '500',
fontSize: 14,
marginVertical: 16,
2021-05-22 05:36:34 +02:00
writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr',
},
textValue: {
fontWeight: '500',
fontSize: 14,
},
input: {
flexDirection: 'row',
borderWidth: 1,
borderBottomWidth: 0.5,
minHeight: 44,
height: 44,
alignItems: 'center',
borderRadius: 4,
},
inputText: {
flex: 1,
marginHorizontal: 8,
minHeight: 33,
2020-06-09 14:23:21 +02:00
color: '#81868e',
2021-05-22 05:36:34 +02:00
writingDirection: I18nManager.isRTL ? 'rtl' : 'ltr',
},
hardware: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
delete: {
fontSize: 15,
fontWeight: '500',
2020-10-29 10:26:39 +01:00
textAlign: 'center',
},
row: {
flexDirection: 'row',
},
marginRight16: {
marginRight: 16,
},
});
2020-08-09 03:04:11 +02:00
const WalletDetails = () => {
2024-05-18 00:34:39 +02:00
const { saveToDisk, wallets, deleteWallet, setSelectedWalletID, txMetadata } = useStorage();
const { isBiometricUseCapableAndEnabled, unlockWithBiometrics } = useBiometrics();
const { walletID } = useRoute().params;
const [isLoading, setIsLoading] = useState(false);
const [backdoorPressed, setBackdoorPressed] = useState(0);
const [backdoorBip47Pressed, setBackdoorBip47Pressed] = useState(0);
const wallet = useRef(wallets.find(w => w.getID() === walletID)).current;
2020-08-09 03:04:11 +02:00
const [walletName, setWalletName] = useState(wallet.getLabel());
const [useWithHardwareWallet, setUseWithHardwareWallet] = useState(wallet.useWithHardwareWalletEnabled());
2024-04-18 03:05:48 +02:00
const { isAdvancedModeEnabled } = useSettings();
2022-12-12 03:34:50 +01:00
const [isBIP47Enabled, setIsBIP47Enabled] = useState(wallet.isBIP47Enabled());
2020-08-09 03:04:11 +02:00
const [hideTransactionsInWalletsList, setHideTransactionsInWalletsList] = useState(!wallet.getHideTransactionsInWalletsList());
2024-03-24 15:52:10 +01:00
const { goBack, setOptions, popToTop, navigate } = useExtendedNavigation();
2020-08-09 03:04:11 +02:00
const { colors } = useTheme();
const [masterFingerprint, setMasterFingerprint] = useState();
2022-10-12 18:39:48 +02:00
const walletTransactionsLength = useMemo(() => wallet.getTransactions().length, [wallet]);
const derivationPath = useMemo(() => {
try {
const path = wallet.getDerivationPath();
return path.length > 0 ? path : null;
} catch (e) {
return null;
}
}, [wallet]);
2021-09-09 13:00:11 +02:00
const [lightningWalletInfo, setLightningWalletInfo] = useState({});
const [isToolTipMenuVisible, setIsToolTipMenuVisible] = useState(false);
const onMenuWillShow = () => setIsToolTipMenuVisible(true);
const onMenuWillHide = () => setIsToolTipMenuVisible(false);
2021-09-09 13:00:11 +02:00
useEffect(() => {
2024-04-18 03:05:48 +02:00
if (isAdvancedModeEnabled && wallet.allowMasterFingerprint()) {
InteractionManager.runAfterInteractions(() => {
setMasterFingerprint(wallet.getMasterFingerprintHex());
});
}
2024-04-18 03:05:48 +02:00
}, [isAdvancedModeEnabled, wallet]);
2020-08-09 03:04:11 +02:00
const stylesHook = StyleSheet.create({
textLabel1: {
color: colors.feeText,
},
textLabel2: {
color: colors.feeText,
},
textValue: {
color: colors.outputValue,
},
input: {
borderColor: colors.formBorder,
borderBottomColor: colors.formBorder,
2018-01-30 23:42:38 +01:00
2020-08-09 03:04:11 +02:00
backgroundColor: colors.inputBackgroundColor,
},
delete: {
color: isToolTipMenuVisible ? colors.buttonDisabledTextColor : '#d0021b',
},
2020-08-09 03:04:11 +02:00
});
2021-09-09 13:00:11 +02:00
useEffect(() => {
if (wallet.type === LightningLdkWallet.type) {
wallet.getInfo().then(setLightningWalletInfo);
}
}, [wallet]);
2018-01-30 23:42:38 +01:00
2024-05-05 02:14:46 +02:00
const handleSave = useCallback(() => {
setIsLoading(true);
2020-08-09 03:04:11 +02:00
if (walletName.trim().length > 0) {
2021-03-02 14:38:02 +01:00
wallet.setLabel(walletName.trim());
if (wallet.type === WatchOnlyWallet.type && wallet.isHd()) {
2020-08-09 03:04:11 +02:00
wallet.setUseWithHardwareWalletEnabled(useWithHardwareWallet);
}
2020-08-09 03:04:11 +02:00
wallet.setHideTransactionsInWalletsList(!hideTransactionsInWalletsList);
if (wallet.allowBIP47()) {
wallet.switchBIP47(isBIP47Enabled);
}
2020-08-09 03:04:11 +02:00
}
saveToDisk()
.then(() => {
presentAlert({ message: loc.wallets.details_wallet_updated });
goBack();
})
.catch(error => {
console.log(error.message);
setIsLoading(false);
});
2024-05-05 02:14:46 +02:00
}, [walletName, saveToDisk, wallet, hideTransactionsInWalletsList, useWithHardwareWallet, isBIP47Enabled, goBack]);
2024-05-05 11:15:24 +02:00
const SaveButton = useMemo(
2024-05-05 07:03:39 +02:00
() => <HeaderRightButton title={loc.wallets.details_save} onPress={handleSave} disabled={isLoading} testID="Save" />,
[isLoading, handleSave],
2024-05-05 02:14:46 +02:00
);
2018-01-30 23:42:38 +01:00
2024-05-05 02:14:46 +02:00
useEffect(() => {
setOptions({
2024-05-05 11:15:24 +02:00
headerRight: () => SaveButton,
});
2024-05-05 11:15:24 +02:00
}, [SaveButton, setOptions]);
2020-08-09 03:04:11 +02:00
useEffect(() => {
if (wallets.some(w => w.getID() === walletID)) {
setSelectedWalletID(walletID);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [walletID]);
2021-02-25 01:52:55 +01:00
const navigateToOverviewAndDeleteWallet = () => {
setIsLoading(true);
let externalAddresses = [];
try {
externalAddresses = wallet.getAllExternalAddresses();
} catch (_) {}
Notifications.unsubscribe(externalAddresses, [], []);
2021-02-25 01:52:55 +01:00
popToTop();
deleteWallet(wallet);
2021-09-07 21:30:07 +02:00
saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
2021-02-25 01:52:55 +01:00
};
2020-08-09 03:04:11 +02:00
const presentWalletHasBalanceAlert = useCallback(async () => {
triggerHapticFeedback(HapticFeedbackTypes.NotificationWarning);
try {
const walletBalanceConfirmation = await prompt(
loc.wallets.details_delete_wallet,
loc.formatString(loc.wallets.details_del_wb_q, { balance: wallet.getBalance() }),
true,
'plain-text',
true,
2021-10-16 16:37:51 +02:00
loc.wallets.details_delete,
);
if (Number(walletBalanceConfirmation) === wallet.getBalance()) {
2021-02-25 01:52:55 +01:00
navigateToOverviewAndDeleteWallet();
} else {
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
setIsLoading(false);
presentAlert({ message: loc.wallets.details_del_wb_err });
}
} catch (_) {}
// eslint-disable-next-line react-hooks/exhaustive-deps
2021-02-25 01:52:55 +01:00
}, []);
2020-08-09 03:04:11 +02:00
const navigateToWalletExport = () => {
navigate('WalletExportRoot', {
screen: 'WalletExport',
params: {
walletID: wallet.getID(),
},
});
};
2020-10-05 23:25:14 +02:00
const navigateToMultisigCoordinationSetup = () => {
navigate('ExportMultisigCoordinationSetupRoot', {
screen: 'ExportMultisigCoordinationSetup',
params: {
walletID: wallet.getID(),
},
2020-10-05 23:25:14 +02:00
});
};
const navigateToViewEditCosigners = () => {
2020-12-12 01:27:43 +01:00
navigate('ViewEditMultisigCosignersRoot', {
screen: 'ViewEditMultisigCosigners',
params: {
walletID,
2020-12-12 01:27:43 +01:00
},
});
};
2020-08-09 03:04:11 +02:00
const navigateToXPub = () =>
navigate('WalletXpubRoot', {
screen: 'WalletXpub',
params: {
2021-06-17 23:24:00 +02:00
walletID,
},
2020-08-09 03:04:11 +02:00
});
2021-03-23 13:16:32 +01:00
const navigateToSignVerify = () =>
navigate('SignVerifyRoot', {
screen: 'SignVerify',
params: {
walletID: wallet.getID(),
address: wallet.getAllExternalAddresses()[0], // works for both single address and HD wallets
},
});
2021-09-09 13:00:11 +02:00
const navigateToLdkViewLogs = () => {
navigate('LdkViewLogs', {
walletID,
});
};
2021-02-04 08:05:37 +01:00
const navigateToAddresses = () =>
2021-04-16 16:05:25 +02:00
navigate('WalletAddresses', {
2021-04-16 16:24:48 +02:00
walletID: wallet.getID(),
2021-02-04 08:05:37 +01:00
});
2023-03-15 21:42:25 +01:00
const navigateToPaymentCodes = () =>
navigate('PaymentCodeRoot', {
screen: 'PaymentCodesList',
params: {
walletID: wallet.getID(),
},
});
const exportInternals = async () => {
if (backdoorPressed < 10) return setBackdoorPressed(backdoorPressed + 1);
setBackdoorPressed(0);
if (wallet.type !== HDSegwitBech32Wallet.type) return;
const fileName = 'wallet-externals.json';
const contents = JSON.stringify(
{
_balances_by_external_index: wallet._balances_by_external_index,
_balances_by_internal_index: wallet._balances_by_internal_index,
_txs_by_external_index: wallet._txs_by_external_index,
_txs_by_internal_index: wallet._txs_by_internal_index,
_utxo: wallet._utxo,
next_free_address_index: wallet.next_free_address_index,
next_free_change_address_index: wallet.next_free_change_address_index,
internal_addresses_cache: wallet.internal_addresses_cache,
external_addresses_cache: wallet.external_addresses_cache,
_xpub: wallet._xpub,
gap_limit: wallet.gap_limit,
label: wallet.label,
_lastTxFetch: wallet._lastTxFetch,
_lastBalanceFetch: wallet._lastBalanceFetch,
},
null,
2,
);
2024-05-08 20:08:52 +02:00
await writeFileAndExport(fileName, contents, false);
};
const purgeTransactions = async () => {
if (backdoorPressed < 10) return setBackdoorPressed(backdoorPressed + 1);
setBackdoorPressed(0);
const msg = 'Transactions purged. Pls go to main screen and back to rerender screen';
if (wallet.type === HDSegwitBech32Wallet.type) {
wallet._txs_by_external_index = {};
wallet._txs_by_internal_index = {};
presentAlert({ message: msg });
}
if (wallet._hdWalletInstance) {
wallet._hdWalletInstance._txs_by_external_index = {};
wallet._hdWalletInstance._txs_by_internal_index = {};
presentAlert({ message: msg });
}
};
2020-08-09 03:04:11 +02:00
const walletNameTextInputOnBlur = () => {
if (walletName.trim().length === 0) {
const walletLabel = wallet.getLabel();
setWalletName(walletLabel);
2018-01-30 23:42:38 +01:00
}
2020-08-09 03:04:11 +02:00
};
2020-07-20 15:38:46 +02:00
2024-03-29 20:07:14 +01:00
const exportHistoryContent = useCallback(() => {
const headers = [loc.transactions.date, loc.transactions.txid, `${loc.send.create_amount} (${BitcoinUnit.BTC})`, loc.send.create_memo];
if (wallet.chain === Chain.OFFCHAIN) {
2024-03-29 20:07:14 +01:00
headers.push(loc.lnd.payment);
}
2024-03-29 20:07:14 +01:00
const rows = [headers.join(',')];
2022-10-12 18:39:48 +02:00
const transactions = wallet.getTransactions();
2024-03-29 20:07:14 +01:00
transactions.forEach(transaction => {
2022-10-12 18:39:48 +02:00
const value = formatBalanceWithoutSuffix(transaction.value, BitcoinUnit.BTC, true);
let hash = transaction.hash;
let memo = txMetadata[transaction.hash]?.memo?.trim() ?? '';
let status;
if (wallet.chain === Chain.OFFCHAIN) {
hash = transaction.payment_hash;
memo = transaction.description;
status = transaction.ispaid ? loc._.success : loc.lnd.expired;
2023-04-28 12:29:15 +02:00
if (hash?.type === 'Buffer' && hash?.data) {
2024-03-29 20:07:14 +01:00
hash = Buffer.from(hash.data).toString('hex');
2023-04-28 12:29:15 +02:00
}
}
const data = [new Date(transaction.received).toString(), hash, value, memo];
if (wallet.chain === Chain.OFFCHAIN) {
data.push(status);
}
2024-03-29 20:07:14 +01:00
rows.push(data.join(','));
});
return rows.join('\n');
}, [wallet, txMetadata]);
2022-10-12 18:39:48 +02:00
2020-08-09 03:04:11 +02:00
const handleDeleteButtonTapped = () => {
triggerHapticFeedback(HapticFeedbackTypes.NotificationWarning);
2020-08-09 03:04:11 +02:00
Alert.alert(
loc.wallets.details_delete_wallet,
loc.wallets.details_are_you_sure,
[
{
text: loc.wallets.details_yes_delete,
onPress: async () => {
2024-05-18 00:34:39 +02:00
const isBiometricsEnabled = await isBiometricUseCapableAndEnabled();
2020-08-09 03:04:11 +02:00
if (isBiometricsEnabled) {
2024-05-18 00:34:39 +02:00
if (!(await unlockWithBiometrics())) {
2020-08-09 03:04:11 +02:00
return;
}
}
if (wallet.getBalance() > 0 && wallet.allowSend()) {
presentWalletHasBalanceAlert();
} else {
2021-02-25 01:52:55 +01:00
navigateToOverviewAndDeleteWallet();
2020-08-09 03:04:11 +02:00
}
},
style: 'destructive',
},
{ text: loc.wallets.details_no_cancel, onPress: () => {}, style: 'cancel' },
],
{ cancelable: false },
);
};
2024-03-29 19:57:46 +01:00
const fileName = useMemo(() => {
const label = wallet.getLabel().replace(' ', '-');
return `${label}-history.csv`;
}, [wallet]);
return (
<ScrollView
contentInsetAdjustmentBehavior="automatic"
centerContent={isLoading}
contentContainerStyle={styles.scrollViewContent}
testID="WalletDetailsScroll"
>
{isLoading ? (
<BlueLoading />
) : (
<TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
<View>
<BlueCard style={styles.address}>
{(() => {
if (
[LegacyWallet.type, SegwitBech32Wallet.type, SegwitP2SHWallet.type].includes(wallet.type) ||
(wallet.type === WatchOnlyWallet.type && !wallet.isHd())
) {
return (
<>
<Text style={[styles.textLabel1, stylesHook.textLabel1]}>{loc.wallets.details_address.toLowerCase()}</Text>
<Text style={[styles.textValue, stylesHook.textValue]}>
{(() => {
// gracefully handling faulty wallets, so at least user has an option to delete the wallet
try {
return wallet.getAddress();
} catch (error) {
return error.message;
}
})()}
</Text>
</>
);
}
})()}
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.add_wallet_name.toLowerCase()}</Text>
<KeyboardAvoidingView enabled={!Platform.isPad} behavior={Platform.OS === 'ios' ? 'position' : null}>
<View style={[styles.input, stylesHook.input]}>
<TextInput
value={walletName}
onChangeText={setWalletName}
onBlur={walletNameTextInputOnBlur}
numberOfLines={1}
placeholderTextColor="#81868e"
style={styles.inputText}
editable={!isLoading}
underlineColorAndroid="transparent"
testID="WalletNameInput"
/>
</View>
</KeyboardAvoidingView>
2020-08-09 03:04:11 +02:00
<BlueSpacing20 />
<Text style={[styles.textLabel1, stylesHook.textLabel1]}>{loc.wallets.details_type.toLowerCase()}</Text>
<Text style={[styles.textValue, stylesHook.textValue]}>{wallet.typeReadable}</Text>
2020-01-02 23:06:51 +01:00
2021-09-09 13:00:11 +02:00
{wallet.type === LightningLdkWallet.type && (
<>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.identity_pubkey}</Text>
{lightningWalletInfo?.identityPubkey ? (
<>
<BlueText>{lightningWalletInfo.identityPubkey}</BlueText>
</>
) : (
<ActivityIndicator />
)}
</>
)}
2020-10-05 23:25:14 +02:00
{wallet.type === MultisigHDWallet.type && (
<>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.details_multisig_type}</Text>
<BlueText>
{`${wallet.getM()} / ${wallet.getN()} (${
wallet.isNativeSegwit() ? 'native segwit' : wallet.isWrappedSegwit() ? 'wrapped segwit' : 'legacy'
})`}
</BlueText>
2020-10-05 23:25:14 +02:00
</>
)}
{wallet.type === MultisigHDWallet.type && (
<>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.multisig.how_many_signatures_can_bluewallet_make}</Text>
<BlueText>{wallet.howManySignaturesCanWeMake()}</BlueText>
</>
)}
{wallet.type === LightningCustodianWallet.type && (
2020-08-09 03:04:11 +02:00
<>
<Text style={[styles.textLabel1, stylesHook.textLabel1]}>{loc.wallets.details_connected_to.toLowerCase()}</Text>
<BlueText>{wallet.getBaseURI()}</BlueText>
2020-08-09 03:04:11 +02:00
</>
)}
{wallet.type === HDAezeedWallet.type && (
2021-03-23 13:16:32 +01:00
<>
<Text style={[styles.textLabel1, stylesHook.textLabel1]}>{loc.wallets.identity_pubkey.toLowerCase()}</Text>
<BlueText>{wallet.getIdentityPubkey()}</BlueText>
2021-03-23 13:16:32 +01:00
</>
)}
2021-09-09 13:00:11 +02:00
<BlueSpacing20 />
<>
<Text onPress={exportInternals} style={[styles.textLabel2, stylesHook.textLabel2]}>
{loc.transactions.list_title.toLowerCase()}
</Text>
<View style={styles.hardware}>
<BlueText onPress={() => setBackdoorBip47Pressed(prevState => prevState + 1)}>{loc.wallets.details_display}</BlueText>
<Switch
disabled={isToolTipMenuVisible}
value={hideTransactionsInWalletsList}
onValueChange={setHideTransactionsInWalletsList}
/>
</View>
</>
<>
<Text onPress={purgeTransactions} style={[styles.textLabel2, stylesHook.textLabel2]}>
{loc.transactions.transactions_count.toLowerCase()}
</Text>
<BlueText>{wallet.getTransactions().length}</BlueText>
</>
{backdoorBip47Pressed >= 10 && wallet.allowBIP47() ? (
2023-03-15 21:42:25 +01:00
<>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.bip47.payment_code}</Text>
<View style={styles.hardware}>
<BlueText>{loc.bip47.purpose}</BlueText>
<Switch value={isBIP47Enabled} onValueChange={setIsBIP47Enabled} />
</View>
</>
) : null}
2022-12-07 01:56:11 +01:00
<View>
{wallet.type === WatchOnlyWallet.type && wallet.isHd() && (
<>
<BlueSpacing10 />
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.details_advanced.toLowerCase()}</Text>
<View style={styles.hardware}>
<BlueText>{loc.wallets.details_use_with_hardware_wallet}</BlueText>
<Switch value={useWithHardwareWallet} onValueChange={setUseWithHardwareWallet} />
</View>
</>
)}
2024-04-18 03:05:48 +02:00
{isAdvancedModeEnabled && (
<View style={styles.row}>
{wallet.allowMasterFingerprint() && (
<View style={styles.marginRight16}>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>
{loc.wallets.details_master_fingerprint.toLowerCase()}
</Text>
<BlueText>{masterFingerprint ?? <ActivityIndicator />}</BlueText>
</View>
)}
{derivationPath && (
<View>
<Text style={[styles.textLabel2, stylesHook.textLabel2]}>{loc.wallets.details_derivation_path}</Text>
<BlueText testID="DerivationPath">{derivationPath}</BlueText>
</View>
)}
</View>
)}
</View>
</BlueCard>
{(wallet instanceof AbstractHDElectrumWallet || (wallet.type === WatchOnlyWallet.type && wallet.isHd())) && (
<ListItem disabled={isToolTipMenuVisible} onPress={navigateToAddresses} title={loc.wallets.details_show_addresses} chevron />
)}
2023-12-16 22:44:35 +01:00
{wallet.allowBIP47() && isBIP47Enabled && <ListItem onPress={navigateToPaymentCodes} title="Show payment codes" chevron />}
<BlueCard style={styles.address}>
<View>
<BlueSpacing20 />
<Button
disabled={isToolTipMenuVisible}
onPress={navigateToWalletExport}
testID="WalletExport"
title={loc.wallets.details_export_backup}
/>
{walletTransactionsLength > 0 && (
2022-10-12 18:39:48 +02:00
<>
<BlueSpacing20 />
<SaveFileButton
onMenuWillHide={onMenuWillHide}
onMenuWillShow={onMenuWillShow}
fileName={fileName}
fileContent={exportHistoryContent()}
>
2024-03-22 01:54:40 +01:00
<SecondButton title={loc.wallets.details_export_history} />
</SaveFileButton>
2022-10-12 18:39:48 +02:00
</>
)}
{wallet.type === MultisigHDWallet.type && (
<>
<BlueSpacing20 />
<SecondButton
disabled={isToolTipMenuVisible}
onPress={navigateToMultisigCoordinationSetup}
testID="MultisigCoordinationSetup"
title={loc.multisig.export_coordination_setup.replace(/^\w/, c => c.toUpperCase())}
/>
</>
)}
{wallet.type === MultisigHDWallet.type && (
<>
<BlueSpacing20 />
<SecondButton
disabled={isToolTipMenuVisible}
onPress={navigateToViewEditCosigners}
testID="ViewEditCosigners"
title={loc.multisig.view_edit_cosigners}
/>
</>
)}
{wallet.allowXpub() && (
<>
<BlueSpacing20 />
<SecondButton
disabled={isToolTipMenuVisible}
onPress={navigateToXPub}
testID="XPub"
title={loc.wallets.details_show_xpub}
/>
</>
)}
{wallet.allowSignVerifyMessage() && (
<>
<BlueSpacing20 />
<SecondButton
disabled={isToolTipMenuVisible}
onPress={navigateToSignVerify}
testID="SignVerify"
title={loc.addresses.sign_title}
/>
</>
)}
2021-09-09 13:00:11 +02:00
{wallet.type === LightningLdkWallet.type && (
<>
<BlueSpacing20 />
<SecondButton
disabled={isToolTipMenuVisible}
onPress={navigateToLdkViewLogs}
testID="LdkLogs"
title={loc.lnd.view_logs}
/>
2021-09-09 13:00:11 +02:00
</>
)}
<BlueSpacing20 />
<BlueSpacing20 />
<TouchableOpacity
disabled={isToolTipMenuVisible}
accessibilityRole="button"
onPress={handleDeleteButtonTapped}
testID="DeleteButton"
>
<Text
textBreakStrategy="simple"
style={[styles.delete, stylesHook.delete]}
>{`${loc.wallets.details_delete}${' '}`}</Text>
</TouchableOpacity>
2023-12-13 12:58:04 +01:00
<BlueSpacing20 />
<BlueSpacing20 />
</View>
</BlueCard>
</View>
</TouchableWithoutFeedback>
)}
</ScrollView>
2020-08-09 03:04:11 +02:00
);
};
2018-03-18 03:48:23 +01:00
2020-08-09 03:04:11 +02:00
export default WalletDetails;