diff --git a/app/src/hooks/useFeedbackAutoHide.ts b/app/src/hooks/useFeedbackAutoHide.ts index 908e8a1c5..a86bf118a 100644 --- a/app/src/hooks/useFeedbackAutoHide.ts +++ b/app/src/hooks/useFeedbackAutoHide.ts @@ -17,7 +17,13 @@ export const useFeedbackAutoHide = () => { // When screen goes out of focus, hide the feedback button return () => { - hideFeedbackButton(); + try { + hideFeedbackButton(); + } catch (error) { + if (__DEV__) { + console.debug('Failed to hide feedback button:', error); + } + } }; }, []), ); diff --git a/app/src/hooks/useFeedbackModal.ts b/app/src/hooks/useFeedbackModal.ts index 02b10dbc6..a2df0da32 100644 --- a/app/src/hooks/useFeedbackModal.ts +++ b/app/src/hooks/useFeedbackModal.ts @@ -27,25 +27,38 @@ export const useFeedbackModal = () => { timeoutRef.current = null; } - switch (type) { - case 'button': - showFeedbackButton(); - break; - case 'widget': - showFeedbackWidget(); - break; - case 'custom': - setIsVisible(true); - break; - default: - showFeedbackButton(); + try { + switch (type) { + case 'button': + showFeedbackButton(); + break; + case 'widget': + showFeedbackWidget(); + break; + case 'custom': + setIsVisible(true); + break; + default: + showFeedbackButton(); + } + } catch (error) { + if (__DEV__) { + console.debug('Failed to show feedback button/widget:', error); + } + setIsVisible(true); } // we can close the feedback modals(sentry and custom modals), but can't do so for the Feedback button. // This hides the button after 10 seconds. if (type === 'button') { timeoutRef.current = setTimeout(() => { - hideFeedbackButton(); + try { + hideFeedbackButton(); + } catch (error) { + if (__DEV__) { + console.debug('Failed to hide feedback button:', error); + } + } timeoutRef.current = null; }, 10000); } @@ -57,7 +70,13 @@ export const useFeedbackModal = () => { timeoutRef.current = null; } - hideFeedbackButton(); + try { + hideFeedbackButton(); + } catch (error) { + if (__DEV__) { + console.debug('Failed to hide feedback button:', error); + } + } setIsVisible(false); }, []); diff --git a/app/src/integrations/nfc/nfcScanner.ts b/app/src/integrations/nfc/nfcScanner.ts index 2cfdb245a..e356d5392 100644 --- a/app/src/integrations/nfc/nfcScanner.ts +++ b/app/src/integrations/nfc/nfcScanner.ts @@ -27,6 +27,7 @@ interface Inputs { usePacePolling?: boolean; sessionId: string; userId?: string; + skipReselect?: boolean; } interface DataGroupHash { @@ -91,6 +92,7 @@ const scanAndroid = async ( canNumber: inputs.canNumber ?? '', useCan: inputs.useCan ?? false, sessionId: inputs.sessionId, + skipReselect: inputs.skipReselect ?? false, }); }; diff --git a/app/src/integrations/nfc/passportReader.ts b/app/src/integrations/nfc/passportReader.ts index 8449a6e94..d78733414 100644 --- a/app/src/integrations/nfc/passportReader.ts +++ b/app/src/integrations/nfc/passportReader.ts @@ -16,6 +16,7 @@ type ScanOptions = { usePacePolling?: boolean; sessionId?: string; quality?: number; + skipReselect?: boolean; }; export interface AndroidScanResponse { @@ -91,6 +92,8 @@ if (Platform.OS === 'android') { canNumber = '', useCan = false, quality = 1, + skipReselect = false, + sessionId, } = options; return androidScan({ @@ -100,6 +103,8 @@ if (Platform.OS === 'android') { canNumber, useCan, quality, + skipReselect, + sessionId, }); }; } diff --git a/app/src/screens/documents/scanning/DocumentNFCMethodSelectionScreen.tsx b/app/src/screens/documents/scanning/DocumentNFCMethodSelectionScreen.tsx index fa73a9cbe..317992b4f 100644 --- a/app/src/screens/documents/scanning/DocumentNFCMethodSelectionScreen.tsx +++ b/app/src/screens/documents/scanning/DocumentNFCMethodSelectionScreen.tsx @@ -39,6 +39,13 @@ const NFC_METHODS = [ platform: ['ios'], params: {}, }, + { + key: 'skipReselect', + label: 'Skip Re-select', + description: 'Skip the re-select step after the NFC scan.', + platform: ['android'], + params: { skipReselect: true }, + }, { key: 'usePacePolling', label: 'Use PACE Polling', diff --git a/app/src/screens/documents/scanning/DocumentNFCScanScreen.tsx b/app/src/screens/documents/scanning/DocumentNFCScanScreen.tsx index c092573ff..7b5b3cb47 100644 --- a/app/src/screens/documents/scanning/DocumentNFCScanScreen.tsx +++ b/app/src/screens/documents/scanning/DocumentNFCScanScreen.tsx @@ -81,6 +81,7 @@ const emitter = : null; type DocumentNFCScanRouteParams = { + skipReselect?: boolean; usePacePolling?: boolean; canNumber?: string; useCan?: boolean; @@ -326,8 +327,14 @@ const DocumentNFCScanScreen: React.FC = () => { }, 30000); try { - const { canNumber, useCan, skipPACE, skipCA, extendedMode } = - route.params ?? {}; + const { + canNumber, + useCan, + skipPACE, + skipCA, + extendedMode, + skipReselect, + } = route.params ?? {}; await configureNfcAnalytics(); const scanResponse = await scan({ @@ -341,6 +348,7 @@ const DocumentNFCScanScreen: React.FC = () => { extendedMode, usePacePolling: isPacePolling, sessionId: sessionIdRef.current, + skipReselect, }); // Check if scan was cancelled by timeout diff --git a/app/src/types/reactNativePassportReader.d.ts b/app/src/types/reactNativePassportReader.d.ts index df5d16167..7077eb5ef 100644 --- a/app/src/types/reactNativePassportReader.d.ts +++ b/app/src/types/reactNativePassportReader.d.ts @@ -11,6 +11,7 @@ declare module 'react-native-passport-reader' { useCan: boolean; quality?: number; sessionId?: string; + skipReselect?: boolean; } interface PassportReader {