mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-02-23 15:20:55 +01:00
FIX: Alert failed to show in some scenarios
This commit is contained in:
parent
175a5f27aa
commit
8b94a9db10
4 changed files with 83 additions and 22 deletions
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue