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;
} catch (error) {
console.log('Error checking notification levels:', error);
if (error instanceof SyntaxError) {
throw error;
}
return false;
}
};

View file

@ -49,7 +49,7 @@ interface StorageContextType {
cachedPassword: typeof BlueApp.cachedPassword;
getItem: typeof BlueApp.getItem;
setItem: typeof BlueApp.setItem;
handleWalletDeletion: (walletID: string, forceDelete?: boolean) => Promise<void>;
handleWalletDeletion: (walletID: string, forceDelete?: boolean) => Promise<boolean>;
}
export enum WalletTransactionsStatus {
@ -101,41 +101,39 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
}, []);
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);
if (!wallet) return;
if (!wallet) {
console.warn(`handleWalletDeletion: wallet not found for ${walletID}`);
return false;
}
try {
const isNotificationsSettingsEnabled = await isNotificationsEnabled();
if (isNotificationsSettingsEnabled) {
const externalAddresses = wallet.getAllExternalAddresses();
if (externalAddresses.length > 0) {
await unsubscribe(externalAddresses, [], []);
}
}
deleteWallet(wallet);
saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
} catch (e: unknown) {
console.error(e);
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
// Force deletion: if forceDelete is true then delete and return true immediately.
if (forceDelete) {
deleteWallet(wallet);
saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
} else {
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: () => handleWalletDeletion(walletID, true),
onPress: async () => await handleWalletDeletion(walletID, true),
style: 'destructive',
},
{
text: loc.wallets.list_tryagain,
onPress: () => handleWalletDeletion(walletID),
onPress: async () => await handleWalletDeletion(walletID),
},
{
text: loc._.cancel,
@ -145,6 +143,65 @@ export const StorageProvider = ({ children }: { children: React.ReactNode }) =>
],
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) {
console.error(`handleWalletDeletion: encountered error for wallet ${walletID}`, e);
triggerHapticFeedback(HapticFeedbackTypes.NotificationError);
if (forceDelete) {
deleteWallet(wallet);
saveToDisk(true);
triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess);
return true;
} else {
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;
}
}
},

View file

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

View file

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