diff --git a/hooks/useExtendedNavigation.ts b/hooks/useExtendedNavigation.ts index be5b42cdd..b03fef305 100644 --- a/hooks/useExtendedNavigation.ts +++ b/hooks/useExtendedNavigation.ts @@ -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 = >() const { wallets, saveToDisk } = useStorage(); const { isBiometricUseEnabled } = useBiometrics(); - const enhancedNavigate: NavigationProp['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['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');