From db9a9b69b44cc39bfe2457f92100254a7d269297 Mon Sep 17 00:00:00 2001 From: Leszek Stachowski Date: Wed, 1 Oct 2025 13:00:24 +0200 Subject: [PATCH 1/3] introduce usePrepareDocumentProof in mobile SDK --- .../screens/prove/ConfirmBelongingScreen.tsx | 31 +++--------------- packages/mobile-sdk-alpha/src/context.tsx | 32 ++++++++++++++++++- packages/mobile-sdk-alpha/src/index.ts | 7 +++- 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/app/src/screens/prove/ConfirmBelongingScreen.tsx b/app/src/screens/prove/ConfirmBelongingScreen.tsx index 2cd094afd..8d9a102ea 100644 --- a/app/src/screens/prove/ConfirmBelongingScreen.tsx +++ b/app/src/screens/prove/ConfirmBelongingScreen.tsx @@ -3,12 +3,12 @@ // NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. import LottieView from 'lottie-react-native'; -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { ActivityIndicator, View } from 'react-native'; import type { StaticScreenProps } from '@react-navigation/native'; import { usePreventRemove } from '@react-navigation/native'; -import { loadSelectedDocument, useSelfClient } from '@selfxyz/mobile-sdk-alpha'; +import { usePrepareDocumentProof, useSelfClient } from '@selfxyz/mobile-sdk-alpha'; import { PassportEvents, ProofEvents, @@ -24,7 +24,6 @@ import { styles } from '@/screens/prove/ProofRequestStatusScreen'; import { useSettingStore } from '@/stores/settingStore'; import { flushAllAnalytics, trackNfcEvent } from '@/utils/analytics'; import { black, white } from '@/utils/colors'; -import { notificationSuccess } from '@/utils/haptic'; import { getFCMToken, requestNotificationPermission, @@ -34,35 +33,13 @@ type ConfirmBelongingScreenProps = StaticScreenProps>; const ConfirmBelongingScreen: React.FC = () => { const selfClient = useSelfClient(); - const { useProvingStore, trackEvent } = selfClient; + const { trackEvent } = selfClient; const navigate = useHapticNavigation('Loading', { params: {}, }); const [_requestingPermission, setRequestingPermission] = useState(false); - const currentState = useProvingStore(state => state.currentState); - const init = useProvingStore(state => state.init); - const setUserConfirmed = useProvingStore(state => state.setUserConfirmed); + const { setUserConfirmed, isReadyToProve } = usePrepareDocumentProof(); const setFcmToken = useSettingStore(state => state.setFcmToken); - const isReadyToProve = currentState === 'ready_to_prove'; - useEffect(() => { - notificationSuccess(); - - const initializeProving = async () => { - try { - const selectedDocument = await loadSelectedDocument(selfClient); - if (selectedDocument?.data?.documentCategory === 'aadhaar') { - init(selfClient, 'register'); - } else { - init(selfClient, 'dsc'); - } - } catch (error) { - console.error('Error loading selected document:', error); - init(selfClient, 'dsc'); - } - }; - - initializeProving(); - }, [init, selfClient]); const onOkPress = async () => { try { diff --git a/packages/mobile-sdk-alpha/src/context.tsx b/packages/mobile-sdk-alpha/src/context.tsx index 0f1ff7402..f2249026b 100644 --- a/packages/mobile-sdk-alpha/src/context.tsx +++ b/packages/mobile-sdk-alpha/src/context.tsx @@ -2,11 +2,12 @@ // SPDX-License-Identifier: BUSL-1.1 // NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. -import { createContext, type PropsWithChildren, useContext, useMemo } from 'react'; +import { createContext, type PropsWithChildren, useContext, useEffect, useMemo } from 'react'; import { createSelfClient } from './client'; import { SdkEvents } from './types/events'; import type { Adapters, Config, SelfClient } from './types/public'; +import { loadSelectedDocument } from './documents/utils'; /** * React context holding a {@link SelfClient} instance. @@ -66,3 +67,32 @@ export function useSelfClient(): SelfClient { if (!client) throw new Error('useSelfClient must be used within a SelfClientProvider'); return client; } + +export function usePrepareDocumentProof() { + const selfClient = useSelfClient(); + const { useProvingStore } = selfClient; + const currentState = useProvingStore(state => state.currentState); + const init = useProvingStore(state => state.init); + const setUserConfirmed = useProvingStore(state => state.setUserConfirmed); + const isReadyToProve = currentState === 'ready_to_prove'; + + useEffect(() => { + const initializeProving = async () => { + try { + const selectedDocument = await loadSelectedDocument(selfClient); + if (selectedDocument?.data?.documentCategory === 'aadhaar') { + init(selfClient, 'register'); + } else { + init(selfClient, 'dsc'); + } + } catch (error) { + console.error('Error loading selected document:', error); + init(selfClient, 'dsc'); + } + }; + + initializeProving(); + }, [init, selfClient]); + + return { setUserConfirmed, isReadyToProve }; +} diff --git a/packages/mobile-sdk-alpha/src/index.ts b/packages/mobile-sdk-alpha/src/index.ts index 81f480073..ea9f856bb 100644 --- a/packages/mobile-sdk-alpha/src/index.ts +++ b/packages/mobile-sdk-alpha/src/index.ts @@ -68,7 +68,12 @@ export { QRCodeScreen } from './components/screens/QRCodeScreen'; export { SdkEvents } from './types/events'; // Components -export { SelfClientContext, SelfClientProvider, useSelfClient } from './context'; +export { + SelfClientContext, + SelfClientProvider, + useSelfClient, + usePrepareDocumentProof +} from './context'; // Documents utils export { SelfMobileSdk } from './entry'; From 3910abcda4e8fd3e50ff3c7507ff17b86b0be867 Mon Sep 17 00:00:00 2001 From: Leszek Stachowski Date: Wed, 1 Oct 2025 14:23:33 +0200 Subject: [PATCH 2/3] revert haptic feedback + lint --- .../screens/prove/ConfirmBelongingScreen.tsx | 12 ++++++++-- packages/mobile-sdk-alpha/src/context.tsx | 24 +++++++++---------- packages/mobile-sdk-alpha/src/index.ts | 7 +----- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/src/screens/prove/ConfirmBelongingScreen.tsx b/app/src/screens/prove/ConfirmBelongingScreen.tsx index 8d9a102ea..c21b0b0d8 100644 --- a/app/src/screens/prove/ConfirmBelongingScreen.tsx +++ b/app/src/screens/prove/ConfirmBelongingScreen.tsx @@ -3,12 +3,15 @@ // NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. import LottieView from 'lottie-react-native'; -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { ActivityIndicator, View } from 'react-native'; import type { StaticScreenProps } from '@react-navigation/native'; import { usePreventRemove } from '@react-navigation/native'; -import { usePrepareDocumentProof, useSelfClient } from '@selfxyz/mobile-sdk-alpha'; +import { + usePrepareDocumentProof, + useSelfClient, +} from '@selfxyz/mobile-sdk-alpha'; import { PassportEvents, ProofEvents, @@ -24,6 +27,7 @@ import { styles } from '@/screens/prove/ProofRequestStatusScreen'; import { useSettingStore } from '@/stores/settingStore'; import { flushAllAnalytics, trackNfcEvent } from '@/utils/analytics'; import { black, white } from '@/utils/colors'; +import { notificationSuccess } from '@/utils/haptic'; import { getFCMToken, requestNotificationPermission, @@ -41,6 +45,10 @@ const ConfirmBelongingScreen: React.FC = () => { const { setUserConfirmed, isReadyToProve } = usePrepareDocumentProof(); const setFcmToken = useSettingStore(state => state.setFcmToken); + useEffect(() => { + notificationSuccess(); + }, []); + const onOkPress = async () => { try { setRequestingPermission(true); diff --git a/packages/mobile-sdk-alpha/src/context.tsx b/packages/mobile-sdk-alpha/src/context.tsx index f2249026b..15c094b63 100644 --- a/packages/mobile-sdk-alpha/src/context.tsx +++ b/packages/mobile-sdk-alpha/src/context.tsx @@ -5,9 +5,9 @@ import { createContext, type PropsWithChildren, useContext, useEffect, useMemo } from 'react'; import { createSelfClient } from './client'; +import { loadSelectedDocument } from './documents/utils'; import { SdkEvents } from './types/events'; import type { Adapters, Config, SelfClient } from './types/public'; -import { loadSelectedDocument } from './documents/utils'; /** * React context holding a {@link SelfClient} instance. @@ -57,17 +57,6 @@ export function SelfClientProvider({ return {children}; } -/** - * Retrieves the current {@link SelfClient} from context. - * - * @throws If used outside of a {@link SelfClientProvider}. - */ -export function useSelfClient(): SelfClient { - const client = useContext(SelfClientContext); - if (!client) throw new Error('useSelfClient must be used within a SelfClientProvider'); - return client; -} - export function usePrepareDocumentProof() { const selfClient = useSelfClient(); const { useProvingStore } = selfClient; @@ -96,3 +85,14 @@ export function usePrepareDocumentProof() { return { setUserConfirmed, isReadyToProve }; } + +/** + * Retrieves the current {@link SelfClient} from context. + * + * @throws If used outside of a {@link SelfClientProvider}. + */ +export function useSelfClient(): SelfClient { + const client = useContext(SelfClientContext); + if (!client) throw new Error('useSelfClient must be used within a SelfClientProvider'); + return client; +} diff --git a/packages/mobile-sdk-alpha/src/index.ts b/packages/mobile-sdk-alpha/src/index.ts index ea9f856bb..d41dde32f 100644 --- a/packages/mobile-sdk-alpha/src/index.ts +++ b/packages/mobile-sdk-alpha/src/index.ts @@ -68,12 +68,7 @@ export { QRCodeScreen } from './components/screens/QRCodeScreen'; export { SdkEvents } from './types/events'; // Components -export { - SelfClientContext, - SelfClientProvider, - useSelfClient, - usePrepareDocumentProof -} from './context'; +export { SelfClientContext, SelfClientProvider, usePrepareDocumentProof, useSelfClient } from './context'; // Documents utils export { SelfMobileSdk } from './entry'; From feb40c4ba776cc8e2cacbc3905640a3aa06791b4 Mon Sep 17 00:00:00 2001 From: Leszek Stachowski Date: Wed, 1 Oct 2025 14:30:08 +0200 Subject: [PATCH 3/3] fix web build --- packages/mobile-sdk-alpha/src/browser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mobile-sdk-alpha/src/browser.ts b/packages/mobile-sdk-alpha/src/browser.ts index 1b5dd5641..05bdaa1b9 100644 --- a/packages/mobile-sdk-alpha/src/browser.ts +++ b/packages/mobile-sdk-alpha/src/browser.ts @@ -39,7 +39,7 @@ export { SCANNER_ERROR_CODES, notImplemented, sdkError } from './errors'; export { SdkEvents } from './types/events'; -export { SelfClientContext, SelfClientProvider, useSelfClient } from './context'; +export { SelfClientContext, SelfClientProvider, usePrepareDocumentProof, useSelfClient } from './context'; export { clearPassportData,