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;
|
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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue