Skip to content

Commit

Permalink
feat: Display some vc based on crypto account did issuer #2680
Browse files Browse the repository at this point in the history
  • Loading branch information
bibash28 committed Aug 15, 2024
1 parent 7c33505 commit f256742
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 94 deletions.
18 changes: 18 additions & 0 deletions lib/app/shared/helper_functions/helper_functions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2228,3 +2228,21 @@ Future<String> fetchRpcUrl({

return rpcUrl;
}

String getDidMethod(BlockchainType blockchainType) {
late String didMethod;

switch (blockchainType) {
case BlockchainType.tezos:
didMethod = AltMeStrings.cryptoTezosDIDMethod;

case BlockchainType.ethereum:
case BlockchainType.fantom:
case BlockchainType.polygon:
case BlockchainType.binance:
case BlockchainType.etherlink:
didMethod = AltMeStrings.cryptoEVMDIDMethod;
}

return didMethod;
}
15 changes: 2 additions & 13 deletions lib/credentials/cubit/credentials_helper_function.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,7 @@ Future<CredentialModel?> generateAssociatedWalletCredential({
getLogger('CredentialsCubit - generateAssociatedWalletCredential');
log.i(blockchainType);
try {
late String didMethod;

switch (blockchainType) {
case BlockchainType.tezos:
didMethod = AltMeStrings.cryptoTezosDIDMethod;

case BlockchainType.ethereum:
case BlockchainType.fantom:
case BlockchainType.polygon:
case BlockchainType.binance:
case BlockchainType.etherlink:
didMethod = AltMeStrings.cryptoEVMDIDMethod;
}
final didMethod = getDidMethod(blockchainType);

log.i('didMethod - $didMethod');

Expand All @@ -38,6 +26,7 @@ Future<CredentialModel?> generateAssociatedWalletCredential({
);

final String issuer = didKitProvider.keyToDID(didMethod, jwkKey);

log.i('jwkKey - $jwkKey');
log.i('didKitProvider.keyToDID - $issuer');

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'package:altme/app/app.dart';
import 'package:altme/dashboard/dashboard.dart';
import 'package:altme/wallet/wallet.dart';
import 'package:did_kit/did_kit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:key_generator/key_generator.dart';
import 'package:oidc4vc/oidc4vc.dart';

class HomeCredentialCategoryList extends StatelessWidget {
class HomeCredentialCategoryList extends StatefulWidget {
const HomeCredentialCategoryList({
super.key,
required this.credentials,
Expand All @@ -15,6 +17,28 @@ class HomeCredentialCategoryList extends StatelessWidget {
final List<CredentialModel> credentials;
final RefreshCallback onRefresh;

@override
State<HomeCredentialCategoryList> createState() =>
_HomeCredentialCategoryListState();
}

class _HomeCredentialCategoryListState
extends State<HomeCredentialCategoryList> {
Future<String> getDid() async {
final currentAccount = context.read<WalletCubit>().state.currentAccount!;

final didMethod = getDidMethod(currentAccount.blockchainType);

final String jwkKey = await KeyGenerator().jwkFromSecretKey(
secretKey: currentAccount.secretKey,
accountType: currentAccount.blockchainType.accountType,
);

final String issuer = DIDKitProvider().keyToDID(didMethod, jwkKey);

return issuer;
}

@override
Widget build(BuildContext context) {
return BlocBuilder<AdvanceSettingsCubit, AdvanceSettingsState>(
Expand All @@ -25,90 +49,114 @@ class HomeCredentialCategoryList extends StatelessWidget {
.profileSetting.selfSovereignIdentityOptions.customOidc4vcProfile;

return RefreshIndicator(
onRefresh: onRefresh,
onRefresh: widget.onRefresh,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: Sizes.space2XSmall),
child: ListView(
scrollDirection: Axis.vertical,
children: getCredentialCategorySorted.where(
(category) {
return advanceSettingsState.categoryIsEnabledMap[category] ??
true;
},
).map((category) {
final categorizedCredentials = credentials.where(
(element) {
/// id credential category does not match, do not show
if (element.credentialPreview.credentialSubjectModel
.credentialCategory !=
category) {
return false;
}

/// wallet credential to be shown always
if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType ==
CredentialSubjectType.walletCredential) {
if (!profileModel.isDeveloperMode) {
return false;
}
}

/// crypto credential account to be shown always
if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType.isBlockchainAccount) {
/// only show crypto card with matches current account
/// wallet address
final String? currentWalletAddress = context
.read<WalletCubit>()
.state
.currentAccount
?.walletAddress;

final String? walletAddress = getWalletAddress(
element.credentialPreview.credentialSubjectModel,
);

if (currentWalletAddress.toString() !=
walletAddress.toString()) {
return false;
}
}

if (customOidc4vcProfile.vcFormatType.vcValue ==
VCFormatType.auto.vcValue) {
return true;
}

/// do not load the credential if vc format is different
if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType !=
CredentialSubjectType.walletCredential) {
if (customOidc4vcProfile.vcFormatType.vcValue !=
element.getFormat) {
return false;
}
}

return true;
},
).toList();
if (categorizedCredentials.isEmpty) {
if (category.showInHomeIfListEmpty) {
return HomeCredentialCategoryItem(
credentials: const [],
credentialCategory: category,
child: FutureBuilder<String>(
future: getDid(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.done:
final issuerDid = snapshot.data!;
return ListView(
scrollDirection: Axis.vertical,
children: getCredentialCategorySorted.where(
(category) {
return advanceSettingsState
.categoryIsEnabledMap[category] ??
true;
},
).map((category) {
final categorizedCredentials = widget.credentials.where(
(element) {
/// id credential category does not match, do
/// not show
if (element.credentialPreview.credentialSubjectModel
.credentialCategory !=
category) {
return false;
}

/// wallet credential to be shown always
if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType ==
CredentialSubjectType.walletCredential) {
if (!profileModel.isDeveloperMode) {
return false;
}
}

/// crypto credential account to be shown always
if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType.isBlockchainAccount) {
/// only show crypto card with matches current account
/// wallet address
final String? currentWalletAddress = context
.read<WalletCubit>()
.state
.currentAccount
?.walletAddress;

final String? walletAddress = getWalletAddress(
element
.credentialPreview.credentialSubjectModel,
);

if (currentWalletAddress.toString() !=
walletAddress.toString()) {
return false;
}
}

/// if crypto did matches with vc.
if (issuerDid ==
element.credentialPreview.credentialSubjectModel
.id) {
return true;
}

if (customOidc4vcProfile.vcFormatType.vcValue ==
VCFormatType.auto.vcValue) {
return true;
}

if (element.credentialPreview.credentialSubjectModel
.credentialSubjectType !=
CredentialSubjectType.walletCredential) {
/// do not load the credential if vc format is
/// different
if (customOidc4vcProfile.vcFormatType.vcValue !=
element.getFormat) {
return false;
}
}

return true;
},
).toList();
if (categorizedCredentials.isEmpty) {
if (category.showInHomeIfListEmpty) {
return HomeCredentialCategoryItem(
credentials: const [],
credentialCategory: category,
);
} else {
return const SizedBox.shrink();
}
} else {
return HomeCredentialCategoryItem(
credentials: categorizedCredentials,
credentialCategory: category,
);
}
}).toList(),
);
} else {
return const SizedBox.shrink();
}
} else {
return HomeCredentialCategoryItem(
credentials: categorizedCredentials,
credentialCategory: category,
);
case ConnectionState.waiting:
case ConnectionState.none:
case ConnectionState.active:
return const SizedBox();
}
}).toList(),
},
),
),
);
Expand Down

0 comments on commit f256742

Please sign in to comment.