FIX: Alert failed to show in some scenarios

This commit is contained in:
Marcos Rodriguez Velez 2025-02-11 17:55:06 -04:00
parent 175a5f27aa
commit 8b94a9db10
4 changed files with 83 additions and 22 deletions

View file

@ -574,6 +574,9 @@ export const isNotificationsEnabled = async () => {
return !isDisabledByUser && !!token && !!levels.level_all; return !isDisabledByUser && !!token && !!levels.level_all;
} catch (error) { } catch (error) {
console.log('Error checking notification levels:', error); console.log('Error checking notification levels:', error);
if (error instanceof SyntaxError) {
throw error;
}
return false; return false;
} }
}; };

View file

@ -49,7 +49,7 @@ interface StorageContextType {
cachedPassword: typeof BlueApp.cachedPassword; cachedPassword: typeof BlueApp.cachedPassword;
getItem: typeof BlueApp.getItem; getItem: typeof BlueApp.getItem;
setItem: typeof BlueApp.setItem; setItem: typeof BlueApp.setItem;
handleWalletDeletion: (walletID: string, forceDelete?: boolean) => Promise<void>; handleWalletDeletion: (walletID: string, forceDelete?: boolean) => Promise<boolean>;
} }
export enum WalletTransactionsStatus { export enum WalletTransactionsStatus {
@ -101,28 +101,84 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
}, []); }, []);
const handleWalletDeletion = useCallback( const handleWalletDeletion = useCallback(
async (walletID: string, forceDelete = false) => { async (walletID: string, forceDelete = false): Promise<boolean> => {
console.debug(`handleWalletDeletion: invoked for walletID ${walletID}`);
const wallet = wallets.find(w => w.getID() === walletID); const wallet = wallets.find(w => w.getID() === walletID);
if (!wallet) return; if (!wallet) {
console.warn(`handleWalletDeletion: wallet not found for ${walletID}`);
return false;
}
try { // Force deletion: if forceDelete is true then delete and return true immediately.
const isNotificationsSettingsEnabled = await isNotificationsEnabled(); if (forceDelete) {
if (isNotificationsSettingsEnabled) {
const externalAddresses = wallet.getAllExternalAddresses();
if (externalAddresses.length > 0) {
await unsubscribe(externalAddresses, [], []);
}
}
deleteWallet(wallet); deleteWallet(wallet);
saveToDisk(true); saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess); triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
return true;
}
let isNotificationsSettingsEnabled = false;
try {
isNotificationsSettingsEnabled = await isNotificationsEnabled();
} catch (error) {
console.error(`handleWalletDeletion: error checking notifications for wallet ${walletID}`, error);
presentAlert({
title: loc.errors.error,
message: loc.wallets.details_delete_wallet_error_message,
buttons: [
{
text: loc.wallets.details_delete_anyway,
onPress: async () => await handleWalletDeletion(walletID, true),
style: 'destructive',
},
{
text: loc.wallets.list_tryagain,
onPress: async () => await handleWalletDeletion(walletID),
},
{
text: loc._.cancel,
onPress: () => {},
style: 'cancel',
},
],
options: { cancelable: false },
});
return false;
}
try {
if (isNotificationsSettingsEnabled) {
const externalAddresses = wallet.getAllExternalAddresses();
if (externalAddresses.length > 0) {
console.debug(`handleWalletDeletion: unsubscribing addresses for wallet ${walletID}`);
try {
await unsubscribe(externalAddresses, [], []);
console.debug(`handleWalletDeletion: unsubscribe succeeded for wallet ${walletID}`);
} catch (unsubscribeError) {
console.error(`handleWalletDeletion: unsubscribe failed for wallet ${walletID}`, unsubscribeError);
presentAlert({
title: loc.errors.error,
message: loc.wallets.details_delete_wallet_error_message,
buttons: [{ text: loc._.ok, onPress: () => {} }],
options: { cancelable: false },
});
return false;
}
}
}
deleteWallet(wallet);
console.debug(`handleWalletDeletion: wallet ${walletID} deleted successfully`);
saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
return true;
} catch (e: unknown) { } catch (e: unknown) {
console.error(e); console.error(`handleWalletDeletion: encountered error for wallet ${walletID}`, e);
triggerHapticFeedback(HapticFeedbackTypes.NotificationError); triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
if (forceDelete) { if (forceDelete) {
deleteWallet(wallet); deleteWallet(wallet);
saveToDisk(true); saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess); triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
return true;
} else { } else {
presentAlert({ presentAlert({
title: loc.errors.error, title: loc.errors.error,
@ -130,12 +186,12 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
buttons: [ buttons: [
{ {
text: loc.wallets.details_delete_anyway, text: loc.wallets.details_delete_anyway,
onPress: () => handleWalletDeletion(walletID, true), onPress: async () => await handleWalletDeletion(walletID, true),
style: 'destructive', style: 'destructive',
}, },
{ {
text: loc.wallets.list_tryagain, text: loc.wallets.list_tryagain,
onPress: () => handleWalletDeletion(walletID), onPress: async () => await handleWalletDeletion(walletID),
}, },
{ {
text: loc._.cancel, text: loc._.cancel,
@ -145,6 +201,7 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
], ],
options: { cancelable: false }, options: { cancelable: false },
}); });
return false;
} }
} }
}, },

View file

@ -401,11 +401,8 @@ const ManageWallets: React.FC = () => {
text: loc.wallets.details_yes_delete, text: loc.wallets.details_yes_delete,
onPress: async () => { onPress: async () => {
const isBiometricsEnabled = await isBiometricUseCapableAndEnabled(); const isBiometricsEnabled = await isBiometricUseCapableAndEnabled();
if (isBiometricsEnabled && !(await unlockWithBiometrics())) {
if (isBiometricsEnabled) { return;
if (!(await unlockWithBiometrics())) {
return;
}
} }
if (wallet.getBalance && wallet.getBalance() > 0 && wallet.allowSend && wallet.allowSend()) { if (wallet.getBalance && wallet.getBalance() > 0 && wallet.allowSend && wallet.allowSend()) {
presentWalletHasBalanceAlert(wallet); presentWalletHasBalanceAlert(wallet);
@ -413,6 +410,10 @@ const ManageWallets: React.FC = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
dispatch({ type: REMOVE_WALLET, payload: wallet.getID() }); dispatch({ type: REMOVE_WALLET, payload: wallet.getID() });
} }
const deleted = await handleWalletDeletion(wallet.getID(), true);
if (deleted) {
goBack();
}
}, },
style: 'destructive', style: 'destructive',
}, },
@ -421,7 +422,7 @@ const ManageWallets: React.FC = () => {
options: { cancelable: false }, options: { cancelable: false },
}); });
}, },
[isBiometricUseCapableAndEnabled, presentWalletHasBalanceAlert], [isBiometricUseCapableAndEnabled, handleWalletDeletion, presentWalletHasBalanceAlert, goBack],
); );
const handleToggleHideBalance = useCallback( const handleToggleHideBalance = useCallback(

View file

@ -87,9 +87,9 @@ const WalletDetails: React.FC = () => {
}, [wallet]); }, [wallet]);
const [isMasterFingerPrintVisible, setIsMasterFingerPrintVisible] = useState<boolean>(false); const [isMasterFingerPrintVisible, setIsMasterFingerPrintVisible] = useState<boolean>(false);
const navigateToOverviewAndDeleteWallet = useCallback(() => { const navigateToOverviewAndDeleteWallet = useCallback(async () => {
setIsLoading(true); setIsLoading(true);
handleWalletDeletion(wallet.getID()); await handleWalletDeletion(wallet.getID());
popToTop(); popToTop();
}, [handleWalletDeletion, wallet]); }, [handleWalletDeletion, wallet]);