@bifold/core 2.4.6 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/lib/commonjs/contexts/reducers/store.js +3 -2
  2. package/lib/commonjs/contexts/reducers/store.js.map +1 -1
  3. package/lib/commonjs/index.js +119 -104
  4. package/lib/commonjs/index.js.map +1 -1
  5. package/lib/commonjs/screens/AttemptLockout.js +27 -35
  6. package/lib/commonjs/screens/AttemptLockout.js.map +1 -1
  7. package/lib/commonjs/screens/MobileVerifierLoading.js +4 -3
  8. package/lib/commonjs/screens/MobileVerifierLoading.js.map +1 -1
  9. package/lib/commonjs/screens/PINCreate.js +3 -10
  10. package/lib/commonjs/screens/PINCreate.js.map +1 -1
  11. package/lib/commonjs/screens/WhatAreContacts.js +3 -2
  12. package/lib/commonjs/screens/WhatAreContacts.js.map +1 -1
  13. package/lib/module/contexts/reducers/store.js +3 -2
  14. package/lib/module/contexts/reducers/store.js.map +1 -1
  15. package/lib/module/index.js +42 -45
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/screens/AttemptLockout.js +28 -36
  18. package/lib/module/screens/AttemptLockout.js.map +1 -1
  19. package/lib/module/screens/MobileVerifierLoading.js +4 -3
  20. package/lib/module/screens/MobileVerifierLoading.js.map +1 -1
  21. package/lib/module/screens/PINCreate.js +3 -10
  22. package/lib/module/screens/PINCreate.js.map +1 -1
  23. package/lib/module/screens/WhatAreContacts.js +3 -2
  24. package/lib/module/screens/WhatAreContacts.js.map +1 -1
  25. package/lib/typescript/src/contexts/reducers/store.d.ts.map +1 -1
  26. package/lib/typescript/src/index.d.ts +57 -61
  27. package/lib/typescript/src/index.d.ts.map +1 -1
  28. package/lib/typescript/src/screens/AttemptLockout.d.ts.map +1 -1
  29. package/lib/typescript/src/screens/MobileVerifierLoading.d.ts.map +1 -1
  30. package/lib/typescript/src/screens/PINCreate.d.ts.map +1 -1
  31. package/lib/typescript/src/screens/WhatAreContacts.d.ts.map +1 -1
  32. package/package.json +3 -4
  33. package/src/App.tsx +0 -79
  34. package/src/animated-components.ts +0 -30
  35. package/src/assets/fonts/MaterialIcons.ttf +0 -0
  36. package/src/assets/icons/code.svg +0 -4
  37. package/src/assets/icons/large-arrow.svg +0 -5
  38. package/src/assets/icons/pencil.svg +0 -15
  39. package/src/assets/icons/trash.svg +0 -31
  40. package/src/assets/img/Artwork_1024x1024.png +0 -0
  41. package/src/assets/img/HistoryCardAcceptedIcon.svg +0 -4
  42. package/src/assets/img/HistoryCardExpiredIcon.svg +0 -4
  43. package/src/assets/img/HistoryCardRevokedIcon.svg +0 -4
  44. package/src/assets/img/HistoryInformationSentIcon.svg +0 -4
  45. package/src/assets/img/HistoryPinUpdatedIcon.svg +0 -4
  46. package/src/assets/img/IconChevronRight.svg +0 -5
  47. package/src/assets/img/activity-indicator-circle.svg +0 -90
  48. package/src/assets/img/app-lockout.svg +0 -1
  49. package/src/assets/img/biometrics.svg +0 -74
  50. package/src/assets/img/chat-loading.svg +0 -1
  51. package/src/assets/img/check-in-circle.svg +0 -18
  52. package/src/assets/img/connection-pending.svg +0 -112
  53. package/src/assets/img/contact-book.svg +0 -21
  54. package/src/assets/img/credential-card.svg +0 -18
  55. package/src/assets/img/credential-declined.svg +0 -28
  56. package/src/assets/img/credential-in-hand.svg +0 -48
  57. package/src/assets/img/credential-list.svg +0 -60
  58. package/src/assets/img/credential-pending.svg +0 -96
  59. package/src/assets/img/credential-success.svg +0 -48
  60. package/src/assets/img/delete-notification.svg +0 -1
  61. package/src/assets/img/empty-wallet.svg +0 -23
  62. package/src/assets/img/error-filled.svg +0 -12
  63. package/src/assets/img/exclamation-mark.svg +0 -17
  64. package/src/assets/img/home-center-img.svg +0 -71
  65. package/src/assets/img/icon-credential-offer-dark.svg +0 -7
  66. package/src/assets/img/icon-credential-offer-light.svg +0 -7
  67. package/src/assets/img/icon-info-recieved-dark.svg +0 -8
  68. package/src/assets/img/icon-info-recieved-light.svg +0 -8
  69. package/src/assets/img/icon-info-sent-dark.svg +0 -8
  70. package/src/assets/img/icon-info-sent-light.svg +0 -8
  71. package/src/assets/img/icon-proof-request-dark.svg +0 -11
  72. package/src/assets/img/icon-proof-request-light.svg +0 -11
  73. package/src/assets/img/information-received.svg +0 -1
  74. package/src/assets/img/logo-large.png +0 -0
  75. package/src/assets/img/logo-large@2x.png +0 -0
  76. package/src/assets/img/logo-large@3x.png +0 -0
  77. package/src/assets/img/logo.svg +0 -15
  78. package/src/assets/img/message-text-icon-outline.svg +0 -1
  79. package/src/assets/img/message-text-icon.svg +0 -1
  80. package/src/assets/img/no_information_shared.svg +0 -36
  81. package/src/assets/img/preface.svg +0 -15
  82. package/src/assets/img/proof-declined.svg +0 -66
  83. package/src/assets/img/proof-pending.svg +0 -61
  84. package/src/assets/img/proof-success.svg +0 -72
  85. package/src/assets/img/push-notifications.svg +0 -1
  86. package/src/assets/img/qrcode-scan-icon.svg +0 -1
  87. package/src/assets/img/scan-share.svg +0 -102
  88. package/src/assets/img/secure-check.svg +0 -4
  89. package/src/assets/img/secure-image.svg +0 -64
  90. package/src/assets/img/update-available.svg +0 -26
  91. package/src/assets/img/verifier-request-declined.svg +0 -34
  92. package/src/assets/img/wallet-back.svg +0 -20
  93. package/src/assets/img/wallet-front.svg +0 -32
  94. package/src/assets/img/wallet-icon-outline.svg +0 -1
  95. package/src/assets/img/wallet-icon.svg +0 -1
  96. package/src/assets/img/wallet.svg +0 -43
  97. package/src/assets/oca-bundles.json +0 -174
  98. package/src/components/animated/ButtonLoading.tsx +0 -32
  99. package/src/components/animated/ConnectionLoading.tsx +0 -53
  100. package/src/components/animated/CredentialAdded.tsx +0 -72
  101. package/src/components/animated/CredentialPending.tsx +0 -63
  102. package/src/components/animated/LoadingIndicator.tsx +0 -49
  103. package/src/components/animated/PresentationLoading.tsx +0 -52
  104. package/src/components/animated/RecordLoading.tsx +0 -75
  105. package/src/components/animated/SendingProof.tsx +0 -53
  106. package/src/components/animated/SentProof.tsx +0 -72
  107. package/src/components/buttons/Button-api.tsx +0 -46
  108. package/src/components/buttons/Button.tsx +0 -125
  109. package/src/components/buttons/HeaderHome.tsx +0 -25
  110. package/src/components/buttons/IconButton.tsx +0 -93
  111. package/src/components/buttons/InfoIcon.tsx +0 -35
  112. package/src/components/buttons/SettingsMenu.tsx +0 -26
  113. package/src/components/buttons/ToggleButton.tsx +0 -93
  114. package/src/components/buttons/index.ts +0 -4
  115. package/src/components/chat/ActionSlider.tsx +0 -104
  116. package/src/components/chat/ChatActions.tsx +0 -33
  117. package/src/components/chat/ChatBubble.tsx +0 -20
  118. package/src/components/chat/ChatEvent.tsx +0 -31
  119. package/src/components/chat/ChatMessage.tsx +0 -142
  120. package/src/components/chat/MessageInput.tsx +0 -46
  121. package/src/components/chat/index.ts +0 -4
  122. package/src/components/forms/WalletNameForm.tsx +0 -148
  123. package/src/components/index.ts +0 -4
  124. package/src/components/inputs/BiometryControl.tsx +0 -190
  125. package/src/components/inputs/BulletPoint.tsx +0 -32
  126. package/src/components/inputs/CheckBoxRow.tsx +0 -67
  127. package/src/components/inputs/InlineErrorText.tsx +0 -60
  128. package/src/components/inputs/LimitedTextInput.tsx +0 -71
  129. package/src/components/inputs/PINInput.tsx +0 -175
  130. package/src/components/inputs/SingleSelectBlock.tsx +0 -53
  131. package/src/components/listItems/ContactCredentialListItem.tsx +0 -79
  132. package/src/components/listItems/ContactListItem.tsx +0 -121
  133. package/src/components/listItems/NotificationListItem.tsx +0 -514
  134. package/src/components/misc/AvatarView.tsx +0 -33
  135. package/src/components/misc/CardWatermark.tsx +0 -52
  136. package/src/components/misc/ConnectionAlert.tsx +0 -123
  137. package/src/components/misc/ConnectionImage.tsx +0 -45
  138. package/src/components/misc/ContentGradient.tsx +0 -40
  139. package/src/components/misc/CredentialCard.tsx +0 -161
  140. package/src/components/misc/CredentialCard10.tsx +0 -329
  141. package/src/components/misc/CredentialCard11.tsx +0 -701
  142. package/src/components/misc/CredentialCard11ActionFooter.tsx +0 -55
  143. package/src/components/misc/CredentialCard11Issuer.tsx +0 -74
  144. package/src/components/misc/CredentialCard11Logo.tsx +0 -61
  145. package/src/components/misc/EmptyList.tsx +0 -27
  146. package/src/components/misc/EmptyListContacts.tsx +0 -55
  147. package/src/components/misc/ErrorBoundary.tsx +0 -200
  148. package/src/components/misc/FauxHeader.tsx +0 -75
  149. package/src/components/misc/InfoBox.tsx +0 -283
  150. package/src/components/misc/NoNewUpdates.tsx +0 -38
  151. package/src/components/misc/PINHeader.tsx +0 -25
  152. package/src/components/misc/PINValidationHelper.tsx +0 -48
  153. package/src/components/misc/Pagination.tsx +0 -114
  154. package/src/components/misc/QRRenderer.tsx +0 -53
  155. package/src/components/misc/QRScanner.tsx +0 -395
  156. package/src/components/misc/QRScannerTorch.tsx +0 -74
  157. package/src/components/misc/ScanCamera.tsx +0 -86
  158. package/src/components/misc/ScanTab.tsx +0 -45
  159. package/src/components/misc/SharedProofData.tsx +0 -98
  160. package/src/components/misc/UnorderedList.tsx +0 -28
  161. package/src/components/misc/VerifierCredentialCard.tsx +0 -378
  162. package/src/components/misc/index.ts +0 -2
  163. package/src/components/modals/AlertModal.tsx +0 -42
  164. package/src/components/modals/AppGuideModal.tsx +0 -142
  165. package/src/components/modals/CameraDisclosureModal.tsx +0 -126
  166. package/src/components/modals/CommonRemoveModal.tsx +0 -337
  167. package/src/components/modals/DeveloperModal.tsx +0 -32
  168. package/src/components/modals/DismissiblePopupModal.tsx +0 -169
  169. package/src/components/modals/ErrorModal.tsx +0 -107
  170. package/src/components/modals/ImageModal.tsx +0 -80
  171. package/src/components/modals/NetInfoModal.tsx +0 -35
  172. package/src/components/modals/PopupModal.tsx +0 -56
  173. package/src/components/modals/ProofCancelModal.tsx +0 -79
  174. package/src/components/modals/SafeAreaModal.tsx +0 -17
  175. package/src/components/record/Record.tsx +0 -100
  176. package/src/components/record/RecordBinaryField.tsx +0 -55
  177. package/src/components/record/RecordDateIntField.tsx +0 -63
  178. package/src/components/record/RecordField.tsx +0 -154
  179. package/src/components/record/RecordFooter.tsx +0 -17
  180. package/src/components/record/RecordHeader.tsx +0 -17
  181. package/src/components/record/RecordRemove.tsx +0 -66
  182. package/src/components/texts/HeaderTitle.tsx +0 -25
  183. package/src/components/texts/HighlightTextBox.tsx +0 -41
  184. package/src/components/texts/InfoTextBox.tsx +0 -129
  185. package/src/components/texts/Link.tsx +0 -41
  186. package/src/components/texts/Text.tsx +0 -21
  187. package/src/components/texts/ThemedText.tsx +0 -24
  188. package/src/components/toast/BaseToast.tsx +0 -128
  189. package/src/components/toast/ToastConfig.tsx +0 -21
  190. package/src/components/tour/AttachTourStep.tsx +0 -73
  191. package/src/components/tour/CredentialOfferTourSteps.tsx +0 -41
  192. package/src/components/tour/CredentialsTourSteps.tsx +0 -41
  193. package/src/components/tour/HomeTourSteps.tsx +0 -104
  194. package/src/components/tour/ProofRequestTourSteps.tsx +0 -41
  195. package/src/components/tour/SpotCutout.tsx +0 -65
  196. package/src/components/tour/TourBox.tsx +0 -255
  197. package/src/components/tour/TourOverlay.tsx +0 -134
  198. package/src/components/views/Banner.tsx +0 -181
  199. package/src/components/views/CredentialCardLogo.tsx +0 -77
  200. package/src/components/views/CredentialDetailPrimaryHeader.tsx +0 -107
  201. package/src/components/views/CredentialDetailSecondaryHeader.tsx +0 -60
  202. package/src/components/views/HeaderWithBanner.tsx +0 -17
  203. package/src/components/views/HomeFooterView.tsx +0 -110
  204. package/src/components/views/HomeHeaderView.tsx +0 -12
  205. package/src/components/views/KeyboardView.tsx +0 -41
  206. package/src/components/views/LoadingPlaceholder.tsx +0 -168
  207. package/src/components/views/LoadingView.tsx +0 -29
  208. package/src/components/views/ProgressBar.tsx +0 -53
  209. package/src/components/views/PushNotificationsContent.tsx +0 -51
  210. package/src/components/views/PushNotificationsDisabledContent.tsx +0 -47
  211. package/src/configs/ledgers/indy/index.ts +0 -8
  212. package/src/configs/ledgers/indy/ledgers.json +0 -51
  213. package/src/constants.ts +0 -107
  214. package/src/container-api.ts +0 -247
  215. package/src/container-impl.ts +0 -243
  216. package/src/contexts/activity.tsx +0 -145
  217. package/src/contexts/animated-components.ts +0 -9
  218. package/src/contexts/auth.tsx +0 -240
  219. package/src/contexts/index.ts +0 -3
  220. package/src/contexts/navigation.tsx +0 -19
  221. package/src/contexts/network.tsx +0 -125
  222. package/src/contexts/reducers/index.ts +0 -3
  223. package/src/contexts/reducers/store.ts +0 -754
  224. package/src/contexts/store.tsx +0 -103
  225. package/src/contexts/theme.tsx +0 -51
  226. package/src/contexts/tour/tour-context.tsx +0 -160
  227. package/src/contexts/tour/tour-provider.tsx +0 -160
  228. package/src/hooks/bundle-resolver.ts +0 -95
  229. package/src/hooks/chat-messages.tsx +0 -263
  230. package/src/hooks/connections.ts +0 -37
  231. package/src/hooks/credential-card-styles.ts +0 -144
  232. package/src/hooks/credentials.ts +0 -11
  233. package/src/hooks/deep-links.ts +0 -49
  234. package/src/hooks/developer-mode.ts +0 -25
  235. package/src/hooks/lockout.ts +0 -77
  236. package/src/hooks/notifications.ts +0 -108
  237. package/src/hooks/oob.ts +0 -17
  238. package/src/hooks/proof-request-templates.ts +0 -40
  239. package/src/hooks/proofs.ts +0 -32
  240. package/src/hooks/screen-capture.ts +0 -52
  241. package/src/hooks/useBifoldAgentSetup.ts +0 -169
  242. package/src/hooks/useOnboardingState.ts +0 -53
  243. package/src/hooks/usePINValidation.ts +0 -98
  244. package/src/index.ts +0 -239
  245. package/src/layout/ScreenLayout.tsx +0 -53
  246. package/src/localization/en/en.json +0 -951
  247. package/src/localization/en/index.ts +0 -3
  248. package/src/localization/fr/fr.json +0 -933
  249. package/src/localization/fr/index.ts +0 -3
  250. package/src/localization/index.ts +0 -66
  251. package/src/localization/pt-br/index.ts +0 -3
  252. package/src/localization/pt-br/pt-br.json +0 -911
  253. package/src/modules/history/context/historyManager.tsx +0 -247
  254. package/src/modules/history/index.ts +0 -2
  255. package/src/modules/history/navigation/HistoryStack.tsx +0 -29
  256. package/src/modules/history/services/queue.service.tsx +0 -31
  257. package/src/modules/history/types/index.ts +0 -92
  258. package/src/modules/history/ui/HistoryPage.tsx +0 -133
  259. package/src/modules/history/ui/HistorySettings.tsx +0 -183
  260. package/src/modules/history/ui/assets/img/HistoryCardAcceptedIcon.svg +0 -4
  261. package/src/modules/history/ui/assets/img/HistoryCardExpiredIcon.svg +0 -4
  262. package/src/modules/history/ui/assets/img/HistoryCardRevokedIcon.svg +0 -4
  263. package/src/modules/history/ui/assets/img/HistoryInformationSentIcon.svg +0 -4
  264. package/src/modules/history/ui/assets/img/HistoryPinUpdatedIcon.svg +0 -4
  265. package/src/modules/history/ui/assets/img/IconChevronRight.svg +0 -3
  266. package/src/modules/history/ui/components/BulletPoint.tsx +0 -49
  267. package/src/modules/history/ui/components/HistoryListItem.tsx +0 -251
  268. package/src/modules/history/ui/components/HistoryMenu.tsx +0 -25
  269. package/src/modules/history/ui/components/SingleSelectBlock.tsx +0 -72
  270. package/src/modules/openid/components/CredentialRowCard.tsx +0 -64
  271. package/src/modules/openid/components/OpenIDCredentialCard.tsx +0 -276
  272. package/src/modules/openid/context/OpenIDCredentialRecordProvider.tsx +0 -296
  273. package/src/modules/openid/display.tsx +0 -467
  274. package/src/modules/openid/displayProof.tsx +0 -86
  275. package/src/modules/openid/hooks/openid.tsx +0 -111
  276. package/src/modules/openid/metadata.tsx +0 -59
  277. package/src/modules/openid/offerResolve.tsx +0 -281
  278. package/src/modules/openid/resolverProof.tsx +0 -286
  279. package/src/modules/openid/screens/OpenIDCredentialDetails.tsx +0 -214
  280. package/src/modules/openid/screens/OpenIDCredentialOffer.tsx +0 -192
  281. package/src/modules/openid/screens/OpenIDProofChangeCredential.tsx +0 -133
  282. package/src/modules/openid/screens/OpenIDProofPresentation.tsx +0 -423
  283. package/src/modules/openid/types.tsx +0 -111
  284. package/src/modules/openid/utils/utils.tsx +0 -119
  285. package/src/navigators/ConnectStack.tsx +0 -68
  286. package/src/navigators/ContactStack.tsx +0 -91
  287. package/src/navigators/CredentialStack.tsx +0 -48
  288. package/src/navigators/DeliveryStack.tsx +0 -76
  289. package/src/navigators/HomeStack.tsx +0 -37
  290. package/src/navigators/MainStack.tsx +0 -146
  291. package/src/navigators/NotificationStack.tsx +0 -56
  292. package/src/navigators/OnboardingScreens.ts +0 -142
  293. package/src/navigators/OnboardingStack.tsx +0 -205
  294. package/src/navigators/ProofRequestStack.tsx +0 -113
  295. package/src/navigators/RootStack.tsx +0 -71
  296. package/src/navigators/SettingStack.tsx +0 -174
  297. package/src/navigators/TabStack.tsx +0 -304
  298. package/src/navigators/defaultLayoutOptions.tsx +0 -17
  299. package/src/navigators/defaultStackOptions.tsx +0 -102
  300. package/src/navigators/index.ts +0 -27
  301. package/src/onboarding.ts +0 -90
  302. package/src/screens/AttemptLockout.tsx +0 -153
  303. package/src/screens/AutoLock.tsx +0 -140
  304. package/src/screens/Biometry.tsx +0 -54
  305. package/src/screens/Chat.tsx +0 -141
  306. package/src/screens/ConfigureMediator.tsx +0 -160
  307. package/src/screens/Connection.tsx +0 -394
  308. package/src/screens/ContactDetails.tsx +0 -350
  309. package/src/screens/CredentialDetails.tsx +0 -473
  310. package/src/screens/CredentialOffer.tsx +0 -334
  311. package/src/screens/CredentialOfferAccept.tsx +0 -189
  312. package/src/screens/DataRetention.tsx +0 -91
  313. package/src/screens/Developer.tsx +0 -289
  314. package/src/screens/Home.tsx +0 -173
  315. package/src/screens/JSONDetails.tsx +0 -104
  316. package/src/screens/Language.tsx +0 -97
  317. package/src/screens/ListContacts.tsx +0 -112
  318. package/src/screens/ListCredentials.tsx +0 -135
  319. package/src/screens/ListProofRequests.tsx +0 -148
  320. package/src/screens/MobileVerifierLoading.tsx +0 -106
  321. package/src/screens/NameWallet.tsx +0 -9
  322. package/src/screens/Onboarding.tsx +0 -162
  323. package/src/screens/OnboardingPages.tsx +0 -160
  324. package/src/screens/PINChange.tsx +0 -249
  325. package/src/screens/PINCreate.tsx +0 -185
  326. package/src/screens/PINEnter.tsx +0 -432
  327. package/src/screens/PINExplainer.tsx +0 -85
  328. package/src/screens/PINVerify.tsx +0 -195
  329. package/src/screens/PasteUrl.tsx +0 -140
  330. package/src/screens/Preface.tsx +0 -78
  331. package/src/screens/ProofChangeCredential.tsx +0 -179
  332. package/src/screens/ProofDetails.tsx +0 -348
  333. package/src/screens/ProofRequest.tsx +0 -999
  334. package/src/screens/ProofRequestAccept.tsx +0 -133
  335. package/src/screens/ProofRequestDetails.tsx +0 -270
  336. package/src/screens/ProofRequestUsageHistory.tsx +0 -152
  337. package/src/screens/ProofRequesting.tsx +0 -245
  338. package/src/screens/PushNotifications.tsx +0 -59
  339. package/src/screens/RenameContact.tsx +0 -155
  340. package/src/screens/RenameWallet.tsx +0 -26
  341. package/src/screens/Scan.tsx +0 -145
  342. package/src/screens/ScanHelp.tsx +0 -48
  343. package/src/screens/Settings.tsx +0 -415
  344. package/src/screens/Splash.tsx +0 -80
  345. package/src/screens/Terms.tsx +0 -127
  346. package/src/screens/ToggleBiometry.tsx +0 -153
  347. package/src/screens/TogglePushNotifications.tsx +0 -118
  348. package/src/screens/Tours.tsx +0 -93
  349. package/src/screens/UpdateAvailable.tsx +0 -119
  350. package/src/screens/WhatAreContacts.tsx +0 -71
  351. package/src/services/bifoldLogger.ts +0 -3
  352. package/src/services/keychain.ts +0 -184
  353. package/src/services/logger.ts +0 -89
  354. package/src/services/storage.ts +0 -136
  355. package/src/theme-builder.ts +0 -157
  356. package/src/theme.interface.ts +0 -580
  357. package/src/theme.ts +0 -1346
  358. package/src/types/attempt-lockout-config.ts +0 -8
  359. package/src/types/attestation.ts +0 -17
  360. package/src/types/chat.ts +0 -4
  361. package/src/types/config.ts +0 -64
  362. package/src/types/contact-details.ts +0 -5
  363. package/src/types/credential-list-footer.ts +0 -3
  364. package/src/types/credential-status.ts +0 -3
  365. package/src/types/credentials.ts +0 -7
  366. package/src/types/decline.ts +0 -5
  367. package/src/types/error.ts +0 -40
  368. package/src/types/fn.ts +0 -2
  369. package/src/types/genesis.ts +0 -35
  370. package/src/types/index.ts +0 -2
  371. package/src/types/metadata.ts +0 -16
  372. package/src/types/navigators.ts +0 -239
  373. package/src/types/notification.ts +0 -24
  374. package/src/types/permissions.ts +0 -2
  375. package/src/types/proof-items.ts +0 -32
  376. package/src/types/react-i18next.d.ts +0 -10
  377. package/src/types/remove.ts +0 -8
  378. package/src/types/security.ts +0 -32
  379. package/src/types/settings.ts +0 -28
  380. package/src/types/state.ts +0 -97
  381. package/src/types/tour.ts +0 -20
  382. package/src/types/version-check.ts +0 -18
  383. package/src/utils/PINValidation.ts +0 -98
  384. package/src/utils/agent.ts +0 -128
  385. package/src/utils/anonCredsProofRequestMapper.ts +0 -205
  386. package/src/utils/contacts.ts +0 -59
  387. package/src/utils/cred-def.ts +0 -33
  388. package/src/utils/credential.ts +0 -37
  389. package/src/utils/crypto.ts +0 -12
  390. package/src/utils/fileCache.ts +0 -152
  391. package/src/utils/helpers.ts +0 -1292
  392. package/src/utils/ledger.ts +0 -212
  393. package/src/utils/luminance.ts +0 -40
  394. package/src/utils/mediatorhelpers.ts +0 -71
  395. package/src/utils/migration.ts +0 -40
  396. package/src/utils/network.tsx +0 -55
  397. package/src/utils/oca.ts +0 -173
  398. package/src/utils/parsers.tsx +0 -111
  399. package/src/utils/proofBundle.ts +0 -220
  400. package/src/utils/schema.ts +0 -28
  401. package/src/utils/testable.ts +0 -17
@@ -1,999 +0,0 @@
1
- import {
2
- AnonCredsCredentialsForProofRequest,
3
- AnonCredsRequestedAttributeMatch,
4
- AnonCredsRequestedPredicateMatch,
5
- V1RequestPresentationMessage,
6
- } from '@credo-ts/anoncreds'
7
- import {
8
- CredentialExchangeRecord,
9
- CredentialRecordBinding,
10
- DifPexInputDescriptorToCredentials,
11
- CredoError,
12
- V2RequestPresentationMessage,
13
- ProofState,
14
- } from '@credo-ts/core'
15
- import { useConnectionById, useProofById } from '@credo-ts/react-hooks'
16
- import { Attribute, Predicate } from '@bifold/oca/build/legacy'
17
- import { useIsFocused } from '@react-navigation/native'
18
- import moment from 'moment'
19
- import React, { useCallback, useEffect, useMemo, useState } from 'react'
20
- import { useTranslation } from 'react-i18next'
21
- import {
22
- DeviceEventEmitter,
23
- EmitterSubscription,
24
- FlatList,
25
- ScrollView,
26
- StyleSheet,
27
- useWindowDimensions,
28
- View,
29
- } from 'react-native'
30
- import { SafeAreaView } from 'react-native-safe-area-context'
31
-
32
- import Button, { ButtonType } from '../components/buttons/Button'
33
- import { CredentialCard } from '../components/misc'
34
- import ConnectionImage from '../components/misc/ConnectionImage'
35
- import InfoBox, { InfoBoxType } from '../components/misc/InfoBox'
36
- import CommonRemoveModal from '../components/modals/CommonRemoveModal'
37
- import ProofCancelModal from '../components/modals/ProofCancelModal'
38
- import InfoTextBox from '../components/texts/InfoTextBox'
39
- import { EventTypes } from '../constants'
40
- import { TOKENS, useServices } from '../container-api'
41
- import { useNetwork } from '../contexts/network'
42
- import { DispatchAction } from '../contexts/reducers/store'
43
- import { useStore } from '../contexts/store'
44
- import { useTheme } from '../contexts/theme'
45
- import { useTour } from '../contexts/tour/tour-context'
46
- import { useOutOfBandByConnectionId } from '../hooks/connections'
47
- import { useOutOfBandByReceivedInvitationId } from '../hooks/oob'
48
- import { useAllCredentialsForProof } from '../hooks/proofs'
49
- import { AttestationEventTypes } from '../types/attestation'
50
- import { BifoldError } from '../types/error'
51
- import { Screens, Stacks, TabStacks } from '../types/navigators'
52
- import {
53
- CredentialDataForProof,
54
- ProofCredentialAttributes,
55
- ProofCredentialItems,
56
- ProofCredentialPredicates,
57
- } from '../types/proof-items'
58
- import { ModalUsage } from '../types/remove'
59
- import { useAppAgent } from '../utils/agent'
60
- import { DescriptorMetadata } from '../utils/anonCredsProofRequestMapper'
61
- import {
62
- Fields,
63
- evaluatePredicates,
64
- getConnectionName,
65
- getCredentialDefinitionIdForRecord,
66
- getCredentialSchemaIdForRecord,
67
- } from '../utils/helpers'
68
- import { testIdWithKey } from '../utils/testable'
69
- import LoadingPlaceholder, { LoadingPlaceholderWorkflowType } from '../components/views/LoadingPlaceholder'
70
-
71
- import ProofRequestAccept from './ProofRequestAccept'
72
- import { CredentialErrors } from '../components/misc/CredentialCard11'
73
- import { HistoryCardType, HistoryRecord } from '../modules/history/types'
74
- import { BaseTourID } from '../types/tour'
75
- import { ThemedText } from '../components/texts/ThemedText'
76
-
77
- type ProofRequestProps = {
78
- navigation: any
79
- proofId: string
80
- }
81
-
82
- type CredentialListProps = {
83
- header?: JSX.Element
84
- footer?: JSX.Element
85
- items: ProofCredentialItems[]
86
- missing: boolean
87
- }
88
-
89
- const ProofRequest: React.FC<ProofRequestProps> = ({ navigation, proofId }) => {
90
- const { agent } = useAppAgent()
91
- const { t } = useTranslation()
92
- const { assertNetworkConnected } = useNetwork()
93
- const { height } = useWindowDimensions()
94
- const proof = useProofById(proofId)
95
- const connection = useConnectionById(proof?.connectionId ?? '')
96
- const [pendingModalVisible, setPendingModalVisible] = useState(false)
97
- const [revocationOffense, setRevocationOffense] = useState(false)
98
- const [retrievedCredentials, setRetrievedCredentials] = useState<AnonCredsCredentialsForProofRequest>()
99
- // all credentials in the users wallet
100
- const [userCredentials, setUserCredentials] = useState<ProofCredentialItems[]>([])
101
- const [missingCredentials, setMissingCredentials] = useState<ProofCredentialItems[]>([])
102
- const [descriptorMetadata, setDescriptorMetadata] = useState<DescriptorMetadata | undefined>()
103
- const [loading, setLoading] = useState<boolean>(true)
104
- const [declineModalVisible, setDeclineModalVisible] = useState(false)
105
- const [cancelModalVisible, setCancelModalVisible] = useState(false)
106
- const { ColorPalette, ListItems, TextTheme } = useTheme()
107
- const goalCode = useOutOfBandByConnectionId(proof?.connectionId ?? '')?.outOfBandInvitation.goalCode
108
- const outOfBandInvitation = useOutOfBandByReceivedInvitationId(proof?.parentThreadId ?? '')?.outOfBandInvitation
109
- const [containsPI, setContainsPI] = useState(false)
110
- const [activeCreds, setActiveCreds] = useState<ProofCredentialItems[]>([])
111
- const [selectedCredentials, setSelectedCredentials] = useState<string[]>([])
112
- const [attestationLoading, setAttestationLoading] = useState(false)
113
- const [showDetailsModal, setShowDetailsModal] = useState(false)
114
- const [showErrorModal, setShowErrorModal] = useState(false)
115
-
116
- const [store, dispatch] = useStore()
117
- const credProofPromise = useAllCredentialsForProof(proofId)
118
- const [ConnectionAlert] = useServices([TOKENS.COMPONENT_CONNECTION_ALERT])
119
- const proofConnectionLabel = useMemo(
120
- () => getConnectionName(connection, store.preferences.alternateContactNames),
121
- [connection, store.preferences.alternateContactNames]
122
- )
123
- const { start } = useTour()
124
- const screenIsFocused = useIsFocused()
125
- const [
126
- bundleResolver,
127
- attestationMonitor,
128
- { enableTours: enableToursConfig },
129
- logger,
130
- historyManagerCurried,
131
- historyEnabled,
132
- historyEventsLogger,
133
- ] = useServices([
134
- TOKENS.UTIL_OCA_RESOLVER,
135
- TOKENS.UTIL_ATTESTATION_MONITOR,
136
- TOKENS.CONFIG,
137
- TOKENS.UTIL_LOGGER,
138
- TOKENS.FN_LOAD_HISTORY,
139
- TOKENS.HISTORY_ENABLED,
140
- TOKENS.HISTORY_EVENTS_LOGGER,
141
- ])
142
- const styles = StyleSheet.create({
143
- pageContainer: {
144
- flex: 1,
145
- },
146
- pageContent: {
147
- flexGrow: 1,
148
- justifyContent: 'space-between',
149
- },
150
- pageMargin: {
151
- marginHorizontal: 20,
152
- },
153
- pageFooter: {
154
- marginVertical: 15,
155
- },
156
- headerTextContainer: {
157
- paddingVertical: 16,
158
- },
159
- headerText: {
160
- ...ListItems.recordAttributeText,
161
- flexShrink: 1,
162
- },
163
- footerButton: {
164
- paddingTop: 10,
165
- },
166
- link: {
167
- ...ListItems.recordAttributeText,
168
- ...ListItems.recordLink,
169
- paddingVertical: 2,
170
- },
171
- valueContainer: {
172
- minHeight: ListItems.recordAttributeText.fontSize,
173
- paddingVertical: 4,
174
- },
175
- detailsButton: {
176
- ...ListItems.recordAttributeText,
177
- color: ColorPalette.brand.link,
178
- textDecorationLine: 'underline',
179
- },
180
- })
181
-
182
- useEffect(() => {
183
- if (proof && proof?.state !== ProofState.RequestReceived) {
184
- setShowErrorModal(true)
185
- }
186
- }, [t, proof])
187
-
188
- useEffect(() => {
189
- if (!attestationMonitor) {
190
- return
191
- }
192
-
193
- const handleStartedAttestation = () => {
194
- setAttestationLoading(true)
195
- }
196
-
197
- const handleStartedCompleted = () => {
198
- setAttestationLoading(false)
199
- }
200
-
201
- const handleFailedAttestation = (error: BifoldError) => {
202
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
203
- }
204
-
205
- const subscriptions = Array<EmitterSubscription>()
206
- subscriptions.push(DeviceEventEmitter.addListener(AttestationEventTypes.Started, handleStartedAttestation))
207
- subscriptions.push(DeviceEventEmitter.addListener(AttestationEventTypes.Completed, handleStartedCompleted))
208
- subscriptions.push(DeviceEventEmitter.addListener(AttestationEventTypes.FailedHandleProof, handleFailedAttestation))
209
- subscriptions.push(DeviceEventEmitter.addListener(AttestationEventTypes.FailedHandleOffer, handleFailedAttestation))
210
- subscriptions.push(
211
- DeviceEventEmitter.addListener(AttestationEventTypes.FailedRequestCredential, handleFailedAttestation)
212
- )
213
-
214
- return () => {
215
- subscriptions.forEach((subscription) => subscription.remove())
216
- }
217
- }, [attestationMonitor])
218
-
219
- useEffect(() => {
220
- const shouldShowTour = enableToursConfig && store.tours.enableTours && !store.tours.seenProofRequestTour
221
-
222
- if (shouldShowTour && screenIsFocused) {
223
- start(BaseTourID.ProofRequestTour)
224
- dispatch({
225
- type: DispatchAction.UPDATE_SEEN_PROOF_REQUEST_TOUR,
226
- payload: [true],
227
- })
228
- }
229
- }, [enableToursConfig, store.tours.enableTours, store.tours.seenProofRequestTour, screenIsFocused, start, dispatch])
230
-
231
- useEffect(() => {
232
- if (!agent || !proof) {
233
- DeviceEventEmitter.emit(
234
- EventTypes.ERROR_ADDED,
235
- new BifoldError(t('Error.Title1034'), t('Error.Message1034'), t('ProofRequest.ProofRequestNotFound'), 1034)
236
- )
237
- }
238
- }, [agent, proof, t])
239
-
240
- const containsRevokedCreds = (
241
- credExRecords: CredentialExchangeRecord[],
242
- fields: {
243
- [key: string]: Attribute[] & Predicate[]
244
- }
245
- ): boolean => {
246
- const revList = credExRecords.map((cred) => {
247
- return {
248
- id: cred.credentials.map((item) => item.credentialRecordId),
249
- revocationDate: cred.revocationNotification?.revocationDate,
250
- }
251
- })
252
-
253
- return revList.some((item) => {
254
- // no revocation date means it's not revoked, leave early
255
- if (!item.revocationDate) {
256
- return false
257
- }
258
- const revDate = moment(item.revocationDate)
259
- return item.id.some((id) => {
260
- return Object.keys(fields).some((key) => {
261
- const dateIntervals = fields[key]
262
- ?.filter((attr) => attr.credentialId === id)
263
- .map((attr) => {
264
- return {
265
- to: attr.nonRevoked?.to !== undefined ? moment.unix(attr.nonRevoked.to) : undefined,
266
- from: attr.nonRevoked?.from !== undefined ? moment.unix(attr.nonRevoked.from) : undefined,
267
- }
268
- })
269
- return dateIntervals?.some(
270
- (inter) =>
271
- (inter.to !== undefined && inter.to > revDate) || (inter.from !== undefined && inter.from > revDate)
272
- )
273
- })
274
- })
275
- })
276
- }
277
-
278
- useEffect(() => {
279
- setLoading(true)
280
- const credPromise = async () => {
281
- let value: CredentialDataForProof | undefined = undefined
282
- try {
283
- value = await credProofPromise
284
-
285
- if (!value) {
286
- return
287
- }
288
- } catch (err) {
289
- const error = new BifoldError(
290
- t('Error.Title1026'),
291
- t('Error.Message1026'),
292
- (err as Error)?.message ?? err,
293
- 1026
294
- )
295
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
296
- return
297
- }
298
-
299
- const { groupedProof, retrievedCredentials, fullCredentials, descriptorMetadata } = value
300
- setLoading(false)
301
- setDescriptorMetadata(descriptorMetadata)
302
-
303
- // Credentials that satisfy the proof request
304
- let credList: string[] = []
305
- if (selectedCredentials.length > 0) {
306
- credList = selectedCredentials
307
- } else {
308
- // we only want one of each satisfying credential
309
- groupedProof.forEach((item: any) => {
310
- const credId = item.altCredentials?.[0]
311
- if (credId && !credList.includes(credId)) {
312
- credList.push(credId)
313
- }
314
- })
315
- }
316
-
317
- const formatCredentials = (
318
- retrievedItems: Record<string, (AnonCredsRequestedAttributeMatch | AnonCredsRequestedPredicateMatch)[]>,
319
- credList: string[]
320
- ) => {
321
- return Object.keys(retrievedItems)
322
- .map((key) => {
323
- return {
324
- [key]: retrievedItems[key].filter((attr) => credList.includes(attr.credentialId)),
325
- }
326
- })
327
- .reduce((prev, curr) => {
328
- return {
329
- ...prev,
330
- ...curr,
331
- }
332
- }, {})
333
- }
334
-
335
- const selectRetrievedCredentials: AnonCredsCredentialsForProofRequest | undefined = retrievedCredentials
336
- ? {
337
- ...retrievedCredentials,
338
- attributes: formatCredentials(retrievedCredentials.attributes, credList) as Record<
339
- string,
340
- AnonCredsRequestedAttributeMatch[]
341
- >,
342
- predicates: formatCredentials(retrievedCredentials.predicates, credList) as Record<
343
- string,
344
- AnonCredsRequestedPredicateMatch[]
345
- >,
346
- }
347
- : undefined
348
-
349
- setRetrievedCredentials(selectRetrievedCredentials)
350
-
351
- const activeCreds = groupedProof.filter((item: any) => credList.includes(item.credId))
352
- setActiveCreds(activeCreds)
353
-
354
- const unpackCredToField = (
355
- credentials: (ProofCredentialAttributes & ProofCredentialPredicates)[]
356
- ): { [key: string]: Attribute[] & Predicate[] } => {
357
- return credentials.reduce((prev, current) => {
358
- return { ...prev, [current.credId]: current.attributes ?? current.predicates ?? [] }
359
- }, {})
360
- }
361
-
362
- const userCredentials: ProofCredentialItems[] = []
363
- const missingCredentials: ProofCredentialItems[] = []
364
- const schemaIds = new Set(
365
- fullCredentials
366
- .map((fullCredential: CredentialExchangeRecord) => getCredentialSchemaIdForRecord(fullCredential))
367
- .filter((id) => id !== null)
368
- )
369
- const credDefIds = new Set(
370
- fullCredentials
371
- .map((fullCredential: CredentialExchangeRecord) => getCredentialDefinitionIdForRecord(fullCredential))
372
- .filter((id) => id !== null)
373
- )
374
- activeCreds.forEach((cred) => {
375
- const isMissing = !schemaIds.has(cred.schemaId ?? '') && !credDefIds.has(cred.credDefId ?? '')
376
- const isUserCredential = schemaIds.has(cred.schemaId ?? '') || credDefIds.has(cred.credDefId ?? '')
377
-
378
- if (isMissing && !cred.credExchangeRecord) {
379
- missingCredentials.push(cred)
380
- }
381
-
382
- if (isUserCredential || cred.credExchangeRecord) {
383
- userCredentials.push(cred)
384
- }
385
- })
386
- setUserCredentials(userCredentials)
387
- setMissingCredentials(missingCredentials)
388
-
389
- // Check for revoked credentials
390
- const records = fullCredentials.filter((record: CredentialExchangeRecord) =>
391
- record.credentials.some((cred: CredentialRecordBinding) => credList.includes(cred.credentialRecordId))
392
- )
393
- const foundRevocationOffense = containsRevokedCreds(records, unpackCredToField(activeCreds))
394
- setRevocationOffense(foundRevocationOffense)
395
- }
396
-
397
- credPromise()
398
- }, [selectedCredentials, credProofPromise, t])
399
-
400
- const toggleDeclineModalVisible = useCallback(() => setDeclineModalVisible((prev) => !prev), [])
401
- const toggleCancelModalVisible = useCallback(() => setCancelModalVisible((prev) => !prev), [])
402
-
403
- const getCredentialsFields = useCallback(
404
- (): Fields => ({
405
- ...retrievedCredentials?.attributes,
406
- ...retrievedCredentials?.predicates,
407
- }),
408
- [retrievedCredentials]
409
- )
410
-
411
- useEffect(() => {
412
- // get oca bundle to see if we're presenting personally identifiable elements
413
- activeCreds.some(async (item) => {
414
- if (!item || !(item.credDefId || item.schemaId)) {
415
- return false
416
- }
417
- const labels = (item.attributes ?? []).map((field) => field.label ?? field.name ?? '')
418
- const bundle = await bundleResolver.resolveAllBundles({
419
- identifiers: { credentialDefinitionId: item.credDefId, schemaId: item.schemaId },
420
- })
421
- const flaggedAttributes: string[] = (bundle as any).bundle.bundle.flaggedAttributes.map((attr: any) => attr.name)
422
- const foundPI = labels.some((label) => flaggedAttributes.includes(label))
423
- setContainsPI(foundPI)
424
- return foundPI
425
- })
426
- }, [activeCreds, bundleResolver])
427
-
428
- const hasAvailableCredentials = useMemo(() => {
429
- const fields = getCredentialsFields()
430
-
431
- return !!retrievedCredentials && Object.values(fields).every((c) => c.length > 0)
432
- }, [retrievedCredentials, getCredentialsFields])
433
-
434
- const hasSatisfiedPredicates = useCallback(
435
- (fields: Fields, credId?: string) => {
436
- return activeCreds.flatMap((item) => evaluatePredicates(fields, credId)(item)).every((p) => p.satisfied)
437
- },
438
- [activeCreds]
439
- )
440
-
441
- const logHistoryRecord = useCallback(
442
- async (type: HistoryCardType) => {
443
- try {
444
- if (!(agent && historyEnabled)) {
445
- logger.trace(
446
- `[${ProofRequest.name}]:[logHistoryRecord] Skipping history log, either history function disabled or agent undefined!`
447
- )
448
- return
449
- }
450
- const historyManager = historyManagerCurried(agent)
451
-
452
- if (!proof) {
453
- logger.error(`[${ProofRequest.name}]:[logHistoryRecord] Cannot save history, proof undefined!`)
454
- return
455
- }
456
-
457
- let message: V2RequestPresentationMessage | V1RequestPresentationMessage | null | undefined
458
- try {
459
- message = await agent?.proofs.findRequestMessage(proofId)
460
- } catch (error) {
461
- logger.error('Error finding request message:', error as CredoError)
462
- }
463
-
464
- /** Save history record for proof accepted/declined */
465
- const recordData: HistoryRecord = {
466
- type: type,
467
- message: message?.comment ?? '',
468
- createdAt: proof.createdAt,
469
- correspondenceId: proofId,
470
- correspondenceName: proofConnectionLabel,
471
- }
472
- historyManager.saveHistory(recordData)
473
- } catch (err: unknown) {
474
- logger.error(`[${ProofRequest.name}]:[logHistoryRecord] Error saving history: ${err}`)
475
- }
476
- },
477
- [agent, historyEnabled, logger, historyManagerCurried, proof, proofId, proofConnectionLabel]
478
- )
479
-
480
- const handleAcceptPress = useCallback(async () => {
481
- try {
482
- if (!(agent && proof && assertNetworkConnected())) {
483
- return
484
- }
485
- setPendingModalVisible(true)
486
-
487
- if (!retrievedCredentials) {
488
- throw new Error(t('ProofRequest.RequestedCredentialsCouldNotBeFound'))
489
- }
490
- const format = await agent.proofs.getFormatData(proof.id)
491
-
492
- if (format.request?.presentationExchange) {
493
- if (!descriptorMetadata) throw new Error(t('ProofRequest.PresentationMetadataNotFound'))
494
-
495
- const selectedCredentials: DifPexInputDescriptorToCredentials = Object.fromEntries(
496
- Object.entries(descriptorMetadata).map(([descriptorId, meta]) => {
497
- const activeCredentialIds = activeCreds.map((cred) => cred.credId)
498
- const selectedRecord = meta.find((item) => activeCredentialIds.includes(item.record.id))
499
- if (!selectedRecord) throw new Error(t('ProofRequest.CredentialMetadataNotFound'))
500
- return [descriptorId, [selectedRecord.record]]
501
- })
502
- )
503
-
504
- await agent.proofs.acceptRequest({
505
- proofRecordId: proof.id,
506
- proofFormats: { presentationExchange: { credentials: selectedCredentials } },
507
- })
508
-
509
- if (proof.connectionId && goalCode?.endsWith('verify.once')) {
510
- agent.connections.deleteById(proof.connectionId)
511
- }
512
- return
513
- }
514
-
515
- const formatToUse = format.request?.anoncreds ? 'anoncreds' : 'indy'
516
-
517
- const formatCredentials = (
518
- retrievedItems: Record<string, (AnonCredsRequestedAttributeMatch | AnonCredsRequestedPredicateMatch)[]>,
519
- credList: string[]
520
- ) => {
521
- return Object.keys(retrievedItems)
522
- .map((key) => {
523
- return {
524
- [key]: retrievedItems[key].find((cred) => credList.includes(cred.credentialId)),
525
- }
526
- })
527
- .reduce((prev, current) => {
528
- return { ...prev, ...current }
529
- }, {})
530
- }
531
-
532
- // this is the best way to supply our desired credentials in the proof, otherwise it selects them automatically
533
- const credObject = {
534
- ...retrievedCredentials,
535
- attributes: formatCredentials(
536
- retrievedCredentials.attributes,
537
- activeCreds.map((item) => item.credId)
538
- ),
539
- predicates: formatCredentials(
540
- retrievedCredentials.predicates,
541
- activeCreds.map((item) => item.credId)
542
- ),
543
- selfAttestedAttributes: {},
544
- }
545
- const automaticRequestedCreds = { proofFormats: { [formatToUse]: { ...credObject } } }
546
-
547
- if (!automaticRequestedCreds) {
548
- throw new Error(t('ProofRequest.RequestedCredentialsCouldNotBeFound'))
549
- }
550
-
551
- await agent.proofs.acceptRequest({
552
- proofRecordId: proof.id,
553
- proofFormats: automaticRequestedCreds.proofFormats,
554
- })
555
- if (proof.connectionId && goalCode?.endsWith('verify.once')) {
556
- agent.connections.deleteById(proof.connectionId)
557
- }
558
-
559
- if (historyEventsLogger.logInformationSent) {
560
- logHistoryRecord(HistoryCardType.InformationSent)
561
- }
562
- } catch (err: unknown) {
563
- setPendingModalVisible(false)
564
- const error = new BifoldError(t('Error.Title1027'), t('Error.Message1027'), (err as Error)?.message ?? err, 1027)
565
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
566
- }
567
- }, [
568
- agent,
569
- proof,
570
- assertNetworkConnected,
571
- retrievedCredentials,
572
- activeCreds,
573
- descriptorMetadata,
574
- goalCode,
575
- t,
576
- historyEventsLogger.logInformationSent,
577
- logHistoryRecord,
578
- ])
579
-
580
- const handleDeclineTouched = useCallback(async () => {
581
- try {
582
- if (agent && proof) {
583
- const connectionId = proof.connectionId ?? ''
584
- const connection = await agent.connections.findById(connectionId)
585
-
586
- if (connection) {
587
- await agent.proofs.sendProblemReport({ proofRecordId: proof.id, description: t('ProofRequest.Declined') })
588
- }
589
-
590
- await agent.proofs.declineRequest({ proofRecordId: proof.id })
591
-
592
- if (connectionId && goalCode?.endsWith('verify.once')) {
593
- agent.connections.deleteById(connectionId)
594
- }
595
- }
596
- } catch (err: unknown) {
597
- const error = new BifoldError(t('Error.Title1028'), t('Error.Message1028'), (err as Error)?.message ?? err, 1028)
598
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
599
- }
600
-
601
- toggleDeclineModalVisible()
602
-
603
- if (historyEventsLogger.logInformationNotSent) {
604
- logHistoryRecord(HistoryCardType.InformationNotSent)
605
- }
606
- navigation.getParent()?.navigate(TabStacks.HomeStack, { screen: Screens.Home })
607
- }, [
608
- agent,
609
- proof,
610
- goalCode,
611
- t,
612
- navigation,
613
- toggleDeclineModalVisible,
614
- historyEventsLogger.logInformationNotSent,
615
- logHistoryRecord,
616
- ])
617
-
618
- const handleCancelTouched = useCallback(async () => {
619
- try {
620
- toggleCancelModalVisible()
621
-
622
- if (agent && proof) {
623
- await agent.proofs.sendProblemReport({ proofRecordId: proof.id, description: t('ProofRequest.Declined') })
624
- await agent.proofs.declineRequest({ proofRecordId: proof.id })
625
-
626
- if (proof.connectionId && goalCode?.endsWith('verify.once')) {
627
- agent.connections.deleteById(proof.connectionId)
628
- }
629
- }
630
- } catch (err: unknown) {
631
- const error = new BifoldError(t('Error.Title1028'), t('Error.Message1028'), (err as Error)?.message ?? err, 1028)
632
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
633
- }
634
- }, [toggleCancelModalVisible, agent, proof, t, goalCode])
635
-
636
- const onCancelDone = useCallback(() => {
637
- navigation.getParent()?.navigate(TabStacks.HomeStack, { screen: Screens.Home })
638
- }, [navigation])
639
-
640
- const callViewJSONDetails = useCallback(() => {
641
- navigation.navigate(Stacks.ContactStack, {
642
- screen: Screens.JSONDetails,
643
- params: {
644
- jsonBlob:
645
- '"proof":' +
646
- JSON.stringify(proof, null, 2) +
647
- '\n"retrievedCredentials":' +
648
- JSON.stringify(retrievedCredentials, null, 2),
649
- },
650
- })
651
- }, [navigation, proof, retrievedCredentials])
652
-
653
- const shareDisabledErrors = useMemo(() => {
654
- return {
655
- hasCredentialError: !hasAvailableCredentials,
656
- hasSatisfiedPredicateError: !hasSatisfiedPredicates(getCredentialsFields()),
657
- hasRevokedOffense: revocationOffense,
658
- hasProofStateReceivedError: proof?.state !== ProofState.RequestReceived,
659
- }
660
- }, [hasAvailableCredentials, hasSatisfiedPredicates, getCredentialsFields, revocationOffense, proof])
661
-
662
- const isShareDisabled = useMemo(() => {
663
- return Object.values(shareDisabledErrors).some((value) => value)
664
- }, [shareDisabledErrors])
665
-
666
- const proofPageHeader = () => {
667
- return (
668
- <>
669
- {attestationLoading && (
670
- <View style={{ padding: 20 }}>
671
- <InfoTextBox>{t('ProofRequest.JustAMoment')}</InfoTextBox>
672
- </View>
673
- )}
674
- {loading || attestationLoading ? (
675
- <LoadingPlaceholder
676
- workflowType={LoadingPlaceholderWorkflowType.ProofRequested}
677
- timeoutDurationInMs={10000}
678
- loadingProgressPercent={30}
679
- onCancelTouched={async () => {
680
- await handleDeclineTouched()
681
- }}
682
- testID={testIdWithKey('ProofRequestLoading')}
683
- />
684
- ) : (
685
- <View style={styles.pageMargin}>
686
- <ConnectionImage connectionId={proof?.connectionId} />
687
- <View style={styles.headerTextContainer}>
688
- <ThemedText style={styles.headerText} testID={testIdWithKey('HeaderText')}>
689
- <ThemedText variant="title">
690
- {proofConnectionLabel || outOfBandInvitation?.label || t('ContactDetails.AContact')}
691
- </ThemedText>{' '}
692
- <ThemedText>{t('ProofRequest.IsRequestingYouToShare')}</ThemedText>
693
- <ThemedText variant="title">{` ${activeCreds?.length} `}</ThemedText>
694
- <ThemedText>
695
- {activeCreds?.length > 1 ? t('ProofRequest.Credentials') : t('ProofRequest.Credential')}
696
- </ThemedText>
697
- </ThemedText>
698
- {isShareDisabled && (
699
- <InfoTextBox type={InfoBoxType.Error} style={{ marginTop: 16 }} textStyle={{ fontWeight: 'normal' }}>
700
- <View style={{ flex: 1, flexWrap: 'wrap' }}>
701
- <ThemedText
702
- style={{
703
- alignSelf: 'center',
704
- flex: 1,
705
- flexWrap: 'wrap',
706
- color: ColorPalette.notification.errorText,
707
- }}
708
- >
709
- {t('ProofRequest.YouCantRespond')}{' '}
710
- <ThemedText
711
- style={{
712
- fontWeight: TextTheme.normal.fontWeight,
713
- color: ColorPalette.brand.link,
714
- }}
715
- onPress={() => setShowDetailsModal(true)}
716
- >
717
- {t('Global.ShowDetails')}
718
- </ThemedText>
719
- </ThemedText>
720
- </View>
721
- </InfoTextBox>
722
- )}
723
- </View>
724
- </View>
725
- )}
726
- </>
727
- )
728
- }
729
-
730
- const shareDisabledMessage = useMemo(() => {
731
- let finalMessage = `${t('ProofRequest.YouCantRespondReasons')}\n`
732
-
733
- if (shareDisabledErrors.hasCredentialError) {
734
- finalMessage += `\n \u2022 ${t('ProofRequest.CredentialIsMissing')}`
735
- }
736
- if (shareDisabledErrors.hasSatisfiedPredicateError) {
737
- finalMessage += `\n \u2022 ${t('ProofRequest.ProofRequestPredicateError')}`
738
- }
739
- if (shareDisabledErrors.hasRevokedOffense) {
740
- finalMessage += `\n \u2022 ${t('ProofRequest.CredentialForProofIsRevoked')}`
741
- }
742
- if (shareDisabledErrors.hasProofStateReceivedError) {
743
- finalMessage += `\n \u2022 ${t('ProofRequest.ProofRequestStateError', { state: proof?.state })}`
744
- }
745
-
746
- finalMessage += `\n\n${t('ProofRequest.PleaseAddress')}`
747
- return finalMessage
748
- }, [t, shareDisabledErrors, proof])
749
-
750
- const handleAltCredChange = useCallback(
751
- (selectedCred: string, altCredentials: string[]) => {
752
- const onCredChange = (cred: string) => {
753
- const newSelectedCreds = (
754
- selectedCredentials.length > 0 ? selectedCredentials : activeCreds.map((item) => item.credId)
755
- ).filter((id) => !altCredentials.includes(id))
756
- setSelectedCredentials([cred, ...newSelectedCreds])
757
- }
758
- navigation.getParent()?.navigate(Stacks.ProofRequestsStack, {
759
- screen: Screens.ProofChangeCredential,
760
- params: {
761
- selectedCred,
762
- altCredentials,
763
- proofId,
764
- onCredChange,
765
- },
766
- })
767
- },
768
- [selectedCredentials, activeCreds, proofId, navigation]
769
- )
770
-
771
- const proofPageFooter = () => {
772
- return (
773
- <View style={[styles.pageFooter, styles.pageMargin]}>
774
- {containsPI && (
775
- <InfoTextBox
776
- type={InfoBoxType.Warn}
777
- style={{ marginTop: 16 }}
778
- textStyle={{ fontSize: TextTheme.title.fontSize }}
779
- >
780
- {t('ProofRequest.SensitiveInformation')}
781
- </InfoTextBox>
782
- )}
783
- {!loading && Boolean(proofConnectionLabel) && goalCode === 'aries.vc.verify' && (
784
- <ConnectionAlert connectionLabel={proofConnectionLabel} />
785
- )}
786
- {!loading && isShareDisabled ? (
787
- <View style={styles.footerButton}>
788
- <Button
789
- title={t('Global.Cancel')}
790
- accessibilityLabel={t('Global.Cancel')}
791
- testID={testIdWithKey('Cancel')}
792
- buttonType={ButtonType.Primary}
793
- onPress={handleCancelTouched}
794
- />
795
- </View>
796
- ) : (
797
- <>
798
- {!loading && (
799
- <>
800
- <View style={styles.footerButton}>
801
- <Button
802
- title={t('Global.Share')}
803
- accessibilityLabel={t('Global.Share')}
804
- testID={testIdWithKey('Share')}
805
- buttonType={ButtonType.Primary}
806
- onPress={handleAcceptPress}
807
- />
808
- </View>
809
- <View style={styles.footerButton}>
810
- <Button
811
- title={t('Global.Decline')}
812
- accessibilityLabel={t('Global.Decline')}
813
- testID={testIdWithKey('Decline')}
814
- buttonType={!retrievedCredentials ? ButtonType.Primary : ButtonType.Secondary}
815
- onPress={toggleDeclineModalVisible}
816
- />
817
- </View>
818
- {store.preferences.developerModeEnabled && (
819
- <>
820
- <View style={styles.footerButton}>
821
- <Button
822
- title={t('Global.ViewJSON')}
823
- accessibilityLabel={t('Global.ViewJSON')}
824
- testID={testIdWithKey('JSONDetails')}
825
- buttonType={ButtonType.Secondary}
826
- onPress={callViewJSONDetails}
827
- />
828
- </View>
829
- </>
830
- )}
831
- </>
832
- )}
833
- </>
834
- )}
835
- </View>
836
- )
837
- }
838
-
839
- const CredentialList: React.FC<CredentialListProps> = ({ header, footer, items, missing }) => {
840
- return (
841
- <FlatList
842
- data={items}
843
- scrollEnabled={false}
844
- ListHeaderComponent={header}
845
- ListFooterComponent={footer}
846
- renderItem={({ item }) => {
847
- const errors: CredentialErrors[] = []
848
- missing && errors.push(CredentialErrors.NotInWallet)
849
- item.credExchangeRecord?.revocationNotification?.revocationDate && errors.push(CredentialErrors.Revoked)
850
- !hasSatisfiedPredicates(getCredentialsFields(), item.credId) && errors.push(CredentialErrors.PredicateError)
851
- return (
852
- <View>
853
- {loading || attestationLoading ? null : (
854
- <View style={{ marginVertical: 10, marginHorizontal: 20 }}>
855
- <CredentialCard
856
- credential={item.credExchangeRecord}
857
- credDefId={item.credDefId}
858
- schemaId={item.schemaId}
859
- displayItems={[
860
- ...(item.attributes ?? []),
861
- ...evaluatePredicates(getCredentialsFields(), item.credId)(item),
862
- ]}
863
- credName={item.credName}
864
- hasAltCredentials={item.altCredentials && item.altCredentials.length > 1}
865
- handleAltCredChange={
866
- item.altCredentials && item.altCredentials.length > 1
867
- ? () => {
868
- handleAltCredChange(item.credId, item.altCredentials ?? [item.credId])
869
- }
870
- : undefined
871
- }
872
- proof
873
- credentialErrors={errors}
874
- />
875
- </View>
876
- )}
877
- </View>
878
- )
879
- }}
880
- />
881
- )
882
- }
883
-
884
- const credentialListHeader = (headerText: string) => {
885
- return (
886
- <View style={styles.pageMargin}>
887
- {!(loading || attestationLoading) && (
888
- <ThemedText
889
- variant="title"
890
- testID={testIdWithKey('ProofRequestHeaderText')}
891
- style={{
892
- marginTop: 10,
893
- }}
894
- >
895
- {headerText}
896
- </ThemedText>
897
- )}
898
- </View>
899
- )
900
- }
901
- return (
902
- <SafeAreaView style={styles.pageContainer} edges={['bottom', 'left', 'right']}>
903
- {showErrorModal && (
904
- <SafeAreaView
905
- style={{
906
- minHeight: height,
907
- flexDirection: 'column',
908
- justifyContent: 'center',
909
- alignItems: 'center',
910
- backgroundColor: ColorPalette.brand.primaryBackground,
911
- }}
912
- >
913
- <InfoBox
914
- title={t('Error.Title1027')}
915
- description={t('ProofRequest.ProofRequestErrorMessage')}
916
- message={t('ProofRequest.ProofRequestStateError', { state: proof?.state })}
917
- notificationType={InfoBoxType.Error}
918
- onCallToActionLabel={t('Global.TryAgain')}
919
- onCallToActionPressed={() => {
920
- setShowErrorModal(false)
921
- handleCancelTouched()
922
- }}
923
- showVersionFooter={true}
924
- />
925
- </SafeAreaView>
926
- )}
927
- {showDetailsModal && (
928
- <SafeAreaView
929
- style={{
930
- minHeight: height,
931
- flexDirection: 'column',
932
- justifyContent: 'center',
933
- alignItems: 'center',
934
- backgroundColor: ColorPalette.brand.primaryBackground,
935
- }}
936
- >
937
- <InfoBox
938
- title={t('Error.Title1027')}
939
- description={t('ProofRequest.ProofRequestErrorMessage')}
940
- message={shareDisabledMessage}
941
- notificationType={InfoBoxType.Error}
942
- onCallToActionPressed={() => setShowDetailsModal(false)}
943
- onCallToActionLabel={t('Global.GotIt')}
944
- showVersionFooter={true}
945
- renderShowDetails={true}
946
- onClosePressed={() => setShowDetailsModal(false)}
947
- />
948
- </SafeAreaView>
949
- )}
950
- <ScrollView>
951
- <View style={styles.pageContent}>
952
- {proofPageHeader()}
953
- {/* This list will render if any credentials in a proof request are not in the users wallet */}
954
- <CredentialList
955
- header={
956
- missingCredentials.length > 0 && userCredentials.length > 0
957
- ? credentialListHeader(t('ProofRequest.MissingCredentials'))
958
- : undefined
959
- }
960
- items={missingCredentials}
961
- missing={true}
962
- footer={
963
- missingCredentials.length > 0 && userCredentials.length > 0 ? (
964
- <View
965
- style={{
966
- width: 'auto',
967
- borderWidth: 1,
968
- borderColor: ColorPalette.grayscale.lightGrey,
969
- marginTop: 20,
970
- }}
971
- />
972
- ) : undefined
973
- }
974
- />
975
- <CredentialList
976
- header={
977
- missingCredentials.length > 0 && userCredentials.length > 0
978
- ? credentialListHeader(t('ProofRequest.FromYourWallet'))
979
- : undefined
980
- }
981
- items={userCredentials}
982
- missing={false}
983
- />
984
- {proofPageFooter()}
985
- </View>
986
- <ProofRequestAccept visible={pendingModalVisible} proofId={proofId} />
987
- <CommonRemoveModal
988
- usage={ModalUsage.ProofRequestDecline}
989
- visible={declineModalVisible}
990
- onSubmit={handleDeclineTouched}
991
- onCancel={toggleDeclineModalVisible}
992
- />
993
- <ProofCancelModal visible={cancelModalVisible} onDone={onCancelDone} />
994
- </ScrollView>
995
- </SafeAreaView>
996
- )
997
- }
998
-
999
- export default ProofRequest