FIX: If timeout is reached, reset wallet status label

This commit is contained in:
Marcos Rodriguez Velez 2024-08-25 14:50:04 -04:00
parent cb52737c25
commit 2a6de8536c
3 changed files with 49 additions and 26 deletions

View file

@ -128,37 +128,62 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
const refreshAllWalletTransactions = useCallback( const refreshAllWalletTransactions = useCallback(
async (lastSnappedTo?: number, showUpdateStatusIndicator: boolean = true) => { async (lastSnappedTo?: number, showUpdateStatusIndicator: boolean = true) => {
InteractionManager.runAfterInteractions(async () => { const TIMEOUT_DURATION = 30000;
let noErr = true;
const timeoutPromise = new Promise<never>((_resolve, reject) =>
setTimeout(() => {
reject(new Error('refreshAllWalletTransactions: Timeout reached'));
}, TIMEOUT_DURATION),
);
const mainLogicPromise = new Promise<void>((resolve, reject) => {
try { try {
await BlueElectrum.waitTillConnected(); InteractionManager.runAfterInteractions(async () => {
if (showUpdateStatusIndicator) { let noErr = true;
setWalletTransactionUpdateStatus(WalletTransactionsStatus.ALL); try {
} await BlueElectrum.waitTillConnected();
const paymentCodesStart = Date.now(); if (showUpdateStatusIndicator) {
await BlueApp.fetchSenderPaymentCodes(lastSnappedTo); setWalletTransactionUpdateStatus(WalletTransactionsStatus.ALL);
const paymentCodesEnd = Date.now(); }
console.log('fetch payment codes took', (paymentCodesEnd - paymentCodesStart) / 1000, 'sec'); const paymentCodesStart = Date.now();
const balanceStart = +new Date(); await BlueApp.fetchSenderPaymentCodes(lastSnappedTo);
await fetchWalletBalances(lastSnappedTo); const paymentCodesEnd = Date.now();
const balanceEnd = +new Date(); console.log('fetch payment codes took', (paymentCodesEnd - paymentCodesStart) / 1000, 'sec');
console.log('fetch balance took', (balanceEnd - balanceStart) / 1000, 'sec'); const balanceStart = +new Date();
const start = +new Date(); await fetchWalletBalances(lastSnappedTo);
await fetchWalletTransactions(lastSnappedTo); const balanceEnd = +new Date();
const end = +new Date(); console.log('fetch balance took', (balanceEnd - balanceStart) / 1000, 'sec');
console.log('fetch tx took', (end - start) / 1000, 'sec'); const start = +new Date();
await fetchWalletTransactions(lastSnappedTo);
const end = +new Date();
console.log('fetch tx took', (end - start) / 1000, 'sec');
} catch (err) {
noErr = false;
console.warn(err);
reject(err);
} finally {
setWalletTransactionUpdateStatus(WalletTransactionsStatus.NONE);
}
if (noErr) await saveToDisk(); // caching
resolve();
});
} catch (err) { } catch (err) {
noErr = false; reject(err);
console.warn(err);
} finally { } finally {
setWalletTransactionUpdateStatus(WalletTransactionsStatus.NONE); setWalletTransactionUpdateStatus(WalletTransactionsStatus.NONE);
} }
if (noErr) await saveToDisk(); // caching
}); });
try {
await Promise.race([mainLogicPromise, timeoutPromise]);
} catch (err) {
console.error('Error in refreshAllWalletTransactions:', err);
} finally {
setWalletTransactionUpdateStatus(WalletTransactionsStatus.NONE);
}
}, },
[fetchWalletBalances, fetchWalletTransactions, saveToDisk], [fetchWalletBalances, fetchWalletTransactions, saveToDisk],
); );
const fetchAndSaveWalletTransactions = useCallback( const fetchAndSaveWalletTransactions = useCallback(
async (walletID: string) => { async (walletID: string) => {
InteractionManager.runAfterInteractions(async () => { InteractionManager.runAfterInteractions(async () => {

View file

@ -5,14 +5,13 @@ import loc from '../loc';
interface Props { interface Props {
handleDismiss: () => void; handleDismiss: () => void;
disabled?: boolean;
} }
const WatchOnlyWarning: React.FC<Props> = ({ handleDismiss, disabled }) => { const WatchOnlyWarning: React.FC<Props> = ({ handleDismiss }) => {
return ( return (
<View style={styles.container}> <View style={styles.container}>
<View style={styles.content}> <View style={styles.content}>
<TouchableOpacity style={styles.dismissButton} onPress={handleDismiss} disabled={disabled}> <TouchableOpacity style={styles.dismissButton} onPress={handleDismiss}>
<Icon name="close" color="white" size={20} /> <Icon name="close" color="white" size={20} />
</TouchableOpacity> </TouchableOpacity>
<Icon name="warning" color="#FFFF" /> <Icon name="warning" color="#FFFF" />

View file

@ -416,7 +416,6 @@ const WalletTransactions: React.FC<WalletTransactionsProps> = ({ route }) => {
<View style={[styles.list, stylesHook.list]}> <View style={[styles.list, stylesHook.list]}>
{wallet?.type === WatchOnlyWallet.type && wallet.isWatchOnlyWarningVisible && ( {wallet?.type === WatchOnlyWallet.type && wallet.isWatchOnlyWarningVisible && (
<WatchOnlyWarning <WatchOnlyWarning
disabled={isLoading}
handleDismiss={() => { handleDismiss={() => {
wallet.isWatchOnlyWarningVisible = false; wallet.isWatchOnlyWarningVisible = false;
LayoutAnimation.configureNext(LayoutAnimation.Presets.linear); LayoutAnimation.configureNext(LayoutAnimation.Presets.linear);