diff --git a/app/App.tsx b/app/App.tsx index 708981b4..ff4b6c78 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -79,7 +79,7 @@ const App = () => { translucent={false} /> - + private navigate: (stack: never, params: never) => void private setAppState: React.Dispatch> @@ -90,7 +91,7 @@ export class AppContainer implements Container { t: TFunction<'translation', undefined>, navigate: (stack: never, params: never) => void, useState: [AppState, React.Dispatch>], - log?: BaseLogger + log?: BifoldLogger ) { this._container = bifoldContainer.container.createChildContainer() this.log = log @@ -113,7 +114,6 @@ export class AppContainer implements Container { lokiUrl: Config.REMOTE_LOGGING_URL, lokiLabels: { application: getApplicationName().toLowerCase(), - job: 'react-native-logs', version: `${getVersion()}-${getBuildNumber()}`, system: `${getSystemName()} v${getSystemVersion()}`, }, diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 7f4c2fb8..b564e6ac 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -445,7 +445,7 @@ PODS: - React-jsinspector (0.72.5) - React-logger (0.72.5): - glog - - "react-native-attestation (1.0.0-alpha.391+6f8357ae)": + - "react-native-attestation (1.0.0-alpha.395+99c753a2)": - RCT-Folly (= 2021.07.22.00) - React-Core - react-native-config (1.5.0): @@ -936,7 +936,7 @@ SPEC CHECKSUMS: React-jsiexecutor: ff70a72027dea5cc7d71cfcc6fad7f599f63987a React-jsinspector: aef73cbd43b70675f572214d10fa438c89bf11ba React-logger: 2e4aee3e11b3ec4fa6cfd8004610bbb3b8d6cca4 - react-native-attestation: a4fd5220ba42bc4a817e86cfab53d0303f0f9242 + react-native-attestation: 99f1d3d799ff7001d1f0c3881e267f7ca96ceda9 react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727 react-native-date-picker: 06a4d96ab525a163c7a90bccd68833d136b0bb13 react-native-encrypted-storage: db300a3f2f0aba1e818417c1c0a6be549038deb7 diff --git a/app/jestSetup.js b/app/jestSetup.js index 70ccd16c..a3d871b0 100644 --- a/app/jestSetup.js +++ b/app/jestSetup.js @@ -1,7 +1,12 @@ /* eslint-disable no-undef */ import 'react-native-gesture-handler/jestSetup' import mockRNLocalize from 'react-native-localize/mock' +import mockRNDeviceInfo from 'react-native-device-info/jest/react-native-device-info-mock' +mockRNDeviceInfo.getVersion = jest.fn(() => '1') +mockRNDeviceInfo.getBuildNumber = jest.fn(() => '1') + +jest.mock('react-native-device-info', () => mockRNDeviceInfo) jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper') jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter') jest.mock('react-native-localize', () => mockRNLocalize) diff --git a/app/package.json b/app/package.json index dd7e5571..06513a96 100644 --- a/app/package.json +++ b/app/package.json @@ -62,11 +62,11 @@ "@formatjs/intl-relativetimeformat": "9.3.1", "@hyperledger/anoncreds-react-native": "0.2.4", "@hyperledger/aries-askar-react-native": "0.2.3", - "@hyperledger/aries-bifold-core": "1.0.0-alpha.391", - "@hyperledger/aries-bifold-remote-logs": "1.0.0-alpha.391", - "@hyperledger/aries-bifold-verifier": "1.0.0-alpha.391", - "@hyperledger/aries-oca": "1.0.0-alpha.391", - "@hyperledger/aries-react-native-attestation": "1.0.0-alpha.391", + "@hyperledger/aries-bifold-core": "1.0.0-alpha.395", + "@hyperledger/aries-bifold-remote-logs": "1.0.0-alpha.395", + "@hyperledger/aries-bifold-verifier": "1.0.0-alpha.395", + "@hyperledger/aries-oca": "1.0.0-alpha.395", + "@hyperledger/aries-react-native-attestation": "1.0.0-alpha.395", "@hyperledger/indy-vdr-react-native": "0.2.2", "@hyperledger/indy-vdr-shared": "0.2.2", "@react-native-async-storage/async-storage": "1.15.11", diff --git a/app/src/hooks/initialize-agent.ts b/app/src/hooks/initialize-agent.ts index 8e66824e..1b8e16a1 100644 --- a/app/src/hooks/initialize-agent.ts +++ b/app/src/hooks/initialize-agent.ts @@ -190,7 +190,7 @@ const useInitializeBCAgent = () => { if (store.preferences.usePushNotifications) { logger.info('Activating push notifications...') - await activate(newAgent) + activate(newAgent) } // In case the old attestationMonitor is still active, stop it and start a new one diff --git a/app/src/localization/en/index.ts b/app/src/localization/en/index.ts index 95bf785f..8aa24e4f 100644 --- a/app/src/localization/en/index.ts +++ b/app/src/localization/en/index.ts @@ -21,6 +21,10 @@ const translation = { "Message2028": "There was a problem receiving the attestation invitation to connect.", "Title2029": "Unable to handle attestation proof", "Message2029": "There was a problem while handling an attestation proof request.", + "Title2030": "Unable to complete app initialization", + "Message2030": "There was a problem while initializing the app.", + "Title2031": "Unable to complete agent initialization", + "Message2031": "There was a problem while initializing the agent.", "NoMessage": "No Message", }, "CameraDisclosure": { diff --git a/app/src/localization/fr/index.ts b/app/src/localization/fr/index.ts index e5195faa..2c3eabec 100644 --- a/app/src/localization/fr/index.ts +++ b/app/src/localization/fr/index.ts @@ -21,6 +21,10 @@ const translation = { "Message2028": "Un problème est survenu pendant la réception de l'attestation de l'invitation de connection.", "Title2029": "Incapable de gérer la preuve d'attestation.", "Message2029": "Un problème est survenu de la gestion lors de la requête de preuve d'attestation.", + "Title2030": "Unable to complete app initialization (FR)", + "Message2030": "There was a problem while initializing the app. (FR)", + "Title2031": "Unable to complete agent initialization (FR)", + "Message2031": "There was a problem while initializing the agent. (FR)", "NoMessage": "Aucun message", }, "CameraDisclosure": { diff --git a/app/src/localization/pt-br/index.ts b/app/src/localization/pt-br/index.ts index ddcb85d0..897e8048 100644 --- a/app/src/localization/pt-br/index.ts +++ b/app/src/localization/pt-br/index.ts @@ -21,6 +21,10 @@ const translation = { "Message2028": "There was a problem receiving the attestation invitation to connect. (PT-BR)", "Title2029": "Unable to handle attestation proof (PT-BR)", "Message2029": "There was a problem while handling an attestation proof request. (PT-BR)", + "Title2030": "Unable to complete app initialization (PT-BR)", + "Message2030": "There was a problem while initializing the app. (PT-BR)", + "Title2031": "Unable to complete agent initialization (PT-BR)", + "Message2031": "There was a problem while initializing the agent. (PT-BR)", "NoMessage": "No Message (PT-BR)", }, "CameraDisclosure": { diff --git a/app/src/screens/Splash.tsx b/app/src/screens/Splash.tsx index 9ce198c7..e6308e2f 100644 --- a/app/src/screens/Splash.tsx +++ b/app/src/screens/Splash.tsx @@ -9,6 +9,7 @@ import { testIdWithKey, TOKENS, useServices, + BifoldError, } from '@hyperledger/aries-bifold-core' import { RemoteOCABundleResolver } from '@hyperledger/aries-oca/build/legacy' import { CommonActions, useNavigation } from '@react-navigation/native' @@ -16,6 +17,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { StyleSheet, View, Text, Image, useWindowDimensions, ScrollView } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' +import Icon from 'react-native-vector-icons/MaterialCommunityIcons' import ProgressBar from '../components/ProgressBar' import TipCarousel from '../components/TipCarousel' @@ -110,14 +112,23 @@ const Splash = () => { const [initOnboardingCount, setInitOnboardingCount] = useState(0) const [initAgentCount, setInitAgentCount] = useState(0) const [initErrorType, setInitErrorType] = useState(InitErrorTypes.Onboarding) - const [initError, setInitError] = useState(null) + const [initError, setInitError] = useState(null) + const [reported, setReported] = useState(false) const initializing = useRef(false) const { initializeAgent } = useInitializeBCAgent() - const [ocaBundleResolver, { showPreface, enablePushNotifications }] = useServices([ + const [logger, ocaBundleResolver, { showPreface, enablePushNotifications }] = useServices([ + TOKENS.UTIL_LOGGER, TOKENS.UTIL_OCA_RESOLVER, TOKENS.CONFIG, ]) + const report = useCallback(() => { + if (initError) { + logger.report(initError) + } + setReported(true) + }, [logger, initError]) + const steps: string[] = useMemo( () => [ t('Init.Starting'), @@ -274,7 +285,7 @@ const Splash = () => { } } catch (e: unknown) { setInitErrorType(InitErrorTypes.Onboarding) - setInitError(e as Error) + setInitError(new BifoldError(t('Error.Title2030'), t('Error.Message2030'), (e as Error)?.message, 2030)) } }, [ mounted, @@ -335,7 +346,7 @@ const Splash = () => { } catch (e: unknown) { initializing.current = false setInitErrorType(InitErrorTypes.Agent) - setInitError(e as Error) + setInitError(new BifoldError(t('Error.Title2031'), t('Error.Message2031'), (e as Error)?.message, 2031)) } } @@ -350,6 +361,7 @@ const Splash = () => { store.onboarding.didConsiderBiometry, navigation, initAgentCount, + t, ]) const handleErrorCallToActionPressed = () => { @@ -361,6 +373,14 @@ const Splash = () => { } } + const secondaryCallToActionIcon = useMemo( + () => + reported ? ( + + ) : undefined, + [reported, ColorPallet.semantic.success] + ) + return ( @@ -380,6 +400,11 @@ const Splash = () => { message={initError?.message || t('Error.Unknown')} onCallToActionLabel={t('Init.Retry')} onCallToActionPressed={handleErrorCallToActionPressed} + secondaryCallToActionTitle={reported ? t('Error.Reported') : t('Error.ReportThisProblem')} + secondaryCallToActionDisabled={reported} + secondaryCallToActionIcon={secondaryCallToActionIcon} + secondaryCallToActionPressed={initError ? report : undefined} + showVersionFooter /> ) : ( diff --git a/app/src/services/attestation.ts b/app/src/services/attestation.ts index 34e0d500..f88ef0c1 100644 --- a/app/src/services/attestation.ts +++ b/app/src/services/attestation.ts @@ -8,12 +8,12 @@ import { ProofState, ProofEventTypes, ProofExchangeRecord, - BaseLogger, ConnectionRecord, } from '@credo-ts/core' import { BifoldError, BifoldAgent, + BifoldLogger, AttestationEventTypes, AttestationMonitor as AttestationMonitorI, } from '@hyperledger/aries-bifold-core' @@ -150,7 +150,7 @@ export class AttestationMonitor implements AttestationMonitorI { private offerSubscription?: Subscription private agent?: Agent private options: AttestationMonitorOptions - private log?: BaseLogger + private log?: BifoldLogger private _attestationWorkflowInProgress = false private _shouldHandleProofRequestAutomatically = false private _proofRequest?: ProofExchangeRecord @@ -158,7 +158,7 @@ export class AttestationMonitor implements AttestationMonitorI { // take in options, agent, and logger. Options should include the attestation service URL // and the proof to watch for along with the cred_ef_id of the attestation credentials. - public constructor(logger: BaseLogger, options: AttestationMonitorOptions) { + public constructor(logger: BifoldLogger, options: AttestationMonitorOptions) { this.log = logger this.options = options const { shouldHandleProofRequestAutomatically } = options diff --git a/yarn.lock b/yarn.lock index de8767a7..fa6ff669 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3253,9 +3253,9 @@ __metadata: languageName: node linkType: hard -"@hyperledger/aries-bifold-core@npm:1.0.0-alpha.391": - version: 1.0.0-alpha.391 - resolution: "@hyperledger/aries-bifold-core@npm:1.0.0-alpha.391" +"@hyperledger/aries-bifold-core@npm:1.0.0-alpha.395, @hyperledger/aries-bifold-core@npm:^1.0.0-alpha.395+99c753a2": + version: 1.0.0-alpha.395 + resolution: "@hyperledger/aries-bifold-core@npm:1.0.0-alpha.395" peerDependencies: "@credo-ts/anoncreds": 0.5.11 "@credo-ts/askar": 0.5.11 @@ -3331,13 +3331,21 @@ __metadata: uuid: ^9.0.0 bin: bifold: bin/bifold - checksum: 8d74a2baab46cd9d3f73bee6c6d89b6591ccc9d0d71af5cc3ef5e7241604c7490255225dfb172a461ec9522071fc8c9a6e244644834268697b4e32f743ad94fc + checksum: 8a77e4507938d4d794c141a402aae7957ab316bdd41404f78dda2dc031fd8d248578f565017360a7ef28552afae32f624955429d519ea4ee194e757d82c837a3 languageName: node linkType: hard -"@hyperledger/aries-bifold-remote-logs@npm:1.0.0-alpha.391": - version: 1.0.0-alpha.391 - resolution: "@hyperledger/aries-bifold-remote-logs@npm:1.0.0-alpha.391" +"@hyperledger/aries-bifold-remote-logs@npm:1.0.0-alpha.395": + version: 1.0.0-alpha.395 + resolution: "@hyperledger/aries-bifold-remote-logs@npm:1.0.0-alpha.395" + dependencies: + "@credo-ts/core": "npm:0.5.11" + "@hyperledger/aries-bifold-core": "npm:^1.0.0-alpha.395+99c753a2" + axios: "npm:^1.4.0" + buffer: "npm:^6.0.3" + react: "npm:18.2.0" + react-native: "npm:0.72.5" + react-native-logs: "npm:^5.1.0" peerDependencies: "@credo-ts/core": 0.5.11 axios: ^1.4.0 @@ -3345,43 +3353,43 @@ __metadata: react: ^18.2.0 react-native: ^0.72.5 react-native-logs: ^5.1.0 - checksum: aa77574c46cf44b6cb097f77b666241e298189fd39deacbbbe538084ac2860400454939effb5f88be9466c21eca2aaf3030c4eac134be518bbb573bb64556cf9 + checksum: f44185576214c3ec3eb8596517e11db0b470433cbd665249e6a17610f9acfcb2e2c22e60bd69f471be0ad6aeccf962ddacbaaa68b7a5a05c3be12361a45335b7 languageName: node linkType: hard -"@hyperledger/aries-bifold-verifier@npm:1.0.0-alpha.391": - version: 1.0.0-alpha.391 - resolution: "@hyperledger/aries-bifold-verifier@npm:1.0.0-alpha.391" +"@hyperledger/aries-bifold-verifier@npm:1.0.0-alpha.395": + version: 1.0.0-alpha.395 + resolution: "@hyperledger/aries-bifold-verifier@npm:1.0.0-alpha.395" peerDependencies: "@credo-ts/anoncreds": 0.5.11 "@credo-ts/core": 0.5.11 "@credo-ts/react-hooks": ^0.6.0 "@hyperledger/anoncreds-shared": 0.2.4 react: ^18.2.0 - checksum: d23703c83d4bfb1eaf8257c1a06b7f24f622de0de845783bb85f4fddad8f4d8795f8ba0abd4acdfd11700806460c081d1218dba8c257dc2afee8d9f478859f97 + checksum: 1f7c651cc3a5ddf3c90ee79581b70bcb335f018498573a5babfaac3cf3ec80447848e1d4c4d3be815c11034894c38eda92421166a9331913b1d8f6defa941a9b languageName: node linkType: hard -"@hyperledger/aries-oca@npm:1.0.0-alpha.391": - version: 1.0.0-alpha.391 - resolution: "@hyperledger/aries-oca@npm:1.0.0-alpha.391" +"@hyperledger/aries-oca@npm:1.0.0-alpha.395": + version: 1.0.0-alpha.395 + resolution: "@hyperledger/aries-oca@npm:1.0.0-alpha.395" dependencies: "@credo-ts/anoncreds": "npm:0.5.11" "@credo-ts/core": "npm:0.5.11" axios: "npm:^1.4.0" lodash.startcase: "npm:^4.4.0" react-native-fs: "npm:^2.16.6" - checksum: 48a4ebea014d127eef9c92c7a419c9bfaa4730eb115ea3660ad727e374ef8ddf94cba1c5151a4616885db990504fc4d88397b092676bc5d1b0baf62d0dfc99fb + checksum: 19760e1a422251192a4cd898e31b1dad18c5423b7e269fbe73fd1ba624daa71854d68e7dcff8819239f69f811103a07c60736a7f9d16b5d8c1ff093d0043f4dd languageName: node linkType: hard -"@hyperledger/aries-react-native-attestation@npm:1.0.0-alpha.391": - version: 1.0.0-alpha.391 - resolution: "@hyperledger/aries-react-native-attestation@npm:1.0.0-alpha.391" +"@hyperledger/aries-react-native-attestation@npm:1.0.0-alpha.395": + version: 1.0.0-alpha.395 + resolution: "@hyperledger/aries-react-native-attestation@npm:1.0.0-alpha.395" peerDependencies: react: "*" react-native: "*" - checksum: 3d8775696ee976a8b7849ae4dc6661149fcd6c682beed5da59af7cd933078f5d250ba8116e6b14a3c94acc6fa22469b32c945f555aa10b8b3028c7588c768aa1 + checksum: de91df1f4ba93a602adc9869fe12ae92cbafa2946644006768fd76008c5e00efc25302f82b82ae43a625fc0c769f8bdaff7a27809d96bc5e1183bd2d7d53ad6b languageName: node linkType: hard @@ -8292,11 +8300,11 @@ __metadata: "@formatjs/intl-relativetimeformat": "npm:9.3.1" "@hyperledger/anoncreds-react-native": "npm:0.2.4" "@hyperledger/aries-askar-react-native": "npm:0.2.3" - "@hyperledger/aries-bifold-core": "npm:1.0.0-alpha.391" - "@hyperledger/aries-bifold-remote-logs": "npm:1.0.0-alpha.391" - "@hyperledger/aries-bifold-verifier": "npm:1.0.0-alpha.391" - "@hyperledger/aries-oca": "npm:1.0.0-alpha.391" - "@hyperledger/aries-react-native-attestation": "npm:1.0.0-alpha.391" + "@hyperledger/aries-bifold-core": "npm:1.0.0-alpha.395" + "@hyperledger/aries-bifold-remote-logs": "npm:1.0.0-alpha.395" + "@hyperledger/aries-bifold-verifier": "npm:1.0.0-alpha.395" + "@hyperledger/aries-oca": "npm:1.0.0-alpha.395" + "@hyperledger/aries-react-native-attestation": "npm:1.0.0-alpha.395" "@hyperledger/indy-vdr-react-native": "npm:0.2.2" "@hyperledger/indy-vdr-shared": "npm:0.2.2" "@react-native-async-storage/async-storage": "npm:1.15.11"