mirror of
https://github.com/BlueWallet/BlueWallet.git
synced 2025-02-24 23:38:57 +01:00
Update useExtendedNavigation.ts
This commit is contained in:
parent
845ac41928
commit
ea421715d6
1 changed files with 73 additions and 73 deletions
|
@ -4,6 +4,7 @@ import { presentWalletExportReminder } from '../helpers/presentWalletExportRemin
|
|||
import { unlockWithBiometrics, useBiometrics } from './useBiometrics';
|
||||
import { useStorage } from './context/useStorage';
|
||||
import { requestCameraAuthorization } from '../helpers/scan-qr';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
// List of screens that require biometrics
|
||||
const requiresBiometrics = ['WalletExportRoot', 'WalletXpubRoot', 'ViewEditMultisigCosignersRoot', 'ExportMultisigCoordinationSetupRoot'];
|
||||
|
@ -16,88 +17,87 @@ export const useExtendedNavigation = <T extends NavigationProp<ParamListBase>>()
|
|||
const { wallets, saveToDisk } = useStorage();
|
||||
const { isBiometricUseEnabled } = useBiometrics();
|
||||
|
||||
const enhancedNavigate: NavigationProp<ParamListBase>['navigate'] = (
|
||||
screenOrOptions: any,
|
||||
params?: any,
|
||||
options?: { merge?: boolean },
|
||||
) => {
|
||||
let screenName: string;
|
||||
if (typeof screenOrOptions === 'string') {
|
||||
screenName = screenOrOptions;
|
||||
} else if (typeof screenOrOptions === 'object' && 'name' in screenOrOptions) {
|
||||
screenName = screenOrOptions.name;
|
||||
params = screenOrOptions.params; // Assign params from object if present
|
||||
} else {
|
||||
throw new Error('Invalid navigation options');
|
||||
}
|
||||
|
||||
const isRequiresBiometrics = requiresBiometrics.includes(screenName);
|
||||
const isRequiresWalletExportIsSaved = requiresWalletExportIsSaved.includes(screenName);
|
||||
|
||||
const proceedWithNavigation = () => {
|
||||
console.log('Proceeding with navigation to', screenName);
|
||||
if (navigationRef.current?.isReady()) {
|
||||
if (typeof screenOrOptions === 'string') {
|
||||
originalNavigation.navigate({ name: screenOrOptions, params, merge: options?.merge });
|
||||
} else {
|
||||
originalNavigation.navigate({ ...screenOrOptions, params, merge: options?.merge });
|
||||
}
|
||||
const enhancedNavigate: NavigationProp<ParamListBase>['navigate'] = useCallback(
|
||||
(screenOrOptions: any, params?: any, options?: { merge?: boolean }) => {
|
||||
let screenName: string;
|
||||
if (typeof screenOrOptions === 'string') {
|
||||
screenName = screenOrOptions;
|
||||
} else if (typeof screenOrOptions === 'object' && 'name' in screenOrOptions) {
|
||||
screenName = screenOrOptions.name;
|
||||
params = screenOrOptions.params; // Assign params from object if present
|
||||
} else {
|
||||
throw new Error('Invalid navigation options');
|
||||
}
|
||||
};
|
||||
|
||||
(async () => {
|
||||
if (isRequiresBiometrics) {
|
||||
const isBiometricsEnabled = await isBiometricUseEnabled();
|
||||
if (isBiometricsEnabled) {
|
||||
const isAuthenticated = await unlockWithBiometrics();
|
||||
if (isAuthenticated) {
|
||||
proceedWithNavigation();
|
||||
return;
|
||||
const isRequiresBiometrics = requiresBiometrics.includes(screenName);
|
||||
const isRequiresWalletExportIsSaved = requiresWalletExportIsSaved.includes(screenName);
|
||||
|
||||
const proceedWithNavigation = () => {
|
||||
console.log('Proceeding with navigation to', screenName);
|
||||
if (navigationRef.current?.isReady()) {
|
||||
if (typeof screenOrOptions === 'string') {
|
||||
originalNavigation.navigate({ name: screenOrOptions, params, merge: options?.merge });
|
||||
} else {
|
||||
console.error('Biometric authentication failed');
|
||||
// Decide if navigation should proceed or not after failed authentication
|
||||
return; // Prevent proceeding with the original navigation if bio fails
|
||||
originalNavigation.navigate({ ...screenOrOptions, params, merge: options?.merge });
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isRequiresWalletExportIsSaved) {
|
||||
console.log('Checking if wallet export is saved');
|
||||
let walletID: string | undefined;
|
||||
if (params && params.walletID) {
|
||||
walletID = params.walletID;
|
||||
} else if (params && params.params && params.params.walletID) {
|
||||
walletID = params.params.walletID;
|
||||
}
|
||||
if (!walletID) {
|
||||
proceedWithNavigation();
|
||||
return;
|
||||
}
|
||||
const wallet = wallets.find(w => w.getID() === walletID);
|
||||
if (wallet && !wallet.getUserHasSavedExport()) {
|
||||
try {
|
||||
await presentWalletExportReminder();
|
||||
wallet.setUserHasSavedExport(true);
|
||||
await saveToDisk(); // Assuming saveToDisk() returns a Promise.
|
||||
proceedWithNavigation();
|
||||
} catch (error) {
|
||||
if (error) {
|
||||
originalNavigation.navigate('WalletExportRoot', {
|
||||
screen: 'WalletExport',
|
||||
params: { walletID },
|
||||
});
|
||||
};
|
||||
|
||||
(async () => {
|
||||
if (isRequiresBiometrics) {
|
||||
const isBiometricsEnabled = await isBiometricUseEnabled();
|
||||
if (isBiometricsEnabled) {
|
||||
const isAuthenticated = await unlockWithBiometrics();
|
||||
if (isAuthenticated) {
|
||||
proceedWithNavigation();
|
||||
return;
|
||||
} else {
|
||||
console.error('Biometric authentication failed');
|
||||
// Decide if navigation should proceed or not after failed authentication
|
||||
return; // Prevent proceeding with the original navigation if bio fails
|
||||
}
|
||||
}
|
||||
|
||||
return; // Prevent proceeding with the original navigation if the reminder is shown
|
||||
}
|
||||
}
|
||||
if (isRequiresWalletExportIsSaved) {
|
||||
console.log('Checking if wallet export is saved');
|
||||
let walletID: string | undefined;
|
||||
if (params && params.walletID) {
|
||||
walletID = params.walletID;
|
||||
} else if (params && params.params && params.params.walletID) {
|
||||
walletID = params.params.walletID;
|
||||
}
|
||||
if (!walletID) {
|
||||
proceedWithNavigation();
|
||||
return;
|
||||
}
|
||||
const wallet = wallets.find(w => w.getID() === walletID);
|
||||
if (wallet && !wallet.getUserHasSavedExport()) {
|
||||
try {
|
||||
await presentWalletExportReminder();
|
||||
wallet.setUserHasSavedExport(true);
|
||||
await saveToDisk();
|
||||
proceedWithNavigation();
|
||||
} catch (error) {
|
||||
if (error) {
|
||||
originalNavigation.navigate('WalletExportRoot', {
|
||||
screen: 'WalletExport',
|
||||
params: { walletID },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (screenName === 'ScanQRCode') {
|
||||
await requestCameraAuthorization();
|
||||
}
|
||||
proceedWithNavigation();
|
||||
})();
|
||||
};
|
||||
return; // Prevent proceeding with the original navigation if the reminder is shown
|
||||
}
|
||||
}
|
||||
|
||||
if (screenName === 'ScanQRCode') {
|
||||
await requestCameraAuthorization();
|
||||
}
|
||||
proceedWithNavigation();
|
||||
})();
|
||||
},
|
||||
[originalNavigation, isBiometricUseEnabled, wallets, saveToDisk]
|
||||
);
|
||||
|
||||
const navigateToWalletsList = () => {
|
||||
enhancedNavigate('WalletsList');
|
||||
|
|
Loading…
Add table
Reference in a new issue