1- import { type RegisterCredentialsOptions , registerCredentials } from '@animo-id/expo-digital-credentials-api'
2- import { DateOnly , type Logger , type MdocNameSpaces , type MdocRecord } from '@credo-ts/core'
1+ import {
2+ type AptitudeConsortiumConfig ,
3+ registerCredentials ,
4+ } from '@animo-id/expo-digital-credentials-api-aptitude-consortium'
5+ import { DateOnly , type Logger , type MdocNameSpaces , type MdocRecord , type SdJwtVcRecord } from '@credo-ts/core'
36import { t } from '@lingui/core/macro'
47import { commonMessages , i18n } from '@package/translations'
58import { ImageFormat , Skia } from '@shopify/react-native-skia'
@@ -12,8 +15,9 @@ import { getCredentialForDisplay } from '../display/credential'
1215import { resolveClaimsWithRecordMetadata , resolveLabelFromClaimsPath } from '../format/attributes'
1316import type { ParadymWalletSdk } from '../ParadymWalletSdk'
1417
15- type CredentialItem = RegisterCredentialsOptions [ 'credentials' ] [ number ]
16- type CredentialDisplayClaim = NonNullable < CredentialItem [ 'display' ] [ 'claims' ] > [ number ]
18+ type CredentialItem = NonNullable < AptitudeConsortiumConfig [ 'credentials' ] > [ number ]
19+ type CredentialDisplayClaim = NonNullable < CredentialItem [ 'fields' ] > [ number ]
20+ const noTransactionDataTypes : NonNullable < CredentialItem [ 'transaction_data_types' ] > = [ ]
1721
1822function mapMdocAttributes ( namespaces : MdocNameSpaces ) {
1923 return Object . fromEntries (
@@ -43,7 +47,7 @@ function mapMdocAttributesToClaimDisplay(namespaces: MdocNameSpaces, record: Mdo
4347 return Object . entries ( namespaces ) . flatMap ( ( [ namespace , values ] ) =>
4448 Object . keys ( values ) . map ( ( key ) => ( {
4549 path : [ namespace , key ] ,
46- displayName : resolveLabelFromClaimsPath ( [ namespace , key ] , claims , i18n . locale ) ?? t ( commonMessages . unknown ) ,
50+ display_name : resolveLabelFromClaimsPath ( [ namespace , key ] , claims , i18n . locale ) ?? t ( commonMessages . unknown ) ,
4751 } ) )
4852 )
4953}
@@ -62,13 +66,32 @@ function mapSdJwtAttributesToClaimDisplay(
6266 return [
6367 {
6468 path : [ ...path , claimName ] ,
65- displayName : resolveLabelFromClaimsPath ( [ ...path , claimName ] , claims , i18n . locale ) ?? t ( commonMessages . unknown ) ,
69+ display_name :
70+ resolveLabelFromClaimsPath ( [ ...path , claimName ] , claims , i18n . locale ) ?? t ( commonMessages . unknown ) ,
6671 } ,
6772 ...nestedClaims ,
6873 ]
6974 } )
7075}
7176
77+ function normalizeAptitudeIcon ( iconDataUrl ?: string ) {
78+ if ( ! iconDataUrl ) return undefined
79+
80+ const commaIndex = iconDataUrl . indexOf ( ',' )
81+ return commaIndex >= 0 ? iconDataUrl . slice ( commaIndex + 1 ) : iconDataUrl
82+ }
83+
84+ function getSdJwtVcts ( record : SdJwtVcRecord ) {
85+ const chainVcts = record . typeMetadataChain
86+ ?. map ( ( entry ) => entry . vct )
87+ . filter ( ( vct ) : vct is string => typeof vct === 'string' && vct . length > 0 )
88+
89+ const tagVct = record . getTags ( ) . vct
90+ const vcts = chainVcts && chainVcts . length > 0 ? chainVcts : tagVct ? [ tagVct ] : [ ]
91+
92+ return vcts . length > 0 ? Array . from ( new Set ( vcts ) ) : undefined
93+ }
94+
7295/**
7396 * Returns base64 data url
7497 */
@@ -196,18 +219,15 @@ export async function dcApiRegisterCredentials({
196219 : undefined
197220
198221 return {
199- id : record . id ,
200- credential : {
201- doctype : mdoc . docType ,
202- format : 'mso_mdoc' ,
203- namespaces : mapMdocAttributes ( mdoc . issuerSignedNamespaces ) ,
204- } ,
205- display : {
206- title : display . name ?? displayTitleFallback ,
207- subtitle : display . issuer . name ? displaySubtitle ( display . issuer . name ) : displaySubtitleFallback ,
208- claims : mapMdocAttributesToClaimDisplay ( mdoc . issuerSignedNamespaces , record ) ,
209- iconDataUrl,
210- } ,
222+ id : getCredentialForDisplay ( record ) . id ,
223+ format : 'mso_mdoc' ,
224+ title : display . name ?? displayTitleFallback ,
225+ subtitle : display . issuer . name ? displaySubtitle ( display . issuer . name ) : displaySubtitleFallback ,
226+ fields : mapMdocAttributesToClaimDisplay ( mdoc . issuerSignedNamespaces , record ) ,
227+ icon : normalizeAptitudeIcon ( iconDataUrl ) ,
228+ doctype : mdoc . docType ,
229+ transaction_data_types : noTransactionDataTypes ,
230+ claims : mapMdocAttributes ( mdoc . issuerSignedNamespaces ) ,
211231 } as const
212232 } )
213233
@@ -224,28 +244,31 @@ export async function dcApiRegisterCredentials({
224244 const claims = resolveClaimsWithRecordMetadata ( record )
225245
226246 return {
227- id : record . id ,
228- credential : {
229- vct : record . getTags ( ) . vct ,
230- format : 'dc+sd-jwt' ,
231- // biome-ignore lint/suspicious/noExplicitAny: no explanation
232- claims : sdJwtVc . prettyClaims as any ,
233- } ,
234- display : {
235- title : display . name ?? displayTitleFallback ,
236- subtitle : display . issuer . name ? displaySubtitle ( display . issuer . name ) : displaySubtitleFallback ,
237- claims : mapSdJwtAttributesToClaimDisplay ( claims , record ) ,
238- iconDataUrl,
239- } ,
247+ id : getCredentialForDisplay ( record ) . id ,
248+ format : 'dc+sd-jwt' ,
249+ title : display . name ?? displayTitleFallback ,
250+ subtitle : display . issuer . name ? displaySubtitle ( display . issuer . name ) : displaySubtitleFallback ,
251+ fields : mapSdJwtAttributesToClaimDisplay ( claims , sdJwtVc . prettyClaims ) ,
252+ icon : normalizeAptitudeIcon ( iconDataUrl ) ,
253+ vcts : getSdJwtVcts ( record ) ,
254+ transaction_data_types : noTransactionDataTypes ,
255+ // biome-ignore lint/suspicious/noExplicitAny: no explanation
256+ claims : sdJwtVc . prettyClaims as any ,
240257 } as const
241258 } )
242259
243260 const credentials = await Promise . all ( [ ...sdJwtCredentials , ...mdocCredentials ] )
244261 paradym . logger . trace ( 'Registering credentials for Digital Credentials API' )
245262
246263 await registerCredentials ( {
247- credentials,
248- matcher : 'ubique' ,
264+ aptitudeConsortiumConfig : {
265+ log_level : __DEV__ ? 'debug' : undefined ,
266+ dcql : {
267+ credential_set_option_mode : 'all_satisfiable' ,
268+ optional_credential_sets_mode : 'prefer_present' ,
269+ } ,
270+ credentials,
271+ } ,
249272 } )
250273 } catch ( error ) {
251274 // Since this is an experimental feature, and it doedisplayTitleFallbacksn't work if you don't have the latest
0 commit comments