diff --git a/assets/image/default_polygon_card.png b/assets/image/default_polygon_card.png new file mode 100644 index 000000000..0cbba1c18 Binary files /dev/null and b/assets/image/default_polygon_card.png differ diff --git a/lib/app/shared/constants/image_strings.dart b/lib/app/shared/constants/image_strings.dart index 6f2cfbdef..953ef844a 100644 --- a/lib/app/shared/constants/image_strings.dart +++ b/lib/app/shared/constants/image_strings.dart @@ -70,6 +70,8 @@ class ImageStrings { static const String kycCountryOfResidenceCard = '$imagePath/kyc_country_of_residence_card.png'; static const String civicPassCard = '$imagePath/civic_pass_card.png'; + static const String defaultPolygonCard = + '$imagePath/default_polygon_card.png'; static const String euDiplomaCard = '$imagePath/eu_diploma_card.png'; static const String defiComplianceCard = '$imagePath/defi-compliance-card.png'; diff --git a/lib/app/shared/enum/type/credential_subject_type/credential_subject_type_extension.dart b/lib/app/shared/enum/type/credential_subject_type/credential_subject_type_extension.dart index fb29ad70a..0678eeb58 100644 --- a/lib/app/shared/enum/type/credential_subject_type/credential_subject_type_extension.dart +++ b/lib/app/shared/enum/type/credential_subject_type/credential_subject_type_extension.dart @@ -291,7 +291,7 @@ extension CredentialSubjectTypeExtension on CredentialSubjectType { case CredentialSubjectType.proofOfTwitterStats: return 'ProofOfTwitterStats'; case CredentialSubjectType.civicPassCredential: - return 'CivicPassCredentials'; + return 'CivicPassCredential'; case CredentialSubjectType.defaultCredential: return ''; } diff --git a/lib/app/shared/helper_functions/helper_functions.dart b/lib/app/shared/helper_functions/helper_functions.dart index 5a3464f94..df4537b88 100644 --- a/lib/app/shared/helper_functions/helper_functions.dart +++ b/lib/app/shared/helper_functions/helper_functions.dart @@ -336,6 +336,12 @@ bool isVerifiableDiplomaType(CredentialModel credentialModel) { return credentialModel.credentialPreview.type.contains('VerifiableDiploma'); } +bool isPolygonIdCard(CredentialModel credentialModel) { + return credentialModel.credentialPreview.credentialSubjectModel.id + ?.contains('did:polygonid:polygon:') ?? + false; +} + Map decodePayload({ required JWTDecode jwtDecode, required String token, diff --git a/lib/credentials/cubit/credentials_cubit.dart b/lib/credentials/cubit/credentials_cubit.dart index b73cab9a8..7209ffc25 100644 --- a/lib/credentials/cubit/credentials_cubit.dart +++ b/lib/credentials/cubit/credentials_cubit.dart @@ -55,10 +55,45 @@ class CredentialsCubit extends Cubit { emit(state.copyWith(status: CredentialsStatus.loading)); final savedCredentials = await credentialsRepository.findAll(/* filters */); final dummies = _getAvalaibleDummyCredentials(savedCredentials); + + final List updatedCredentials = []; + + /// manually categorizing default credential + for (final credential in savedCredentials) { + final isDefaultCredential = credential + .credentialPreview.credentialSubjectModel.credentialSubjectType == + CredentialSubjectType.defaultCredential; + + if (isDefaultCredential && isVerifiableDiplomaType(credential)) { + final updatedCredential = credential.copyWith( + credentialPreview: credential.credentialPreview.copyWith( + credentialSubjectModel: + credential.credentialPreview.credentialSubjectModel.copyWith( + credentialCategory: CredentialCategory.educationCards, + ), + ), + ); + updatedCredentials.add(updatedCredential); + } else if (isDefaultCredential && isPolygonIdCard(credential)) { + final updatedCredential = credential.copyWith( + credentialPreview: credential.credentialPreview.copyWith( + credentialSubjectModel: + credential.credentialPreview.credentialSubjectModel.copyWith( + credentialCategory: CredentialCategory.polygonidCards, + ), + ), + ); + + updatedCredentials.add(updatedCredential); + } else { + updatedCredentials.add(credential); + } + } + emit( state.copyWith( status: CredentialsStatus.populate, - credentials: savedCredentials, + credentials: updatedCredentials, dummyCredentials: dummies, ), ); @@ -171,7 +206,11 @@ class CredentialsCubit extends Cubit { }) async { late final List credentials; - if (isVerifiableDiplomaType(credential)) { + final isDefaultCredential = credential + .credentialPreview.credentialSubjectModel.credentialSubjectType == + CredentialSubjectType.defaultCredential; + + if (isDefaultCredential && isVerifiableDiplomaType(credential)) { final updatedCredential = credential.copyWith( credentialPreview: credential.credentialPreview.copyWith( credentialSubjectModel: @@ -183,6 +222,18 @@ class CredentialsCubit extends Cubit { await replaceCredential(credential: updatedCredential); await credentialsRepository.insert(updatedCredential); credentials = List.of(state.credentials)..add(updatedCredential); + } else if (isDefaultCredential && isPolygonIdCard(credential)) { + final updatedCredential = credential.copyWith( + credentialPreview: credential.credentialPreview.copyWith( + credentialSubjectModel: + credential.credentialPreview.credentialSubjectModel.copyWith( + credentialCategory: CredentialCategory.polygonidCards, + ), + ), + ); + await replaceCredential(credential: updatedCredential); + await credentialsRepository.insert(updatedCredential); + credentials = List.of(state.credentials)..add(updatedCredential); } else { await replaceCredential(credential: credential); await credentialsRepository.insert(credential); diff --git a/lib/dashboard/home/tab_bar/credentials/polygon_id/polygon_id_credential_offer/view/polygon_id_credential_offer_view.dart b/lib/dashboard/home/tab_bar/credentials/polygon_id/polygon_id_credential_offer/view/polygon_id_credential_offer_view.dart index ffb8f6a34..84fbbe721 100644 --- a/lib/dashboard/home/tab_bar/credentials/polygon_id/polygon_id_credential_offer/view/polygon_id_credential_offer_view.dart +++ b/lib/dashboard/home/tab_bar/credentials/polygon_id/polygon_id_credential_offer/view/polygon_id_credential_offer_view.dart @@ -49,6 +49,37 @@ class PolygonIdCredentialOfferPage extends StatelessWidget { final jsonCredential = polygonIdCubitState.claims![i].info; final credentialPreview = Credential.fromJson(jsonCredential); + final DisplayMapping? titleDisplayMapping = polygonIdCubitState + .credentialManifests![i] + .outputDescriptors + ?.first + .display + ?.title; + + var title = ''; + + if (titleDisplayMapping is DisplayMappingText) { + title = titleDisplayMapping.text; + } + + if (titleDisplayMapping is DisplayMappingPath) { + title = titleDisplayMapping.fallback ?? ''; + } + + final DisplayMapping? subTitleDisplayMapping = + polygonIdCubitState.credentialManifests![i] + .outputDescriptors?.first.display?.subtitle; + + var subTitle = ''; + + if (subTitleDisplayMapping is DisplayMappingText) { + subTitle = subTitleDisplayMapping.text; + } + + if (subTitleDisplayMapping is DisplayMappingPath) { + subTitle = subTitleDisplayMapping.fallback ?? ''; + } + Widget widget; final credentialSubjectType = credentialPreview @@ -78,35 +109,6 @@ class PolygonIdCredentialOfferPage extends StatelessWidget { ); } else if (credentialSubjectType == CredentialSubjectType.civicPassCredential) { - final polygonIdCubitState = - context.read().state; - final DisplayMapping? titleDisplayMapping = - polygonIdCubitState.credentialManifests![i] - .outputDescriptors?.first.display?.title; - - var title = ''; - - if (titleDisplayMapping is DisplayMappingText) { - title = titleDisplayMapping.text; - } - - if (titleDisplayMapping is DisplayMappingPath) { - title = titleDisplayMapping.fallback ?? ''; - } - - final DisplayMapping? subTitleDisplayMapping = - polygonIdCubitState.credentialManifests![i] - .outputDescriptors?.first.display?.subtitle; - - var subTitle = ''; - - if (subTitleDisplayMapping is DisplayMappingText) { - subTitle = subTitleDisplayMapping.text; - } - - if (subTitleDisplayMapping is DisplayMappingPath) { - subTitle = subTitleDisplayMapping.fallback ?? ''; - } widget = CredentialBaseWidget( title: title, cardBackgroundImagePath: ImageStrings.civicPassCard, @@ -114,23 +116,17 @@ class PolygonIdCredentialOfferPage extends StatelessWidget { value: subTitle, ); } else { - widget = DefaultCredentialListWidget( - credentialModel: CredentialModel( - id: credentialPreview.id, - image: 'image', - credentialPreview: credentialPreview, - shareLink: '', - display: const Display( - '', - '', - '', - '', - ), - data: const {}, - ), + widget = CredentialBaseWidget( + title: title, + cardBackgroundImagePath: ImageStrings.defaultPolygonCard, + issuerName: 'ALTME', + value: subTitle, ); } + print(credentialPreview + .credentialSubjectModel.credentialSubjectType); + return Padding( padding: const EdgeInsets.only(bottom: 15), child: widget, diff --git a/lib/dashboard/home/tab_bar/credentials/widgets/credential_display.dart b/lib/dashboard/home/tab_bar/credentials/widgets/credential_display.dart index d1d341fec..4beb30673 100644 --- a/lib/dashboard/home/tab_bar/credentials/widgets/credential_display.dart +++ b/lib/dashboard/home/tab_bar/credentials/widgets/credential_display.dart @@ -71,18 +71,22 @@ class CredentialDisplay extends StatelessWidget { } case CredentialSubjectType.defaultCredential: - switch (credDisplayType) { - case CredDisplayType.List: - return DefaultCredentialListWidget( - credentialModel: credentialModel, - showBgDecoration: false, - ); - case CredDisplayType.Detail: - return DefaultCredentialDetailWidget( - credentialModel: credentialModel, - showBgDecoration: false, - fromCredentialOffer: fromCredentialOffer!, - ); + if (isPolygonIdCard(credentialModel)) { + return DefaultPolygonIdCardWidget(credentialModel: credentialModel); + } else { + switch (credDisplayType) { + case CredDisplayType.List: + return DefaultCredentialListWidget( + credentialModel: credentialModel, + showBgDecoration: false, + ); + case CredDisplayType.Detail: + return DefaultCredentialDetailWidget( + credentialModel: credentialModel, + showBgDecoration: false, + fromCredentialOffer: fromCredentialOffer!, + ); + } } case CredentialSubjectType.ecole42LearningAchievement: diff --git a/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_base_widget.dart b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_base_widget.dart index da37218a9..780e5205d 100644 --- a/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_base_widget.dart +++ b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_base_widget.dart @@ -38,7 +38,7 @@ class CredentialBaseWidget extends StatelessWidget { LayoutId( id: 'title', child: FractionallySizedBox( - widthFactor: 0.75, + widthFactor: 0.7, heightFactor: 0.19, child: Container( alignment: Alignment.centerLeft, diff --git a/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_widget.dart b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_widget.dart index d51535134..b6e2beb18 100644 --- a/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_widget.dart +++ b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/credential_widget.dart @@ -15,6 +15,7 @@ export 'civic_pass_credential_widget.dart'; export 'credential_base_widget.dart'; export 'default_credential_detail_widget.dart'; export 'default_credential_list_widget.dart'; +export 'default_polygonid_card.dart'; export 'defi_complinace_credential_widget.dart'; export 'diploma_card_widget.dart'; export 'dogami_pass_widget.dart'; diff --git a/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/default_polygonid_card.dart b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/default_polygonid_card.dart new file mode 100644 index 000000000..dddbeb6f2 --- /dev/null +++ b/lib/dashboard/home/tab_bar/credentials/widgets/credential_widget/default_polygonid_card.dart @@ -0,0 +1,55 @@ +import 'package:altme/app/app.dart'; +import 'package:altme/dashboard/dashboard.dart'; +import 'package:credential_manifest/credential_manifest.dart'; +import 'package:flutter/material.dart'; + +class DefaultPolygonIdCardWidget extends StatelessWidget { + const DefaultPolygonIdCardWidget({ + super.key, + required this.credentialModel, + }); + + final CredentialModel credentialModel; + + @override + Widget build(BuildContext context) { + final DisplayMapping? titleDisplayMapping = credentialModel + .credentialManifest!.outputDescriptors?.first.display?.title; + + var title = ''; + + if (titleDisplayMapping is DisplayMappingText) { + title = titleDisplayMapping.text; + } + + if (titleDisplayMapping is DisplayMappingPath) { + title = titleDisplayMapping.fallback ?? ''; + } + + final DisplayMapping? subTitleDisplayMapping = credentialModel + .credentialManifest!.outputDescriptors?.first.display?.subtitle; + + var subTitle = ''; + + if (subTitleDisplayMapping is DisplayMappingText) { + subTitle = subTitleDisplayMapping.text; + } + + if (subTitleDisplayMapping is DisplayMappingPath) { + subTitle = subTitleDisplayMapping.fallback ?? ''; + } + + return CredentialBaseWidget( + title: title, + cardBackgroundImagePath: ImageStrings.defaultPolygonCard, + issuerName: 'ALTME', + value: subTitle, + issuanceDate: UiDate.formatDateForCredentialCard( + credentialModel.credentialPreview.issuanceDate, + ), + expirationDate: credentialModel.expirationDate == null + ? '--' + : UiDate.formatDateForCredentialCard(credentialModel.expirationDate!), + ); + } +}