@bifold/core 2.4.6 → 2.6.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 (461) hide show
  1. package/lib/commonjs/components/listItems/ContactCredentialListItem.js +9 -8
  2. package/lib/commonjs/components/listItems/ContactCredentialListItem.js.map +1 -1
  3. package/lib/commonjs/components/misc/CredentialCard11Logo.js +8 -7
  4. package/lib/commonjs/components/misc/CredentialCard11Logo.js.map +1 -1
  5. package/lib/commonjs/components/misc/PINHeader.js +5 -3
  6. package/lib/commonjs/components/misc/PINHeader.js.map +1 -1
  7. package/lib/commonjs/contexts/network.js +10 -9
  8. package/lib/commonjs/contexts/network.js.map +1 -1
  9. package/lib/commonjs/contexts/reducers/store.js +3 -2
  10. package/lib/commonjs/contexts/reducers/store.js.map +1 -1
  11. package/lib/commonjs/contexts/theme.js +7 -6
  12. package/lib/commonjs/contexts/theme.js.map +1 -1
  13. package/lib/commonjs/index.js +127 -104
  14. package/lib/commonjs/index.js.map +1 -1
  15. package/lib/commonjs/modules/openid/components/CredentialRowCard.js +9 -7
  16. package/lib/commonjs/modules/openid/components/CredentialRowCard.js.map +1 -1
  17. package/lib/commonjs/modules/openid/context/OpenIDCredentialRecordProvider.js +9 -8
  18. package/lib/commonjs/modules/openid/context/OpenIDCredentialRecordProvider.js.map +1 -1
  19. package/lib/commonjs/screens/AttemptLockout.js +27 -35
  20. package/lib/commonjs/screens/AttemptLockout.js.map +1 -1
  21. package/lib/commonjs/screens/ConfigureMediator.js +22 -21
  22. package/lib/commonjs/screens/ConfigureMediator.js.map +1 -1
  23. package/lib/commonjs/screens/JSONDetails.js +16 -15
  24. package/lib/commonjs/screens/JSONDetails.js.map +1 -1
  25. package/lib/commonjs/screens/MobileVerifierLoading.js +4 -3
  26. package/lib/commonjs/screens/MobileVerifierLoading.js.map +1 -1
  27. package/lib/commonjs/screens/PINCreate.js +3 -10
  28. package/lib/commonjs/screens/PINCreate.js.map +1 -1
  29. package/lib/commonjs/screens/WhatAreContacts.js +3 -2
  30. package/lib/commonjs/screens/WhatAreContacts.js.map +1 -1
  31. package/lib/commonjs/services/logger.js +35 -27
  32. package/lib/commonjs/services/logger.js.map +1 -1
  33. package/lib/module/components/listItems/ContactCredentialListItem.js +3 -3
  34. package/lib/module/components/listItems/ContactCredentialListItem.js.map +1 -1
  35. package/lib/module/components/misc/CredentialCard11Logo.js +5 -4
  36. package/lib/module/components/misc/CredentialCard11Logo.js.map +1 -1
  37. package/lib/module/components/misc/PINHeader.js +2 -1
  38. package/lib/module/components/misc/PINHeader.js.map +1 -1
  39. package/lib/module/contexts/network.js +3 -3
  40. package/lib/module/contexts/network.js.map +1 -1
  41. package/lib/module/contexts/reducers/store.js +3 -2
  42. package/lib/module/contexts/reducers/store.js.map +1 -1
  43. package/lib/module/contexts/theme.js +2 -2
  44. package/lib/module/contexts/theme.js.map +1 -1
  45. package/lib/module/index.js +43 -45
  46. package/lib/module/index.js.map +1 -1
  47. package/lib/module/modules/openid/components/CredentialRowCard.js +2 -1
  48. package/lib/module/modules/openid/components/CredentialRowCard.js.map +1 -1
  49. package/lib/module/modules/openid/context/OpenIDCredentialRecordProvider.js +5 -5
  50. package/lib/module/modules/openid/context/OpenIDCredentialRecordProvider.js.map +1 -1
  51. package/lib/module/screens/AttemptLockout.js +28 -36
  52. package/lib/module/screens/AttemptLockout.js.map +1 -1
  53. package/lib/module/screens/ConfigureMediator.js +10 -10
  54. package/lib/module/screens/ConfigureMediator.js.map +1 -1
  55. package/lib/module/screens/JSONDetails.js +9 -8
  56. package/lib/module/screens/JSONDetails.js.map +1 -1
  57. package/lib/module/screens/MobileVerifierLoading.js +4 -3
  58. package/lib/module/screens/MobileVerifierLoading.js.map +1 -1
  59. package/lib/module/screens/PINCreate.js +3 -10
  60. package/lib/module/screens/PINCreate.js.map +1 -1
  61. package/lib/module/screens/WhatAreContacts.js +3 -2
  62. package/lib/module/screens/WhatAreContacts.js.map +1 -1
  63. package/lib/module/services/logger.js +37 -28
  64. package/lib/module/services/logger.js.map +1 -1
  65. package/lib/typescript/src/components/listItems/ContactCredentialListItem.d.ts +2 -1
  66. package/lib/typescript/src/components/listItems/ContactCredentialListItem.d.ts.map +1 -1
  67. package/lib/typescript/src/components/misc/CredentialCard11Logo.d.ts +1 -0
  68. package/lib/typescript/src/components/misc/CredentialCard11Logo.d.ts.map +1 -1
  69. package/lib/typescript/src/components/misc/PINHeader.d.ts +2 -1
  70. package/lib/typescript/src/components/misc/PINHeader.d.ts.map +1 -1
  71. package/lib/typescript/src/contexts/network.d.ts +3 -3
  72. package/lib/typescript/src/contexts/network.d.ts.map +1 -1
  73. package/lib/typescript/src/contexts/reducers/store.d.ts.map +1 -1
  74. package/lib/typescript/src/contexts/theme.d.ts +2 -1
  75. package/lib/typescript/src/contexts/theme.d.ts.map +1 -1
  76. package/lib/typescript/src/index.d.ts +58 -61
  77. package/lib/typescript/src/index.d.ts.map +1 -1
  78. package/lib/typescript/src/modules/openid/components/CredentialRowCard.d.ts +2 -1
  79. package/lib/typescript/src/modules/openid/components/CredentialRowCard.d.ts.map +1 -1
  80. package/lib/typescript/src/modules/openid/context/OpenIDCredentialRecordProvider.d.ts +3 -3
  81. package/lib/typescript/src/modules/openid/context/OpenIDCredentialRecordProvider.d.ts.map +1 -1
  82. package/lib/typescript/src/screens/AttemptLockout.d.ts.map +1 -1
  83. package/lib/typescript/src/screens/ConfigureMediator.d.ts +2 -1
  84. package/lib/typescript/src/screens/ConfigureMediator.d.ts.map +1 -1
  85. package/lib/typescript/src/screens/JSONDetails.d.ts +2 -1
  86. package/lib/typescript/src/screens/JSONDetails.d.ts.map +1 -1
  87. package/lib/typescript/src/screens/MobileVerifierLoading.d.ts.map +1 -1
  88. package/lib/typescript/src/screens/PINCreate.d.ts.map +1 -1
  89. package/lib/typescript/src/screens/WhatAreContacts.d.ts.map +1 -1
  90. package/lib/typescript/src/services/logger.d.ts +7 -8
  91. package/lib/typescript/src/services/logger.d.ts.map +1 -1
  92. package/package.json +5 -6
  93. package/src/App.tsx +0 -79
  94. package/src/animated-components.ts +0 -30
  95. package/src/assets/fonts/MaterialIcons.ttf +0 -0
  96. package/src/assets/icons/code.svg +0 -4
  97. package/src/assets/icons/large-arrow.svg +0 -5
  98. package/src/assets/icons/pencil.svg +0 -15
  99. package/src/assets/icons/trash.svg +0 -31
  100. package/src/assets/img/Artwork_1024x1024.png +0 -0
  101. package/src/assets/img/HistoryCardAcceptedIcon.svg +0 -4
  102. package/src/assets/img/HistoryCardExpiredIcon.svg +0 -4
  103. package/src/assets/img/HistoryCardRevokedIcon.svg +0 -4
  104. package/src/assets/img/HistoryInformationSentIcon.svg +0 -4
  105. package/src/assets/img/HistoryPinUpdatedIcon.svg +0 -4
  106. package/src/assets/img/IconChevronRight.svg +0 -5
  107. package/src/assets/img/activity-indicator-circle.svg +0 -90
  108. package/src/assets/img/app-lockout.svg +0 -1
  109. package/src/assets/img/biometrics.svg +0 -74
  110. package/src/assets/img/chat-loading.svg +0 -1
  111. package/src/assets/img/check-in-circle.svg +0 -18
  112. package/src/assets/img/connection-pending.svg +0 -112
  113. package/src/assets/img/contact-book.svg +0 -21
  114. package/src/assets/img/credential-card.svg +0 -18
  115. package/src/assets/img/credential-declined.svg +0 -28
  116. package/src/assets/img/credential-in-hand.svg +0 -48
  117. package/src/assets/img/credential-list.svg +0 -60
  118. package/src/assets/img/credential-pending.svg +0 -96
  119. package/src/assets/img/credential-success.svg +0 -48
  120. package/src/assets/img/delete-notification.svg +0 -1
  121. package/src/assets/img/empty-wallet.svg +0 -23
  122. package/src/assets/img/error-filled.svg +0 -12
  123. package/src/assets/img/exclamation-mark.svg +0 -17
  124. package/src/assets/img/home-center-img.svg +0 -71
  125. package/src/assets/img/icon-credential-offer-dark.svg +0 -7
  126. package/src/assets/img/icon-credential-offer-light.svg +0 -7
  127. package/src/assets/img/icon-info-recieved-dark.svg +0 -8
  128. package/src/assets/img/icon-info-recieved-light.svg +0 -8
  129. package/src/assets/img/icon-info-sent-dark.svg +0 -8
  130. package/src/assets/img/icon-info-sent-light.svg +0 -8
  131. package/src/assets/img/icon-proof-request-dark.svg +0 -11
  132. package/src/assets/img/icon-proof-request-light.svg +0 -11
  133. package/src/assets/img/information-received.svg +0 -1
  134. package/src/assets/img/logo-large.png +0 -0
  135. package/src/assets/img/logo-large@2x.png +0 -0
  136. package/src/assets/img/logo-large@3x.png +0 -0
  137. package/src/assets/img/logo.svg +0 -15
  138. package/src/assets/img/message-text-icon-outline.svg +0 -1
  139. package/src/assets/img/message-text-icon.svg +0 -1
  140. package/src/assets/img/no_information_shared.svg +0 -36
  141. package/src/assets/img/preface.svg +0 -15
  142. package/src/assets/img/proof-declined.svg +0 -66
  143. package/src/assets/img/proof-pending.svg +0 -61
  144. package/src/assets/img/proof-success.svg +0 -72
  145. package/src/assets/img/push-notifications.svg +0 -1
  146. package/src/assets/img/qrcode-scan-icon.svg +0 -1
  147. package/src/assets/img/scan-share.svg +0 -102
  148. package/src/assets/img/secure-check.svg +0 -4
  149. package/src/assets/img/secure-image.svg +0 -64
  150. package/src/assets/img/update-available.svg +0 -26
  151. package/src/assets/img/verifier-request-declined.svg +0 -34
  152. package/src/assets/img/wallet-back.svg +0 -20
  153. package/src/assets/img/wallet-front.svg +0 -32
  154. package/src/assets/img/wallet-icon-outline.svg +0 -1
  155. package/src/assets/img/wallet-icon.svg +0 -1
  156. package/src/assets/img/wallet.svg +0 -43
  157. package/src/assets/oca-bundles.json +0 -174
  158. package/src/components/animated/ButtonLoading.tsx +0 -32
  159. package/src/components/animated/ConnectionLoading.tsx +0 -53
  160. package/src/components/animated/CredentialAdded.tsx +0 -72
  161. package/src/components/animated/CredentialPending.tsx +0 -63
  162. package/src/components/animated/LoadingIndicator.tsx +0 -49
  163. package/src/components/animated/PresentationLoading.tsx +0 -52
  164. package/src/components/animated/RecordLoading.tsx +0 -75
  165. package/src/components/animated/SendingProof.tsx +0 -53
  166. package/src/components/animated/SentProof.tsx +0 -72
  167. package/src/components/buttons/Button-api.tsx +0 -46
  168. package/src/components/buttons/Button.tsx +0 -125
  169. package/src/components/buttons/HeaderHome.tsx +0 -25
  170. package/src/components/buttons/IconButton.tsx +0 -93
  171. package/src/components/buttons/InfoIcon.tsx +0 -35
  172. package/src/components/buttons/SettingsMenu.tsx +0 -26
  173. package/src/components/buttons/ToggleButton.tsx +0 -93
  174. package/src/components/buttons/index.ts +0 -4
  175. package/src/components/chat/ActionSlider.tsx +0 -104
  176. package/src/components/chat/ChatActions.tsx +0 -33
  177. package/src/components/chat/ChatBubble.tsx +0 -20
  178. package/src/components/chat/ChatEvent.tsx +0 -31
  179. package/src/components/chat/ChatMessage.tsx +0 -142
  180. package/src/components/chat/MessageInput.tsx +0 -46
  181. package/src/components/chat/index.ts +0 -4
  182. package/src/components/forms/WalletNameForm.tsx +0 -148
  183. package/src/components/index.ts +0 -4
  184. package/src/components/inputs/BiometryControl.tsx +0 -190
  185. package/src/components/inputs/BulletPoint.tsx +0 -32
  186. package/src/components/inputs/CheckBoxRow.tsx +0 -67
  187. package/src/components/inputs/InlineErrorText.tsx +0 -60
  188. package/src/components/inputs/LimitedTextInput.tsx +0 -71
  189. package/src/components/inputs/PINInput.tsx +0 -175
  190. package/src/components/inputs/SingleSelectBlock.tsx +0 -53
  191. package/src/components/listItems/ContactCredentialListItem.tsx +0 -79
  192. package/src/components/listItems/ContactListItem.tsx +0 -121
  193. package/src/components/listItems/NotificationListItem.tsx +0 -514
  194. package/src/components/misc/AvatarView.tsx +0 -33
  195. package/src/components/misc/CardWatermark.tsx +0 -52
  196. package/src/components/misc/ConnectionAlert.tsx +0 -123
  197. package/src/components/misc/ConnectionImage.tsx +0 -45
  198. package/src/components/misc/ContentGradient.tsx +0 -40
  199. package/src/components/misc/CredentialCard.tsx +0 -161
  200. package/src/components/misc/CredentialCard10.tsx +0 -329
  201. package/src/components/misc/CredentialCard11.tsx +0 -701
  202. package/src/components/misc/CredentialCard11ActionFooter.tsx +0 -55
  203. package/src/components/misc/CredentialCard11Issuer.tsx +0 -74
  204. package/src/components/misc/CredentialCard11Logo.tsx +0 -61
  205. package/src/components/misc/EmptyList.tsx +0 -27
  206. package/src/components/misc/EmptyListContacts.tsx +0 -55
  207. package/src/components/misc/ErrorBoundary.tsx +0 -200
  208. package/src/components/misc/FauxHeader.tsx +0 -75
  209. package/src/components/misc/InfoBox.tsx +0 -283
  210. package/src/components/misc/NoNewUpdates.tsx +0 -38
  211. package/src/components/misc/PINHeader.tsx +0 -25
  212. package/src/components/misc/PINValidationHelper.tsx +0 -48
  213. package/src/components/misc/Pagination.tsx +0 -114
  214. package/src/components/misc/QRRenderer.tsx +0 -53
  215. package/src/components/misc/QRScanner.tsx +0 -395
  216. package/src/components/misc/QRScannerTorch.tsx +0 -74
  217. package/src/components/misc/ScanCamera.tsx +0 -86
  218. package/src/components/misc/ScanTab.tsx +0 -45
  219. package/src/components/misc/SharedProofData.tsx +0 -98
  220. package/src/components/misc/UnorderedList.tsx +0 -28
  221. package/src/components/misc/VerifierCredentialCard.tsx +0 -378
  222. package/src/components/misc/index.ts +0 -2
  223. package/src/components/modals/AlertModal.tsx +0 -42
  224. package/src/components/modals/AppGuideModal.tsx +0 -142
  225. package/src/components/modals/CameraDisclosureModal.tsx +0 -126
  226. package/src/components/modals/CommonRemoveModal.tsx +0 -337
  227. package/src/components/modals/DeveloperModal.tsx +0 -32
  228. package/src/components/modals/DismissiblePopupModal.tsx +0 -169
  229. package/src/components/modals/ErrorModal.tsx +0 -107
  230. package/src/components/modals/ImageModal.tsx +0 -80
  231. package/src/components/modals/NetInfoModal.tsx +0 -35
  232. package/src/components/modals/PopupModal.tsx +0 -56
  233. package/src/components/modals/ProofCancelModal.tsx +0 -79
  234. package/src/components/modals/SafeAreaModal.tsx +0 -17
  235. package/src/components/record/Record.tsx +0 -100
  236. package/src/components/record/RecordBinaryField.tsx +0 -55
  237. package/src/components/record/RecordDateIntField.tsx +0 -63
  238. package/src/components/record/RecordField.tsx +0 -154
  239. package/src/components/record/RecordFooter.tsx +0 -17
  240. package/src/components/record/RecordHeader.tsx +0 -17
  241. package/src/components/record/RecordRemove.tsx +0 -66
  242. package/src/components/texts/HeaderTitle.tsx +0 -25
  243. package/src/components/texts/HighlightTextBox.tsx +0 -41
  244. package/src/components/texts/InfoTextBox.tsx +0 -129
  245. package/src/components/texts/Link.tsx +0 -41
  246. package/src/components/texts/Text.tsx +0 -21
  247. package/src/components/texts/ThemedText.tsx +0 -24
  248. package/src/components/toast/BaseToast.tsx +0 -128
  249. package/src/components/toast/ToastConfig.tsx +0 -21
  250. package/src/components/tour/AttachTourStep.tsx +0 -73
  251. package/src/components/tour/CredentialOfferTourSteps.tsx +0 -41
  252. package/src/components/tour/CredentialsTourSteps.tsx +0 -41
  253. package/src/components/tour/HomeTourSteps.tsx +0 -104
  254. package/src/components/tour/ProofRequestTourSteps.tsx +0 -41
  255. package/src/components/tour/SpotCutout.tsx +0 -65
  256. package/src/components/tour/TourBox.tsx +0 -255
  257. package/src/components/tour/TourOverlay.tsx +0 -134
  258. package/src/components/views/Banner.tsx +0 -181
  259. package/src/components/views/CredentialCardLogo.tsx +0 -77
  260. package/src/components/views/CredentialDetailPrimaryHeader.tsx +0 -107
  261. package/src/components/views/CredentialDetailSecondaryHeader.tsx +0 -60
  262. package/src/components/views/HeaderWithBanner.tsx +0 -17
  263. package/src/components/views/HomeFooterView.tsx +0 -110
  264. package/src/components/views/HomeHeaderView.tsx +0 -12
  265. package/src/components/views/KeyboardView.tsx +0 -41
  266. package/src/components/views/LoadingPlaceholder.tsx +0 -168
  267. package/src/components/views/LoadingView.tsx +0 -29
  268. package/src/components/views/ProgressBar.tsx +0 -53
  269. package/src/components/views/PushNotificationsContent.tsx +0 -51
  270. package/src/components/views/PushNotificationsDisabledContent.tsx +0 -47
  271. package/src/configs/ledgers/indy/index.ts +0 -8
  272. package/src/configs/ledgers/indy/ledgers.json +0 -51
  273. package/src/constants.ts +0 -107
  274. package/src/container-api.ts +0 -247
  275. package/src/container-impl.ts +0 -243
  276. package/src/contexts/activity.tsx +0 -145
  277. package/src/contexts/animated-components.ts +0 -9
  278. package/src/contexts/auth.tsx +0 -240
  279. package/src/contexts/index.ts +0 -3
  280. package/src/contexts/navigation.tsx +0 -19
  281. package/src/contexts/network.tsx +0 -125
  282. package/src/contexts/reducers/index.ts +0 -3
  283. package/src/contexts/reducers/store.ts +0 -754
  284. package/src/contexts/store.tsx +0 -103
  285. package/src/contexts/theme.tsx +0 -51
  286. package/src/contexts/tour/tour-context.tsx +0 -160
  287. package/src/contexts/tour/tour-provider.tsx +0 -160
  288. package/src/hooks/bundle-resolver.ts +0 -95
  289. package/src/hooks/chat-messages.tsx +0 -263
  290. package/src/hooks/connections.ts +0 -37
  291. package/src/hooks/credential-card-styles.ts +0 -144
  292. package/src/hooks/credentials.ts +0 -11
  293. package/src/hooks/deep-links.ts +0 -49
  294. package/src/hooks/developer-mode.ts +0 -25
  295. package/src/hooks/lockout.ts +0 -77
  296. package/src/hooks/notifications.ts +0 -108
  297. package/src/hooks/oob.ts +0 -17
  298. package/src/hooks/proof-request-templates.ts +0 -40
  299. package/src/hooks/proofs.ts +0 -32
  300. package/src/hooks/screen-capture.ts +0 -52
  301. package/src/hooks/useBifoldAgentSetup.ts +0 -169
  302. package/src/hooks/useOnboardingState.ts +0 -53
  303. package/src/hooks/usePINValidation.ts +0 -98
  304. package/src/index.ts +0 -239
  305. package/src/layout/ScreenLayout.tsx +0 -53
  306. package/src/localization/en/en.json +0 -951
  307. package/src/localization/en/index.ts +0 -3
  308. package/src/localization/fr/fr.json +0 -933
  309. package/src/localization/fr/index.ts +0 -3
  310. package/src/localization/index.ts +0 -66
  311. package/src/localization/pt-br/index.ts +0 -3
  312. package/src/localization/pt-br/pt-br.json +0 -911
  313. package/src/modules/history/context/historyManager.tsx +0 -247
  314. package/src/modules/history/index.ts +0 -2
  315. package/src/modules/history/navigation/HistoryStack.tsx +0 -29
  316. package/src/modules/history/services/queue.service.tsx +0 -31
  317. package/src/modules/history/types/index.ts +0 -92
  318. package/src/modules/history/ui/HistoryPage.tsx +0 -133
  319. package/src/modules/history/ui/HistorySettings.tsx +0 -183
  320. package/src/modules/history/ui/assets/img/HistoryCardAcceptedIcon.svg +0 -4
  321. package/src/modules/history/ui/assets/img/HistoryCardExpiredIcon.svg +0 -4
  322. package/src/modules/history/ui/assets/img/HistoryCardRevokedIcon.svg +0 -4
  323. package/src/modules/history/ui/assets/img/HistoryInformationSentIcon.svg +0 -4
  324. package/src/modules/history/ui/assets/img/HistoryPinUpdatedIcon.svg +0 -4
  325. package/src/modules/history/ui/assets/img/IconChevronRight.svg +0 -3
  326. package/src/modules/history/ui/components/BulletPoint.tsx +0 -49
  327. package/src/modules/history/ui/components/HistoryListItem.tsx +0 -251
  328. package/src/modules/history/ui/components/HistoryMenu.tsx +0 -25
  329. package/src/modules/history/ui/components/SingleSelectBlock.tsx +0 -72
  330. package/src/modules/openid/components/CredentialRowCard.tsx +0 -64
  331. package/src/modules/openid/components/OpenIDCredentialCard.tsx +0 -276
  332. package/src/modules/openid/context/OpenIDCredentialRecordProvider.tsx +0 -296
  333. package/src/modules/openid/display.tsx +0 -467
  334. package/src/modules/openid/displayProof.tsx +0 -86
  335. package/src/modules/openid/hooks/openid.tsx +0 -111
  336. package/src/modules/openid/metadata.tsx +0 -59
  337. package/src/modules/openid/offerResolve.tsx +0 -281
  338. package/src/modules/openid/resolverProof.tsx +0 -286
  339. package/src/modules/openid/screens/OpenIDCredentialDetails.tsx +0 -214
  340. package/src/modules/openid/screens/OpenIDCredentialOffer.tsx +0 -192
  341. package/src/modules/openid/screens/OpenIDProofChangeCredential.tsx +0 -133
  342. package/src/modules/openid/screens/OpenIDProofPresentation.tsx +0 -423
  343. package/src/modules/openid/types.tsx +0 -111
  344. package/src/modules/openid/utils/utils.tsx +0 -119
  345. package/src/navigators/ConnectStack.tsx +0 -68
  346. package/src/navigators/ContactStack.tsx +0 -91
  347. package/src/navigators/CredentialStack.tsx +0 -48
  348. package/src/navigators/DeliveryStack.tsx +0 -76
  349. package/src/navigators/HomeStack.tsx +0 -37
  350. package/src/navigators/MainStack.tsx +0 -146
  351. package/src/navigators/NotificationStack.tsx +0 -56
  352. package/src/navigators/OnboardingScreens.ts +0 -142
  353. package/src/navigators/OnboardingStack.tsx +0 -205
  354. package/src/navigators/ProofRequestStack.tsx +0 -113
  355. package/src/navigators/RootStack.tsx +0 -71
  356. package/src/navigators/SettingStack.tsx +0 -174
  357. package/src/navigators/TabStack.tsx +0 -304
  358. package/src/navigators/defaultLayoutOptions.tsx +0 -17
  359. package/src/navigators/defaultStackOptions.tsx +0 -102
  360. package/src/navigators/index.ts +0 -27
  361. package/src/onboarding.ts +0 -90
  362. package/src/screens/AttemptLockout.tsx +0 -153
  363. package/src/screens/AutoLock.tsx +0 -140
  364. package/src/screens/Biometry.tsx +0 -54
  365. package/src/screens/Chat.tsx +0 -141
  366. package/src/screens/ConfigureMediator.tsx +0 -160
  367. package/src/screens/Connection.tsx +0 -394
  368. package/src/screens/ContactDetails.tsx +0 -350
  369. package/src/screens/CredentialDetails.tsx +0 -473
  370. package/src/screens/CredentialOffer.tsx +0 -334
  371. package/src/screens/CredentialOfferAccept.tsx +0 -189
  372. package/src/screens/DataRetention.tsx +0 -91
  373. package/src/screens/Developer.tsx +0 -289
  374. package/src/screens/Home.tsx +0 -173
  375. package/src/screens/JSONDetails.tsx +0 -104
  376. package/src/screens/Language.tsx +0 -97
  377. package/src/screens/ListContacts.tsx +0 -112
  378. package/src/screens/ListCredentials.tsx +0 -135
  379. package/src/screens/ListProofRequests.tsx +0 -148
  380. package/src/screens/MobileVerifierLoading.tsx +0 -106
  381. package/src/screens/NameWallet.tsx +0 -9
  382. package/src/screens/Onboarding.tsx +0 -162
  383. package/src/screens/OnboardingPages.tsx +0 -160
  384. package/src/screens/PINChange.tsx +0 -249
  385. package/src/screens/PINCreate.tsx +0 -185
  386. package/src/screens/PINEnter.tsx +0 -432
  387. package/src/screens/PINExplainer.tsx +0 -85
  388. package/src/screens/PINVerify.tsx +0 -195
  389. package/src/screens/PasteUrl.tsx +0 -140
  390. package/src/screens/Preface.tsx +0 -78
  391. package/src/screens/ProofChangeCredential.tsx +0 -179
  392. package/src/screens/ProofDetails.tsx +0 -348
  393. package/src/screens/ProofRequest.tsx +0 -999
  394. package/src/screens/ProofRequestAccept.tsx +0 -133
  395. package/src/screens/ProofRequestDetails.tsx +0 -270
  396. package/src/screens/ProofRequestUsageHistory.tsx +0 -152
  397. package/src/screens/ProofRequesting.tsx +0 -245
  398. package/src/screens/PushNotifications.tsx +0 -59
  399. package/src/screens/RenameContact.tsx +0 -155
  400. package/src/screens/RenameWallet.tsx +0 -26
  401. package/src/screens/Scan.tsx +0 -145
  402. package/src/screens/ScanHelp.tsx +0 -48
  403. package/src/screens/Settings.tsx +0 -415
  404. package/src/screens/Splash.tsx +0 -80
  405. package/src/screens/Terms.tsx +0 -127
  406. package/src/screens/ToggleBiometry.tsx +0 -153
  407. package/src/screens/TogglePushNotifications.tsx +0 -118
  408. package/src/screens/Tours.tsx +0 -93
  409. package/src/screens/UpdateAvailable.tsx +0 -119
  410. package/src/screens/WhatAreContacts.tsx +0 -71
  411. package/src/services/bifoldLogger.ts +0 -3
  412. package/src/services/keychain.ts +0 -184
  413. package/src/services/logger.ts +0 -89
  414. package/src/services/storage.ts +0 -136
  415. package/src/theme-builder.ts +0 -157
  416. package/src/theme.interface.ts +0 -580
  417. package/src/theme.ts +0 -1346
  418. package/src/types/attempt-lockout-config.ts +0 -8
  419. package/src/types/attestation.ts +0 -17
  420. package/src/types/chat.ts +0 -4
  421. package/src/types/config.ts +0 -64
  422. package/src/types/contact-details.ts +0 -5
  423. package/src/types/credential-list-footer.ts +0 -3
  424. package/src/types/credential-status.ts +0 -3
  425. package/src/types/credentials.ts +0 -7
  426. package/src/types/decline.ts +0 -5
  427. package/src/types/error.ts +0 -40
  428. package/src/types/fn.ts +0 -2
  429. package/src/types/genesis.ts +0 -35
  430. package/src/types/index.ts +0 -2
  431. package/src/types/metadata.ts +0 -16
  432. package/src/types/navigators.ts +0 -239
  433. package/src/types/notification.ts +0 -24
  434. package/src/types/permissions.ts +0 -2
  435. package/src/types/proof-items.ts +0 -32
  436. package/src/types/react-i18next.d.ts +0 -10
  437. package/src/types/remove.ts +0 -8
  438. package/src/types/security.ts +0 -32
  439. package/src/types/settings.ts +0 -28
  440. package/src/types/state.ts +0 -97
  441. package/src/types/tour.ts +0 -20
  442. package/src/types/version-check.ts +0 -18
  443. package/src/utils/PINValidation.ts +0 -98
  444. package/src/utils/agent.ts +0 -128
  445. package/src/utils/anonCredsProofRequestMapper.ts +0 -205
  446. package/src/utils/contacts.ts +0 -59
  447. package/src/utils/cred-def.ts +0 -33
  448. package/src/utils/credential.ts +0 -37
  449. package/src/utils/crypto.ts +0 -12
  450. package/src/utils/fileCache.ts +0 -152
  451. package/src/utils/helpers.ts +0 -1292
  452. package/src/utils/ledger.ts +0 -212
  453. package/src/utils/luminance.ts +0 -40
  454. package/src/utils/mediatorhelpers.ts +0 -71
  455. package/src/utils/migration.ts +0 -40
  456. package/src/utils/network.tsx +0 -55
  457. package/src/utils/oca.ts +0 -173
  458. package/src/utils/parsers.tsx +0 -111
  459. package/src/utils/proofBundle.ts +0 -220
  460. package/src/utils/schema.ts +0 -28
  461. package/src/utils/testable.ts +0 -17
@@ -1,1292 +0,0 @@
1
- import {
2
- AnonCredsCredentialInfo,
3
- AnonCredsCredentialsForProofRequest,
4
- AnonCredsPredicateType,
5
- AnonCredsProofRequest,
6
- AnonCredsProofRequestRestriction,
7
- AnonCredsRequestedAttribute,
8
- AnonCredsRequestedAttributeMatch,
9
- AnonCredsRequestedPredicate,
10
- AnonCredsRequestedPredicateMatch,
11
- getCredentialsForAnonCredsProofRequest,
12
- } from '@credo-ts/anoncreds'
13
- import {
14
- Agent,
15
- BasicMessageRecord,
16
- ConnectionRecord,
17
- CredentialExchangeRecord,
18
- CredentialState,
19
- HandshakeProtocol,
20
- ProofExchangeRecord,
21
- ProofState,
22
- parseDid,
23
- OutOfBandRecord,
24
- CredentialPreviewAttribute,
25
- OutOfBandRole,
26
- } from '@credo-ts/core'
27
- import { BasicMessageRole } from '@credo-ts/core/build/modules/basic-messages/BasicMessageRole'
28
- import { useConnectionById } from '@credo-ts/react-hooks'
29
- import { BrandingOverlay, CaptureBaseAttributeType } from '@bifold/oca'
30
- import { Attribute, CredentialOverlay, Predicate } from '@bifold/oca/build/legacy'
31
- import { Buffer } from 'buffer'
32
- import moment from 'moment'
33
- import { parseUrl } from 'query-string'
34
- import { ReactNode } from 'react'
35
- import { TFunction } from 'react-i18next'
36
- import { DeviceEventEmitter } from 'react-native'
37
-
38
- import { EventTypes, domain } from '../constants'
39
- import { i18n } from '../localization/index'
40
- import { BifoldLogger } from '../services/logger'
41
- import { Role } from '../types/chat'
42
- import { BifoldError } from '../types/error'
43
- import { Screens, Stacks } from '../types/navigators'
44
- import {
45
- CredentialDataForProof,
46
- ProofCredentialAttributes,
47
- ProofCredentialItems,
48
- ProofCredentialPredicates,
49
- } from '../types/proof-items'
50
- import { ChildFn } from '../types/tour'
51
-
52
- import { BifoldAgent } from './agent'
53
- import {
54
- createAnonCredsProofRequest,
55
- filterInvalidProofRequestMatches,
56
- getDescriptorMetadata,
57
- } from './anonCredsProofRequestMapper'
58
- import { parseCredDefFromId } from './cred-def'
59
- import { isOpenIdCredentialOffer, isOpenIdPresentationRequest } from './parsers'
60
- import { isMediatorInvitation } from './mediatorhelpers'
61
-
62
- export { parsedCredDefNameFromCredential } from './cred-def'
63
-
64
- export { parsedCredDefName } from './cred-def'
65
- export { parsedSchema } from './schema'
66
-
67
- /**
68
- * Generates a numerical hash based on a given string
69
- * @see https://stackoverflow.com/questions/3426404/create-a-hexadecimal-colour-based-on-a-string-with-javascript
70
- * @param { string } s given string
71
- * @returns { number } numerical hash value
72
- */
73
- export const hashCode = (s: string): number => {
74
- return s.split('').reduce((hash, char) => char.charCodeAt(0) + ((hash << 5) - hash), 0)
75
- }
76
-
77
- /**
78
- * Generates a pseudorandom number between 0 and 1 based on a seed
79
- * @see https://gist.github.com/tommyettinger/46a874533244883189143505d203312c
80
- * @see https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript
81
- * @param { number } seed any number
82
- * @returns { number } pseudorandom number between 0 and 1
83
- */
84
- const mulberry32 = (seed: number) => {
85
- let t = (seed += 0x6d2b79f5)
86
- t = Math.imul(t ^ (t >>> 15), t | 1)
87
- t ^= t + Math.imul(t ^ (t >>> 7), t | 61)
88
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296
89
- }
90
-
91
- /**
92
- * Converts a numerical hash into a hexidecimal color string
93
- * @see https://helderesteves.com/generating-random-colors-js/#Generating_random_dark_colors
94
- * @param { number } hash numerical hash value (generated by hashCode function above)
95
- * @returns { string } hexidecimal string eg. #32d3cc
96
- */
97
- export const hashToRGBA = (hash: number) => {
98
- let color = '#'
99
- const colorRangeUpperBound = 256
100
-
101
- // once for r, g, b
102
- for (let i = 0; i < 3; i++) {
103
- // append a pseudorandom two-char hexidecimal value from the lower half of the color spectrum (to limit to darker colors)
104
- color += ('0' + Math.floor((mulberry32(hash + i) * colorRangeUpperBound) / 2).toString(16)).slice(-2)
105
- }
106
-
107
- return color
108
- }
109
- /**
110
- *
111
- * @param time
112
- * @param params see below
113
- * shortMonth: whether to use Jun in place of June, Mar in place of March for example (overridden by `format`)
114
- * format: an optional custom moment format string to create the formatted date from
115
- * includeHour: whether to add the hour and minute and am/pm. eg 9:32 pm (overridden by `chatFormat` and `trim`)
116
- * chatFormat: whether to style the date to appear like a chat message timestamp eg. '7 minutes ago' or 'Just now'
117
- * trim: if true, if it's the same day the date will be trimmed to just the hour, if it's the same year then the year will be trimmed from the date
118
- * eg. if the current year is 2023, February 12, 2023 will be trimmed to February 12
119
- * @returns formatted time string
120
- */
121
- export function formatTime(
122
- time: Date,
123
- params?: { shortMonth?: boolean; format?: string; includeHour?: boolean; chatFormat?: boolean; trim?: boolean }
124
- ): string {
125
- const getMonthKey = 'MMMM'
126
- const momentTime = moment(time)
127
- const monthKey = momentTime.format(getMonthKey)
128
- const customMonthFormatRe = /M+/
129
- const shortMonth = params?.shortMonth
130
- const format = params?.format
131
- const includeHour = params?.includeHour
132
- const chatFormat = params?.chatFormat
133
- const trim = params?.trim
134
- const shortDateFormatMaskLength = 3
135
- const millisecondsAgo = moment().diff(momentTime)
136
- const lessThanAMinuteAgo = millisecondsAgo / 1000 / 60 < 1
137
- const lessThanAnHourAgo = millisecondsAgo / 1000 / 60 / 60 < 1
138
- const now = new Date()
139
- const sameYear = time.getFullYear() === now.getFullYear()
140
- const sameDay = time.getDate() === now.getDate() && time.getMonth() === now.getMonth() && sameYear
141
- const isPortuguese = i18n.resolvedLanguage === 'pt-BR'
142
- const isNonEnglish = i18n.resolvedLanguage === 'fr' || isPortuguese
143
- const hoursFormat = isNonEnglish ? 'HH:mm' : 'h:mm a'
144
- // for the shortened approach eg. in chat bubbles
145
- if (chatFormat) {
146
- if (lessThanAMinuteAgo) {
147
- return i18n.t('Date.JustNow')
148
- }
149
- if (lessThanAnHourAgo) {
150
- const minutesAgo = Math.floor(millisecondsAgo / 1000 / 60)
151
- return minutesAgo === 1 ? `${i18n.t('Date.MinuteAgo')}` : `${i18n.t('Date.MinutesAgo', { count: minutesAgo })}`
152
- }
153
- if (sameDay) {
154
- return momentTime.format(hoursFormat)
155
- }
156
- }
157
-
158
- let formatString = i18n.t('Date.ShortFormat')
159
- let formattedTime = ''
160
- // if sameDay and abbreviated
161
- if (sameDay && trim) {
162
- return momentTime.format(hoursFormat)
163
- }
164
-
165
- if (format) {
166
- formatString = format
167
- formattedTime = momentTime.format(format)
168
- } else {
169
- if (!shortMonth) {
170
- formatString = i18n.t('Date.LongFormat')
171
- }
172
-
173
- // if translation fails
174
- if (formatString === 'Date.ShortFormat' || formatString === 'Date.LongFormat' || formatString === undefined) {
175
- formatString = 'MMM D'
176
- }
177
-
178
- // if trim is true, don't include the year for same year times
179
- formattedTime =
180
- trim && sameYear
181
- ? momentTime.format(formatString)
182
- : // if non-english, don't include comma between year and month
183
- isNonEnglish
184
- ? `${momentTime.format(formatString)} ${momentTime.format('YYYY')}`
185
- : `${momentTime.format(formatString)}, ${momentTime.format('YYYY')}`
186
- if (includeHour) {
187
- formattedTime = `${formattedTime}, ${momentTime.format(hoursFormat)}`
188
- }
189
- }
190
-
191
- const customMonthFormat = formatString?.match(customMonthFormatRe)?.[0]
192
-
193
- if (customMonthFormat) {
194
- let monthReplacement = ''
195
- const monthReplacementKey = momentTime.format(customMonthFormat)
196
- if (customMonthFormat.length === shortDateFormatMaskLength) {
197
- // then we know we're dealing with a short date format: 'MMM'
198
- monthReplacement = i18n.t(`Date.MonthShort.${monthKey}`)
199
- } else if (customMonthFormat.length > shortDateFormatMaskLength) {
200
- // then we know we're working with a long date format: 'MMMM'
201
- monthReplacement = i18n.t(`Date.MonthLong.${monthKey}`)
202
- }
203
- // if translation doesn't work
204
- if (monthReplacement === `Date.MonthLong.${monthKey}` || monthReplacement === `Date.MonthShort.${monthKey}`) {
205
- monthReplacement = monthReplacementKey
206
- }
207
-
208
- if (monthReplacement) {
209
- formattedTime = formattedTime.replace(monthReplacementKey, monthReplacement)
210
- }
211
- }
212
- return formattedTime
213
- }
214
-
215
- // need to use rolling b64 encode/decode to prevent hermes from 2048 byte truncation
216
- export function b64encode(inp: string) {
217
- return (
218
- inp
219
- .match(/.{1,3}/g)
220
- ?.map((chunk) => {
221
- return Buffer.from(chunk).toString('base64')
222
- })
223
- .join('') ?? ''
224
- )
225
- }
226
-
227
- export function b64decode(b64: string) {
228
- return (
229
- b64
230
- .match(/.{1,4}/g)
231
- ?.map((chunk) => {
232
- if (chunk.length < 4) {
233
- chunk += '='.repeat(4 - chunk.length)
234
- }
235
- return Buffer.from(chunk, 'base64').toString()
236
- })
237
- .join('') ?? ''
238
- )
239
- }
240
-
241
- export function formatIfDate(format: string | undefined, value: string | number | null) {
242
- const potentialDate = value ? value.toString() : null
243
- if (format === 'YYYYMMDD' && potentialDate && potentialDate.length === format.length) {
244
- const year = potentialDate.substring(0, 4)
245
- const month = potentialDate.substring(4, 6)
246
- const day = potentialDate.substring(6, 8)
247
- // NOTE: JavaScript counts months from 0 to 11: January = 0, December = 11.
248
- const date = new Date(Number(year), Number(month) - 1, Number(day))
249
- if (!isNaN(date.getDate())) {
250
- return formatTime(date, { shortMonth: true })
251
- }
252
- }
253
- return value
254
- }
255
-
256
- export function getConnectionName(
257
- connection: ConnectionRecord | undefined,
258
- alternateContactNames: Record<string, string>
259
- ): string {
260
- return (
261
- (connection?.id && alternateContactNames[connection?.id]) ||
262
- connection?.theirLabel ||
263
- connection?.alias ||
264
- connection?.id ||
265
- ''
266
- )
267
- }
268
-
269
- export function useCredentialConnectionLabel(credential?: CredentialExchangeRecord) {
270
- const connection = useConnectionById(credential?.connectionId ?? '')
271
-
272
- if (!credential) {
273
- return ''
274
- }
275
-
276
- if (credential.connectionId) {
277
- return connection?.alias || connection?.theirLabel || credential.connectionId
278
- }
279
-
280
- return 'Unknown Contact'
281
- }
282
-
283
- export function useConnectionImageUrl(connectionId: string) {
284
- const connection = useConnectionById(connectionId)
285
- if (!connection) {
286
- return undefined
287
- }
288
- return connection.imageUrl ?? undefined
289
- }
290
-
291
- export function firstValidCredential(
292
- fields: AnonCredsRequestedAttributeMatch[] | AnonCredsRequestedPredicateMatch[],
293
- revoked = true
294
- ): AnonCredsRequestedAttributeMatch | AnonCredsRequestedPredicateMatch | null {
295
- if (!fields.length) {
296
- return null
297
- }
298
-
299
- let first = null
300
- const firstNonRevoked = fields.filter((field) => !field.revoked)[0]
301
- if (firstNonRevoked) {
302
- first = firstNonRevoked
303
- } else if (fields.length && revoked) {
304
- first = fields[0]
305
- }
306
-
307
- if (!first?.credentialInfo) {
308
- return null
309
- }
310
-
311
- return first
312
- }
313
-
314
- /**
315
- * A sorting function for the Array `sort()` function
316
- * @param a First retrieved credential
317
- * @param b Second retrieved credential
318
- */
319
- export const credentialSortFn = (a: any, b: any) => {
320
- if (a.revoked && !b.revoked) {
321
- return 1
322
- } else if (!a.revoked && b.revoked) {
323
- return -1
324
- } else {
325
- return b.timestamp - a.timestamp
326
- }
327
- }
328
-
329
- const credNameFromRestriction = (queries?: AnonCredsProofRequestRestriction[]): string => {
330
- let schema_name = ''
331
- let cred_def_id = ''
332
- let schema_id = ''
333
- queries?.forEach((query) => {
334
- schema_name = (query?.schema_name as string) ?? schema_name
335
- cred_def_id = (query?.cred_def_id as string) ?? cred_def_id
336
- schema_id = (query?.schema_id as string) ?? schema_id
337
- })
338
- if (schema_name && (schema_name.toLowerCase() !== 'default' || schema_name.toLowerCase() !== 'credential')) {
339
- return schema_name
340
- } else {
341
- return parseCredDefFromId(cred_def_id, schema_id)
342
- }
343
- }
344
-
345
- export const credDefIdFromRestrictions = (queries?: AnonCredsProofRequestRestriction[]): string => {
346
- return queries?.filter((rstr) => rstr.cred_def_id)[0]?.cred_def_id ?? ''
347
- }
348
-
349
- export const schemaIdFromRestrictions = (queries?: AnonCredsProofRequestRestriction[]): string => {
350
- const rstrWithSchemaId = queries?.filter(
351
- (rstr) => rstr.schema_id || (rstr.issuer_did && rstr.schema_name && rstr.schema_version)
352
- )[0]
353
-
354
- // the '2' here is the enum of the transaction type which, for schemas, is always 2
355
- const schemaId = rstrWithSchemaId
356
- ? rstrWithSchemaId.schema_id ||
357
- `${rstrWithSchemaId.issuer_did}:2:${rstrWithSchemaId.schema_name}:${rstrWithSchemaId.schema_version}`
358
- : ''
359
- return schemaId
360
- }
361
-
362
- export const isDataUrl = (value: string | number | null) => {
363
- return typeof value === 'string' && value.startsWith('data:image/')
364
- }
365
- export type Fields = Record<string, AnonCredsRequestedAttributeMatch[] | AnonCredsRequestedPredicateMatch[]>
366
-
367
- /**
368
- * Retrieve current credentials info filtered by `credentialDefinitionId` if given.
369
- * @param credDefId Credential Definition Id
370
- * @returns Array of `AnonCredsCredentialInfo`
371
- */
372
- export const getCredentialInfo = (credId: string, fields: Fields): AnonCredsCredentialInfo[] => {
373
- const credentialInfo: AnonCredsCredentialInfo[] = []
374
-
375
- Object.keys(fields).forEach((proofKey) => {
376
- credentialInfo.push(...fields[proofKey].map((attr) => attr.credentialInfo))
377
- })
378
-
379
- return !credId ? credentialInfo : credentialInfo.filter((cred) => cred.credentialId === credId)
380
- }
381
-
382
- /**
383
- * Evaluate if given attribute value satisfies the predicate.
384
- * @param attribute Credential attribute value
385
- * @param pValue Predicate value
386
- * @param pType Predicate type ({@link AnonCredsPredicateType})
387
- * @returns `true`if predicate is satisfied, otherwise `false`
388
- */
389
- const evaluateOperation = (attribute: number, pValue: number, pType: AnonCredsPredicateType): boolean => {
390
- if (pType === '>=') {
391
- return attribute >= pValue
392
- }
393
-
394
- if (pType === '>') {
395
- return attribute > pValue
396
- }
397
-
398
- if (pType === '<=') {
399
- return attribute <= pValue
400
- }
401
- if (pType === '<') {
402
- return attribute < pValue
403
- }
404
-
405
- return false
406
- }
407
-
408
- /**
409
- * Given proof credential items, evaluate and return its predicates, setting `satisfied` property.
410
- * @param proofCredentialsItems
411
- * @returns Array of evaluated predicates
412
- */
413
- export const evaluatePredicates =
414
- (fields: Fields, credId?: string) =>
415
- (proofCredentialItems: ProofCredentialItems): Predicate[] => {
416
- const predicates = proofCredentialItems.predicates
417
- if (!predicates || predicates.length == 0) {
418
- return []
419
- }
420
-
421
- if ((credId && credId != proofCredentialItems.credId) || !proofCredentialItems.credId) {
422
- return []
423
- }
424
-
425
- const credentialAttributes = getCredentialInfo(proofCredentialItems.credId, fields).map((ci) => ci.attributes)
426
-
427
- return predicates.map((predicate: Predicate) => {
428
- const { pType: pType, pValue: pValue, name: field } = predicate
429
- let satisfied = false
430
-
431
- if (field) {
432
- const attribute = (credentialAttributes.find((attr) => attr[field] != undefined) ?? {})[field]
433
-
434
- if (attribute && pValue) {
435
- satisfied = evaluateOperation(Number(attribute), Number(pValue), pType as AnonCredsPredicateType)
436
- }
437
- }
438
-
439
- return { ...predicate, satisfied }
440
- })
441
- }
442
-
443
- // scans through requested attributes and records
444
- // Builds and returns label: value attributes
445
- // Flagging any attribute not found in wallet credentials
446
- const addMissingDisplayAttributes = (
447
- attrReq: AnonCredsRequestedAttribute,
448
- records: CredentialExchangeRecord[]
449
- ): ProofCredentialAttributes => {
450
- const { name, names, restrictions } = attrReq
451
- const credName = credNameFromRestriction(restrictions)
452
- const credDefId = credDefIdFromRestrictions(restrictions)
453
- const schemaId = schemaIdFromRestrictions(restrictions)
454
-
455
- //there is no credId in this context so use credName as a placeholder
456
- const processedAttributes: ProofCredentialAttributes = {
457
- credExchangeRecord: undefined,
458
- altCredentials: [credName],
459
- credId: credName,
460
- schemaId,
461
- credDefId,
462
- credName: credName,
463
- attributes: [] as Attribute[],
464
- }
465
-
466
- // Filter records for requested schema id of credential definition id
467
- const filteredCredentialRecords = records.filter(
468
- (record: CredentialExchangeRecord) =>
469
- getCredentialSchemaIdForRecord(record) === schemaId || getCredentialDefinitionIdForRecord(record) === credDefId
470
- )
471
-
472
- // for reach requested attribute
473
- // scan through filtered credential attributes
474
- // display any that are found
475
- // flag any not found attributes with an error
476
- for (const attributeName of [...(names ?? (name && [name]) ?? [])]) {
477
- // filter through credential record attributes for a given name
478
- const [attribute] = filteredCredentialRecords.map((item: CredentialExchangeRecord) => {
479
- return item.credentialAttributes?.filter(
480
- (attribute: CredentialPreviewAttribute) => attribute.name === attributeName
481
- )
482
- })
483
- if (attribute && attribute.length > 0) {
484
- // attribute found, display as expected
485
- processedAttributes.attributes?.push(
486
- new Attribute({
487
- revoked: false,
488
- credentialId: credName,
489
- name: attributeName,
490
- value: attribute[0].value,
491
- hasError: false,
492
- })
493
- )
494
- } else {
495
- // no attribute found, flag this with an error
496
- processedAttributes.attributes?.push(
497
- new Attribute({
498
- revoked: false,
499
- credentialId: credName,
500
- name: attributeName,
501
- value: '',
502
- hasError: true,
503
- })
504
- )
505
- }
506
- }
507
- return processedAttributes
508
- }
509
- export const processProofAttributes = (
510
- t: TFunction<'translation', undefined>,
511
- request?: AnonCredsProofRequest,
512
- credentials?: AnonCredsCredentialsForProofRequest, // credentials that 100% validate the proof request
513
- credentialRecords?: CredentialExchangeRecord[], // all the credentials in the wallet
514
- groupByReferent?: boolean
515
- ): { [key: string]: ProofCredentialAttributes } => {
516
- const processedAttributes = {} as { [key: string]: ProofCredentialAttributes }
517
- const requestedProofAttributes = request?.requested_attributes
518
- const retrievedCredentialAttributes = credentials?.attributes
519
- const requestNonRevoked = request?.non_revoked // non_revoked interval can sometimes be top level
520
-
521
- // no proof or credential attributes, nothing to process, leave early
522
- if (!requestedProofAttributes || !retrievedCredentialAttributes) {
523
- return {}
524
- }
525
-
526
- for (const key of Object.keys(retrievedCredentialAttributes)) {
527
- const altCredentials = [...(retrievedCredentialAttributes[key] ?? [])]
528
- .sort(credentialSortFn)
529
- .map((cred) => cred.credentialId)
530
-
531
- const credentialList = [...(retrievedCredentialAttributes[key] ?? [])].sort(credentialSortFn)
532
- const { name, names, non_revoked, restrictions } = requestedProofAttributes[key]
533
-
534
- // system assumes one of these values is present in a proof request
535
- const proofCredDefId = credDefIdFromRestrictions(restrictions)
536
- const proofSchemaId = schemaIdFromRestrictions(restrictions)
537
-
538
- // No credentials satisfy proof request, process attribute errors
539
- if (credentialList.length <= 0) {
540
- const missingAttributes = addMissingDisplayAttributes(requestedProofAttributes[key], credentialRecords ?? [])
541
- const missingCredGroupKey = groupByReferent ? key : missingAttributes.credName
542
- if (!processedAttributes[missingCredGroupKey]) {
543
- processedAttributes[missingCredGroupKey] = missingAttributes
544
- } else {
545
- processedAttributes[missingCredGroupKey].attributes?.push(...(missingAttributes.attributes ?? []))
546
- }
547
- }
548
- //iterate over all credentials that satisfy the proof
549
- for (const credential of credentialList) {
550
- let credName = key
551
- if (credential?.credentialInfo?.credentialDefinitionId || credential?.credentialInfo?.schemaId) {
552
- credName = parseCredDefFromId(
553
- credential?.credentialInfo?.credentialDefinitionId,
554
- credential?.credentialInfo?.schemaId
555
- )
556
- }
557
- let revoked = false
558
- let credExchangeRecord = undefined
559
- if (credential) {
560
- credExchangeRecord = credentialRecords?.find(
561
- (record) =>
562
- record.credentials.map((cred) => cred.credentialRecordId).includes(credential.credentialId) ||
563
- record.id === credential.credentialId
564
- )
565
- revoked = credExchangeRecord?.revocationNotification !== undefined
566
- } else {
567
- continue
568
- }
569
- for (const attributeName of [...(names ?? (name && [name]) ?? [])]) {
570
- if (!processedAttributes[credential.credentialId]) {
571
- // init processedAttributes object
572
- processedAttributes[credential.credentialId] = {
573
- credExchangeRecord,
574
- altCredentials,
575
- credId: credential?.credentialId,
576
- schemaId: credential?.credentialInfo?.schemaId ?? proofSchemaId,
577
- credDefId: credential?.credentialInfo?.credentialDefinitionId ?? proofCredDefId,
578
- credName,
579
- attributes: [],
580
- }
581
- }
582
-
583
- const attributeValue = credential ? credential.credentialInfo.attributes[attributeName] : null
584
- processedAttributes[credential.credentialId].attributes?.push(
585
- new Attribute({
586
- ...requestedProofAttributes[key],
587
- revoked,
588
- credentialId: credential.credentialId,
589
- name: attributeName,
590
- value: attributeValue,
591
- nonRevoked: requestNonRevoked ?? non_revoked,
592
- })
593
- )
594
- }
595
- }
596
- }
597
-
598
- return processedAttributes
599
- }
600
-
601
- export const mergeAttributesAndPredicates = (
602
- attributes: { [key: string]: ProofCredentialAttributes },
603
- predicates: { [key: string]: ProofCredentialPredicates }
604
- ) => {
605
- const merged: { [key: string]: ProofCredentialAttributes & ProofCredentialPredicates } = { ...attributes }
606
- for (const [key, predicate] of Object.entries(predicates)) {
607
- const existingEntry = merged[key]
608
- if (existingEntry) {
609
- const mergedAltCreds = existingEntry.altCredentials?.filter((credId: string) =>
610
- predicate.altCredentials?.includes(credId)
611
- )
612
- merged[key] = { ...existingEntry, ...predicate }
613
- merged[key].altCredentials = mergedAltCreds
614
- } else {
615
- merged[key] = predicate
616
- }
617
- }
618
- return merged
619
- }
620
-
621
- const addMissingDisplayPredicates = (predReq: AnonCredsRequestedPredicate) => {
622
- const { name, p_type: pType, p_value: pValue, restrictions } = predReq
623
-
624
- const credName = credNameFromRestriction(restrictions)
625
- const credDefId = credDefIdFromRestrictions(restrictions)
626
- const schemaId = schemaIdFromRestrictions(restrictions)
627
-
628
- //there is no credId in this context so use credName as a placeholder
629
- const processedPredicates: ProofCredentialPredicates = {
630
- credExchangeRecord: undefined,
631
- altCredentials: [credName],
632
- credId: credName,
633
- schemaId,
634
- credDefId,
635
- credName: credName,
636
- predicates: [] as Predicate[],
637
- }
638
-
639
- processedPredicates.predicates?.push(
640
- new Predicate({
641
- revoked: false,
642
- credentialId: credName,
643
- name: name,
644
- pValue,
645
- pType,
646
- })
647
- )
648
- return processedPredicates
649
- }
650
- export const processProofPredicates = (
651
- request?: AnonCredsProofRequest,
652
- credentials?: AnonCredsCredentialsForProofRequest,
653
- credentialRecords?: CredentialExchangeRecord[],
654
- groupByReferent?: boolean
655
- ): { [key: string]: ProofCredentialPredicates } => {
656
- const processedPredicates = {} as { [key: string]: ProofCredentialPredicates }
657
- const requestedProofPredicates = request?.requested_predicates
658
- const retrievedCredentialPredicates = credentials?.predicates
659
- const requestNonRevoked = request?.non_revoked // // non_revoked interval can sometimes be top level
660
-
661
- if (!requestedProofPredicates || !retrievedCredentialPredicates) {
662
- return {}
663
- }
664
-
665
- for (const key of Object.keys(retrievedCredentialPredicates)) {
666
- const altCredentials = [...(retrievedCredentialPredicates[key] ?? [])]
667
- .sort(credentialSortFn)
668
- .map((cred) => cred.credentialId)
669
-
670
- const credentialList = [...(retrievedCredentialPredicates[key] ?? [])].sort(credentialSortFn)
671
- const { name, p_type: pType, p_value: pValue, non_revoked, restrictions } = requestedProofPredicates[key]
672
- const proofCredDefId = credDefIdFromRestrictions(restrictions)
673
- const proofSchemaId = schemaIdFromRestrictions(restrictions)
674
-
675
- if (credentialList.length <= 0) {
676
- const missingPredicates = addMissingDisplayPredicates(requestedProofPredicates[key])
677
- const missingCredGroupKey = groupByReferent ? key : missingPredicates.credName
678
- if (!processedPredicates[missingCredGroupKey]) {
679
- processedPredicates[missingCredGroupKey] = missingPredicates
680
- } else {
681
- processedPredicates[missingCredGroupKey].predicates?.push(...(missingPredicates.predicates ?? []))
682
- }
683
- }
684
-
685
- for (const credential of credentialList) {
686
- let revoked = false
687
- let credExchangeRecord = undefined
688
- if (credential) {
689
- credExchangeRecord = credentialRecords?.find(
690
- (record) =>
691
- record.credentials.map((cred) => cred.credentialRecordId).includes(credential.credentialId) ||
692
- record.id === credential.credentialId
693
- )
694
- revoked = credExchangeRecord?.revocationNotification !== undefined
695
- } else {
696
- continue
697
- }
698
- const { credentialDefinitionId, schemaId } = { ...credential, ...credential?.credentialInfo }
699
-
700
- const credNameRestriction = credNameFromRestriction(requestedProofPredicates[key]?.restrictions)
701
-
702
- let credName = credNameRestriction ?? key
703
- if (credential?.credentialInfo?.credentialDefinitionId || credential?.credentialInfo?.schemaId) {
704
- credName = parseCredDefFromId(
705
- credential?.credentialInfo?.credentialDefinitionId,
706
- credential?.credentialInfo?.schemaId
707
- )
708
- }
709
- if (!processedPredicates[credential.credentialId]) {
710
- processedPredicates[credential.credentialId] = {
711
- altCredentials,
712
- credExchangeRecord,
713
- credId: credential.credentialId,
714
- schemaId: schemaId ?? proofSchemaId,
715
- credDefId: credentialDefinitionId ?? proofCredDefId,
716
- credName: credName,
717
- predicates: [],
718
- }
719
- }
720
-
721
- processedPredicates[credential.credentialId].predicates?.push(
722
- new Predicate({
723
- ...requestedProofPredicates[key],
724
- credentialId: credential?.credentialId,
725
- name,
726
- revoked,
727
- pValue,
728
- pType,
729
- nonRevoked: requestNonRevoked ?? non_revoked,
730
- })
731
- )
732
- }
733
- }
734
- return processedPredicates
735
- }
736
-
737
- export const retrieveCredentialsForProof = async (
738
- agent: BifoldAgent,
739
- proof: ProofExchangeRecord,
740
- fullCredentials: CredentialExchangeRecord[],
741
- t: TFunction<'translation', undefined>,
742
- groupByReferent?: boolean
743
- ): Promise<CredentialDataForProof | undefined> => {
744
- // This is the only valid state to retrieve credentials for a proof
745
- // `getCredentialsForRequest` will fail otherwise.
746
- // if a proof is declined, it will move out of a RequestReceived state
747
- // and this will fail because it is running against a declined proof
748
- if (proof.state !== ProofState.RequestReceived) {
749
- return
750
- }
751
-
752
- try {
753
- const format = await agent.proofs.getFormatData(proof.id)
754
- const hasPresentationExchange = format.request?.presentationExchange !== undefined
755
- const hasAnonCreds = format.request?.anoncreds !== undefined
756
- const hasIndy = format.request?.indy !== undefined
757
-
758
- // Will fail if credential not in state 'request-received'
759
- const credentialsAsPromise = agent.proofs.getCredentialsForRequest({
760
- proofRecordId: proof.id,
761
- proofFormats: {
762
- // FIXME: Credo will try to use the format, even if the value is undefined (but the key is present)
763
- // We should ignore the key, if the value is undefined. For now this is a workaround.
764
- ...(hasIndy
765
- ? {
766
- indy: {
767
- // Setting `filterByNonRevocationRequirements` to `false` returns all
768
- // credentials even if they are revokable (and revoked). We need this to
769
- // be able to show why a proof cannot be satisfied. Otherwise we can only
770
- // show failure.
771
- filterByNonRevocationRequirements: true,
772
- },
773
- }
774
- : {}),
775
- ...(hasAnonCreds
776
- ? {
777
- anoncreds: {
778
- // Setting `filterByNonRevocationRequirements` to `false` returns all
779
- // credentials even if they are revokable (and revoked). We need this to
780
- // be able to show why a proof cannot be satisfied. Otherwise we can only
781
- // show failure.
782
- filterByNonRevocationRequirements: true,
783
- },
784
- }
785
- : {}),
786
- ...(hasPresentationExchange ? { presentationExchange: {} } : {}),
787
- },
788
- })
789
-
790
- // Will fail if credential not in state 'request-received'
791
- const credentialsWithRevokedAsPromise = agent.proofs.getCredentialsForRequest({
792
- proofRecordId: proof.id,
793
- proofFormats: {
794
- // FIXME: Credo will try to use the format, even if the value is undefined (but the key is present)
795
- // We should ignore the key, if the value is undefined. For now this is a workaround.
796
- ...(hasIndy
797
- ? {
798
- indy: {
799
- // Setting `filterByNonRevocationRequirements` to `false` returns all
800
- // credentials even if they are revokable (and revoked). We need this to
801
- // be able to show why a proof cannot be satisfied. Otherwise we can only
802
- // show failure.
803
- filterByNonRevocationRequirements: false,
804
- },
805
- }
806
- : {}),
807
- ...(hasAnonCreds
808
- ? {
809
- anoncreds: {
810
- // Setting `filterByNonRevocationRequirements` to `false` returns all
811
- // credentials even if they are revokable (and revoked). We need this to
812
- // be able to show why a proof cannot be satisfied. Otherwise we can only
813
- // show failure.
814
- filterByNonRevocationRequirements: false,
815
- },
816
- }
817
- : {}),
818
- ...(hasPresentationExchange ? { presentationExchange: {} } : {}),
819
- },
820
- })
821
-
822
- const [credentials, credentialsWithRevoked] = await Promise.all([
823
- credentialsAsPromise,
824
- credentialsWithRevokedAsPromise,
825
- ])
826
-
827
- // In the case where there are only revoked credentials to satisfy a proof,
828
- // include them for errors on the proof screen, otherwise leave them out
829
- const addRevokedCredsIfNeeded = (proofFormat: 'indy' | 'anoncreds', proofItem: 'attributes' | 'predicates') => {
830
- if (credentials.proofFormats[proofFormat] && credentialsWithRevoked.proofFormats[proofFormat]) {
831
- Object.keys(credentials.proofFormats[proofFormat]?.[proofItem] ?? {}).forEach((key) => {
832
- if (
833
- credentials.proofFormats[proofFormat] &&
834
- !credentials.proofFormats[proofFormat]?.[proofItem][key]?.length
835
- ) {
836
- credentials.proofFormats[proofFormat]?.[proofItem][key].push(
837
- ...(credentialsWithRevoked.proofFormats[proofFormat]?.[proofItem][key] ?? ([] as any[]))
838
- )
839
- }
840
- })
841
- }
842
- }
843
-
844
- for (const proofFormat of ['indy', 'anoncreds']) {
845
- for (const proofItem of ['attributes', 'predicates']) {
846
- addRevokedCredsIfNeeded(proofFormat as 'indy' | 'anoncreds', proofItem as 'attributes' | 'predicates')
847
- }
848
- }
849
-
850
- if (!credentials) {
851
- throw new Error(t('ProofRequest.RequestedCredentialsCouldNotBeFound'))
852
- }
853
-
854
- if (!format) {
855
- throw new Error(t('ProofRequest.RequestedCredentialsCouldNotBeFound'))
856
- }
857
-
858
- if (!(format && credentials && fullCredentials)) {
859
- return
860
- }
861
-
862
- if (hasPresentationExchange) {
863
- // FIXME: non revocation requirements
864
- const presentationExchange = format.request?.presentationExchange
865
- const difPexCredentialsForRequest = credentials.proofFormats.presentationExchange
866
-
867
- if (!difPexCredentialsForRequest || !presentationExchange) throw new Error('Invalid presentation request')
868
-
869
- const presentationDefinition = presentationExchange.presentation_definition
870
- const descriptorMetadata = getDescriptorMetadata(difPexCredentialsForRequest)
871
- const anonCredsProofRequest = createAnonCredsProofRequest(presentationDefinition, descriptorMetadata)
872
- const anonCredsCredentialsForRequest = await getCredentialsForAnonCredsProofRequest(
873
- agent.context,
874
- anonCredsProofRequest,
875
- { filterByNonRevocationRequirements: false }
876
- )
877
-
878
- const filtered = filterInvalidProofRequestMatches(anonCredsCredentialsForRequest, descriptorMetadata)
879
- const processedAttributes = processProofAttributes(
880
- t,
881
- anonCredsProofRequest,
882
- filtered,
883
- fullCredentials,
884
- groupByReferent
885
- )
886
- const processedPredicates = processProofPredicates(
887
- anonCredsProofRequest,
888
- filtered,
889
- fullCredentials,
890
- groupByReferent
891
- )
892
- const groupedProof = Object.values(mergeAttributesAndPredicates(processedAttributes, processedPredicates))
893
-
894
- return {
895
- groupedProof,
896
- retrievedCredentials: filtered,
897
- fullCredentials,
898
- descriptorMetadata,
899
- }
900
- }
901
-
902
- const proofRequest = format.request?.anoncreds ?? format.request?.indy
903
- const proofFormat = credentials.proofFormats.anoncreds ?? credentials.proofFormats.indy
904
-
905
- const attributes = processProofAttributes(t, proofRequest, proofFormat, fullCredentials, groupByReferent)
906
- const predicates = processProofPredicates(proofRequest, proofFormat, fullCredentials, groupByReferent)
907
- const groupedProof = Object.values(mergeAttributesAndPredicates(attributes, predicates))
908
-
909
- return { groupedProof, retrievedCredentials: proofFormat, fullCredentials }
910
- } catch (err: unknown) {
911
- const error = new BifoldError(t('Error.Title1043'), t('Error.Message1043'), (err as Error)?.message ?? err, 1043)
912
- DeviceEventEmitter.emit(EventTypes.ERROR_ADDED, error)
913
- }
914
- }
915
-
916
- export const pTypeToText = (
917
- item: Predicate,
918
- t: TFunction<'translation', undefined>,
919
- attributeTypes?: Record<string, string>
920
- ) => {
921
- const itemCopy = { ...item }
922
- const pTypeMap: { [key: string]: string | undefined } = {
923
- '>=': t('ProofRequest.PredicateGe'),
924
- '>': t('ProofRequest.PredicateGr'),
925
- '<=': t('ProofRequest.PredicateLe'),
926
- '<': t('ProofRequest.PredicateLs'),
927
- }
928
- const pTypeDateMap: { [key: string]: string | undefined } = {
929
- '>=': t('ProofRequest.PredicateGeDate'),
930
- '>': t('ProofRequest.PredicateGeDate'),
931
- '<=': t('ProofRequest.PredicateLeDate'),
932
- '<': t('ProofRequest.PredicateLeDate'),
933
- }
934
- const pTypeDateOffset: { [key: string]: number | undefined } = {
935
- '>=': -1,
936
- '<=': 1,
937
- }
938
- if (attributeTypes && attributeTypes[item.name ?? ''] == CaptureBaseAttributeType.DateTime) {
939
- itemCopy.pType = pTypeDateMap[item.pType] ?? item.pType
940
- itemCopy.pValue = parseInt(`${itemCopy.pValue}`) + (pTypeDateOffset[item.pType] ?? 0)
941
- } else {
942
- itemCopy.pType = pTypeMap[item.pType] ?? item.pType
943
- }
944
- return itemCopy
945
- }
946
-
947
- /**
948
- * @deprecated The function should not be used
949
- */
950
- export const sortCredentialsForAutoSelect = (
951
- credentials: AnonCredsCredentialsForProofRequest
952
- ): AnonCredsCredentialsForProofRequest => {
953
- const requestedAttributes = Object.values(credentials?.attributes).pop()
954
- const requestedPredicates = Object.values(credentials?.predicates).pop()
955
- const sortFn = (a: any, b: any) => {
956
- if (a.revoked && !b.revoked) {
957
- return 1
958
- } else if (!a.revoked && b.revoked) {
959
- return -1
960
- } else {
961
- return b.timestamp - a.timestamp
962
- }
963
- }
964
-
965
- requestedAttributes && requestedAttributes.sort(sortFn)
966
- requestedPredicates && requestedPredicates.sort(sortFn)
967
-
968
- return credentials
969
- }
970
-
971
- /**
972
- * This cleanup function prevents any errors associated with
973
- * receiving the same invitation twice if a previous
974
- * invitation was not completed. Does nothing if no previously
975
- * received invitations exist
976
- * @param agent an Agent instance
977
- * @param invitationId specifically a *received* invitation id
978
- */
979
- export const removeExistingInvitationsById = async (agent: Agent | undefined, invitationId: string): Promise<void> => {
980
- // This is implemented just as findByReceivedInvitationId is
981
- // in Credo only this is able to return multiple if they exist
982
- const oobRecords =
983
- (await agent?.oob.findAllByQuery({
984
- invitationId,
985
- role: OutOfBandRole.Receiver,
986
- })) || []
987
-
988
- for (const r of oobRecords) {
989
- await agent?.oob.deleteById(r.id)
990
- agent?.config.logger.info('Successfully removed an existing oob invitation')
991
- }
992
- }
993
-
994
- /**
995
- * Get a oob record and connection record from a URI using built-in Credo methods
996
- * @param uri a URI that is either a redirect URL or contains a base64 encoded connection invite in query params
997
- * @param agent an Agent instance
998
- * @param implicitInvitations a boolean to determine if implicit invitation behavior should be used
999
- * @param reuseConnection a boolean to determine if connection reuse should be allowed
1000
- * @returns an object containing an OOB record and, if not connectionless, a connection record
1001
- */
1002
- export const connectFromInvitation = async (
1003
- uri: string,
1004
- agent: Agent | undefined,
1005
- implicitInvitations: boolean = false,
1006
- reuseConnection: boolean = false
1007
- ): Promise<OutOfBandRecord> => {
1008
- const invitation = await agent?.oob.parseInvitation(uri)
1009
-
1010
- if (!invitation) {
1011
- throw new Error('Could not parse invitation from URL')
1012
- }
1013
-
1014
- if (implicitInvitations) {
1015
- try {
1016
- if (invitation.getDidServices().length > 0) {
1017
- const did = parseDid(invitation.getDidServices()[0])
1018
- const record = await agent?.oob.receiveImplicitInvitation({
1019
- did: did.did,
1020
- label: invitation.label,
1021
- handshakeProtocols: invitation.handshakeProtocols as HandshakeProtocol[] | undefined,
1022
- })
1023
-
1024
- return record?.outOfBandRecord as OutOfBandRecord
1025
- }
1026
- } catch (e) {
1027
- // don't throw an error, will try to connect again below
1028
- }
1029
- }
1030
-
1031
- const record = await agent?.oob.receiveInvitation(invitation, { reuseConnection })
1032
- return record?.outOfBandRecord as OutOfBandRecord
1033
- }
1034
-
1035
- const processBetaUrlIfRequired = (uri: string): string => {
1036
- let aUrl = uri
1037
-
1038
- // _oob is a beta query param, not supported by Credo.
1039
- aUrl = uri.replace('_oob', 'oob')
1040
-
1041
- // _url is a beta query param, not supported by Credo.
1042
- if (uri.includes('_url')) {
1043
- const queryParams = parseUrl(uri)?.query
1044
- const b64UrlRedirect = queryParams['_url']
1045
- aUrl = b64decode(b64UrlRedirect as string)
1046
- }
1047
-
1048
- return aUrl
1049
- }
1050
-
1051
- /**
1052
- * Receive a message from a scan or deeplink and navigate accordingly
1053
- * @param uri a URI either containing a base64 encoded connection invite in the query parameters or a redirect URL itself
1054
- * @param agent an Agent instance
1055
- * @param logger injected logger from DI container
1056
- * @param navigation a navigation object from either the Scan screen, Home screen, or PasteUrl screen
1057
- * @param isDeepLink a boolean to communicate where the uri is coming from
1058
- * @param implicitInvitations a boolean to determine if implicit invitation behavior should be used
1059
- * @param reuseConnection a boolean to determine if connection reuse should be allowed
1060
- * @throws Error with message containing the primary and beta error messages if both fail
1061
- */
1062
- export const connectFromScanOrDeepLink = async (
1063
- uri: string,
1064
- agent: Agent | undefined,
1065
- logger: BifoldLogger,
1066
- navigation: any,
1067
- isDeepLink: boolean,
1068
- implicitInvitations: boolean = false,
1069
- reuseConnection: boolean = false
1070
- ) => {
1071
- if (!agent) {
1072
- return
1073
- }
1074
-
1075
- // TODO:(jl) Do we care if the connection is a deep link?
1076
- logger.info(`Attempting to connect from ${isDeepLink ? 'deeplink' : 'qr scan'}`)
1077
- try {
1078
- if (isOpenIdCredentialOffer(uri)) {
1079
- navigation.navigate(Stacks.ConnectionStack as any, {
1080
- screen: Screens.Connection,
1081
- params: { oobRecordId: '', openIDUri: uri },
1082
- })
1083
-
1084
- return
1085
- }
1086
-
1087
- if (isOpenIdPresentationRequest(uri)) {
1088
- navigation.navigate(Stacks.ConnectionStack as any, {
1089
- screen: Screens.Connection,
1090
- params: { oobRecordId: '', openIDPresentationUri: uri },
1091
- })
1092
-
1093
- return
1094
- }
1095
- if (await isMediatorInvitation(agent, uri)) {
1096
- navigation.navigate(Stacks.SettingStack as any, {
1097
- screen: Screens.ConfigureMediator,
1098
- params: { scannedMediatorUri: uri },
1099
- })
1100
-
1101
- return
1102
- }
1103
-
1104
- const aUrl = processBetaUrlIfRequired(uri)
1105
- const receivedInvitation = await connectFromInvitation(aUrl, agent, implicitInvitations, reuseConnection)
1106
-
1107
- if (receivedInvitation?.id) {
1108
- navigation.navigate(Stacks.ConnectionStack as any, {
1109
- screen: Screens.Connection,
1110
- params: { oobRecordId: receivedInvitation.id },
1111
- })
1112
- }
1113
- } catch (error: unknown) {
1114
- logger.error('Problem during connect strategy, error:', error as Error)
1115
-
1116
- throw error
1117
- }
1118
- }
1119
-
1120
- /**
1121
- * Create a new connection invitation
1122
- *
1123
- * @param agent an Agent instance
1124
- * @param goalCode add goalCode to connection invitation
1125
- * @returns a connection record
1126
- */
1127
- export const createConnectionInvitation = async (agent: Agent | undefined, goalCode?: string) => {
1128
- const record = await agent?.oob.createInvitation({ goalCode })
1129
- if (!record) {
1130
- throw new Error('Could not create new invitation')
1131
- }
1132
- const invitationUrl = record.outOfBandInvitation.toUrl({ domain })
1133
-
1134
- return {
1135
- record,
1136
- invitation: record.outOfBandInvitation,
1137
- invitationUrl,
1138
- }
1139
- }
1140
-
1141
- /**
1142
- * Create a new connection invitation with a goal code specifying that it will be deleted after issuing or verifying once depending on type
1143
- *
1144
- * @param agent an Agent instance
1145
- * @param type add goalCode to connection invitation
1146
- * @returns a connection record
1147
- */
1148
- export const createTempConnectionInvitation = async (agent: Agent | undefined, type: 'issue' | 'verify') => {
1149
- return createConnectionInvitation(agent, `aries.vc.${type}.once`)
1150
- }
1151
-
1152
- /**
1153
- * Typeguard to check if any React children is represented as a function
1154
- * instead of a Node. I,e., when it's a {@link ChildFn}.
1155
- *
1156
- * @param children any React children
1157
- * @returns true if the children is a function, false otherwise
1158
- */
1159
- export function isChildFunction<T>(children: ReactNode | ChildFn<T>): children is ChildFn<T> {
1160
- return typeof children === 'function'
1161
- }
1162
-
1163
- // Fetches the credential definition id for a given credential exchange record, returns null if ID is not found
1164
- export const getCredentialDefinitionIdForRecord = (record: CredentialExchangeRecord): string | null => {
1165
- // assumes record is anonCred
1166
- return record.metadata.get('_anoncreds/credential')?.credentialDefinitionId ?? null
1167
- }
1168
-
1169
- // Fetches the schema id for a given credential exchange record, returns null if ID is not found
1170
- export const getCredentialSchemaIdForRecord = (record: CredentialExchangeRecord): string | null => {
1171
- // assumes record is anonCred
1172
- return record.metadata.get('_anoncreds/credential')?.schemaId ?? null
1173
- }
1174
-
1175
- export function getCredentialEventRole(record: CredentialExchangeRecord) {
1176
- switch (record.state) {
1177
- // assuming only Holder states are supported here
1178
- case CredentialState.ProposalSent:
1179
- return Role.me
1180
- case CredentialState.OfferReceived:
1181
- return Role.them
1182
- case CredentialState.RequestSent:
1183
- return Role.me
1184
- case CredentialState.Declined:
1185
- return Role.me
1186
- case CredentialState.CredentialReceived:
1187
- return Role.me
1188
- case CredentialState.Done:
1189
- return Role.me
1190
- default:
1191
- return Role.me
1192
- }
1193
- }
1194
-
1195
- export function getCredentialEventLabel(record: CredentialExchangeRecord) {
1196
- switch (record.state) {
1197
- // assuming only Holder states are supported here
1198
- case CredentialState.ProposalSent:
1199
- return 'Chat.CredentialProposalSent'
1200
- case CredentialState.OfferReceived:
1201
- return 'Chat.CredentialOfferReceived'
1202
- case CredentialState.RequestSent:
1203
- return 'Chat.CredentialRequestSent'
1204
- case CredentialState.Declined:
1205
- return 'Chat.CredentialDeclined'
1206
- case CredentialState.CredentialReceived:
1207
- case CredentialState.Done:
1208
- return 'Chat.CredentialReceived'
1209
- default:
1210
- return ''
1211
- }
1212
- }
1213
-
1214
- export function getProofEventRole(record: ProofExchangeRecord) {
1215
- switch (record.state) {
1216
- case ProofState.RequestSent:
1217
- return Role.me
1218
- case ProofState.ProposalReceived:
1219
- return Role.me
1220
- case ProofState.PresentationReceived:
1221
- return Role.them
1222
- case ProofState.RequestReceived:
1223
- return Role.them
1224
- case ProofState.ProposalSent:
1225
- case ProofState.PresentationSent:
1226
- return Role.me
1227
- case ProofState.Declined:
1228
- return Role.me
1229
- case ProofState.Abandoned:
1230
- return Role.them
1231
- case ProofState.Done:
1232
- return record.isVerified !== undefined ? Role.them : Role.me
1233
- default:
1234
- return Role.me
1235
- }
1236
- }
1237
-
1238
- export function getProofEventLabel(record: ProofExchangeRecord) {
1239
- switch (record.state) {
1240
- case ProofState.RequestSent:
1241
- case ProofState.ProposalReceived:
1242
- return 'Chat.ProofRequestSent'
1243
- case ProofState.PresentationReceived:
1244
- return 'Chat.ProofPresentationReceived'
1245
- case ProofState.RequestReceived:
1246
- return 'Chat.ProofRequestReceived'
1247
- case ProofState.ProposalSent:
1248
- case ProofState.PresentationSent:
1249
- return 'Chat.ProofRequestSatisfied'
1250
- case ProofState.Declined:
1251
- return 'Chat.ProofRequestRejected'
1252
- case ProofState.Abandoned:
1253
- return 'Chat.ProofRequestRejectReceived'
1254
- case ProofState.Done:
1255
- return record.isVerified !== undefined ? 'Chat.ProofPresentationReceived' : 'Chat.ProofRequestSatisfied'
1256
- default:
1257
- return ''
1258
- }
1259
- }
1260
-
1261
- export function getMessageEventRole(record: BasicMessageRecord) {
1262
- return record.role === BasicMessageRole.Sender ? Role.me : Role.them
1263
- }
1264
-
1265
- export function generateRandomWalletName() {
1266
- let name = 'My Wallet - '
1267
- for (let i = 0; i < 4; i++) {
1268
- name = name.concat(Math.floor(Math.random() * 10).toString())
1269
- }
1270
-
1271
- return name
1272
- }
1273
-
1274
- /**
1275
- * Returns the secondary background color for a credential card.
1276
- *
1277
- * @param {CredentialOverlay<BrandingOverlay>} overlay - The credential card containing branding information.
1278
- * @param {boolean} [proof] - Optional flag indicating if the context of the credential card is a proof.
1279
- * @returns {string | undefined} - The secondary background color of the branding or undefined if not applicable.
1280
- */
1281
- export function getSecondaryBackgroundColor(
1282
- overlay: CredentialOverlay<BrandingOverlay>,
1283
- proof?: boolean
1284
- ): string | undefined {
1285
- if (proof) {
1286
- return overlay.brandingOverlay?.primaryBackgroundColor
1287
- } else {
1288
- return overlay.brandingOverlay?.backgroundImageSlice
1289
- ? 'rgba(0, 0, 0, 0)'
1290
- : overlay.brandingOverlay?.secondaryBackgroundColor
1291
- }
1292
- }