Skip to content

Commit

Permalink
get claims
Browse files Browse the repository at this point in the history
  • Loading branch information
hawkbee1 committed Mar 8, 2024
1 parent 5ec65a0 commit c1cc005
Show file tree
Hide file tree
Showing 6 changed files with 328 additions and 102 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import 'package:altme/app/app.dart';
import 'package:altme/credentials/credentials.dart';
import 'package:altme/dashboard/dashboard.dart';
import 'package:altme/dashboard/home/tab_bar/credentials/present/pick/credential_manifest/view/selective_disclosure_pick_page.dart';
import 'package:altme/l10n/l10n.dart';
import 'package:altme/scan/cubit/scan_cubit.dart';
import 'package:altme/theme/theme.dart';
import 'package:credential_manifest/credential_manifest.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:oidc4vc/oidc4vc.dart';

class CredentialManifestOfferPickPage extends StatelessWidget {
const CredentialManifestOfferPickPage({
Expand Down Expand Up @@ -174,70 +176,84 @@ class CredentialManifestOfferPickView extends StatelessWidget {
),
navigation: credentialManifestState
.filteredCredentialList.isNotEmpty
? SafeArea(
child: Container(
padding: const EdgeInsets.all(16),
child: Tooltip(
message: l10n.credentialPickPresent,
child: Builder(
builder: (context) {
final inputDescriptor =
presentationDefinition!.inputDescriptors[
inputDescriptorIndex];
? context
.read<ProfileCubit>()
.state
.model
.profileSetting
.selfSovereignIdentityOptions
.customOidc4vcProfile
.vcFormatType ==
VCFormatType.vcSdJWT
? vcSdJwtCredentialPickButton(
context: context,
credentialManifestState: credentialManifestState,
)
: SafeArea(
child: Container(
padding: const EdgeInsets.all(16),
child: Tooltip(
message: l10n.credentialPickPresent,
child: Builder(
builder: (context) {
final inputDescriptor =
presentationDefinition!
.inputDescriptors[
inputDescriptorIndex];

final bool isOptional = inputDescriptor
.constraints
?.fields
?.first
.optional ??
false;
final bool isOptional = inputDescriptor
.constraints
?.fields
?.first
.optional ??
false;

final bool isOngoingStep =
inputDescriptorIndex + 1 !=
presentationDefinition
.inputDescriptors.length;
final bool isOngoingStep =
inputDescriptorIndex + 1 !=
presentationDefinition
.inputDescriptors.length;

if (isOptional) {
return MyGradientButton(
onPressed: () => present(
context: context,
credentialManifestState:
credentialManifestState,
presentationDefinition:
presentationDefinition,
skip: credentialManifestState
.selected.isEmpty,
),
text: credentialManifestState
.selected.isEmpty
? l10n.skip
: isOngoingStep
if (isOptional) {
return MyGradientButton(
onPressed: () => present(
context: context,
credentialManifestState:
credentialManifestState,
presentationDefinition:
presentationDefinition,
skip: credentialManifestState
.selected.isEmpty,
),
text: credentialManifestState
.selected.isEmpty
? l10n.skip
: isOngoingStep
? l10n.next
: l10n.credentialPickPresent,
);
} else {
return MyGradientButton(
onPressed: !credentialManifestState
.isButtonEnabled
? null
: () => present(
context: context,
credentialManifestState:
credentialManifestState,
presentationDefinition:
presentationDefinition,
skip: false,
),
text: isOngoingStep
? l10n.next
: l10n.credentialPickPresent,
);
} else {
return MyGradientButton(
onPressed: !credentialManifestState
.isButtonEnabled
? null
: () => present(
context: context,
credentialManifestState:
credentialManifestState,
presentationDefinition:
presentationDefinition,
skip: false,
),
text: isOngoingStep
? l10n.next
: l10n.credentialPickPresent,
);
}
},
);
}
},
),
),
),
),
),
)
)
: const SizedBox.shrink(),
),
);
Expand Down Expand Up @@ -317,4 +333,38 @@ class CredentialManifestOfferPickView extends StatelessWidget {
);
}
}

Widget vcSdJwtCredentialPickButton({
required BuildContext context,
required CredentialManifestPickState credentialManifestState,
}) {
final l10n = context.l10n;

final button = SafeArea(
child: Container(
padding: const EdgeInsets.all(16),
child: Tooltip(
message: l10n.credentialPickPresent,
child: MyGradientButton(
onPressed: !credentialManifestState.isButtonEnabled
? null
: () => Navigator.of(context).pushReplacement<void, void>(
SelectiveDisclosurePickPage.route(
uri: uri,
issuer: issuer,
credential: credential,
credentialToBePresented:
credentialManifestState.filteredCredentialList[
credentialManifestState.selected.first],
),
),

/// next button because we will now choose the claims we will present
/// from the selected credential
text: l10n.next,
),
),
));
return button;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
import 'package:altme/app/app.dart';
import 'package:altme/credentials/credentials.dart';
import 'package:altme/dashboard/dashboard.dart';
import 'package:altme/l10n/l10n.dart';
import 'package:altme/scan/cubit/scan_cubit.dart';
import 'package:altme/theme/theme.dart';
import 'package:credential_manifest/credential_manifest.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class SelectiveDisclosurePickPage extends StatelessWidget {
const SelectiveDisclosurePickPage({
super.key,
required this.uri,
required this.credential,
required this.issuer,
required this.credentialToBePresented,
});

final Uri uri;
final CredentialModel credential;
final Issuer issuer;
final CredentialModel credentialToBePresented;

static Route<dynamic> route({
required Uri uri,
required CredentialModel credential,
required Issuer issuer,
required CredentialModel credentialToBePresented,
}) {
return MaterialPageRoute<void>(
builder: (context) => SelectiveDisclosurePickPage(
uri: uri,
credential: credential,
issuer: issuer,
credentialToBePresented: credentialToBePresented,
),
settings: const RouteSettings(name: '/SelectiveDisclosurePickPage'),
);
}

@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) {
return CredentialManifestPickCubit(
credential: credential,
credentialList: context.read<CredentialsCubit>().state.credentials,
inputDescriptorIndex: 0,
);
},
child: SelectiveDisclosurePickView(
uri: uri,
credential: credential,
issuer: issuer,
credentialToBePresented: credentialToBePresented,
),
);
}
}

class SelectiveDisclosurePickView extends StatelessWidget {
const SelectiveDisclosurePickView({
super.key,
required this.uri,
required this.credential,
required this.issuer,
required this.credentialToBePresented,
});

final Uri uri;
final CredentialModel credential;
final Issuer issuer;
final CredentialModel credentialToBePresented;

@override
Widget build(BuildContext context) {
final l10n = context.l10n;

return BlocConsumer<CredentialManifestPickCubit,
CredentialManifestPickState>(
listener: (context, state) {
if (state.message != null) {
AlertMessage.showStateMessage(
context: context,
stateMessage: state.message!,
);
}
},
builder: (context, credentialManifestState) {
final PresentationDefinition? presentationDefinition =
credentialManifestState.presentationDefinition;

return BlocListener<ScanCubit, ScanState>(
listener: (context, scanState) {
if (scanState.status == ScanStatus.loading) {
LoadingView().show(context: context);
} else {
LoadingView().hide();
}
if (scanState.message != null) {
AlertMessage.showStateMessage(
context: context,
stateMessage: scanState.message!,
);
}
},
child: credentialManifestState.filteredCredentialList.isEmpty
? const RequiredCredentialNotFound()
: BasePage(
title: l10n.credentialPickTitle,
titleAlignment: Alignment.topCenter,
titleTrailing: const WhiteCloseButton(),
padding: const EdgeInsets.symmetric(
vertical: 24,
horizontal: 16,
),
body: ClaimsData(
credentialModel: credentialToBePresented,
),
navigation: SafeArea(
child: Container(
padding: const EdgeInsets.all(16),
child: Tooltip(
message: l10n.credentialPickPresent,
child: MyGradientButton(
onPressed: () => (),
text: l10n.credentialPickPresent,
),
),
),
),
),
);
},
);
}
}
13 changes: 12 additions & 1 deletion lib/lang/cubit/lang_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,18 @@ class LangCubit extends Cubit<LangState> {
/// emit new state if language recorded is dufferent than english
Future<void> checkLocale() async {
final languageType = await getRecordedLanguage();
emit(state.copyWith(languageType: languageType));
if (languageType == LanguageType.phone) {
emit(state.copyWith(languageType: languageType));
} else {
emit(
state.copyWith(
languageType: languageType,
locale: Locale(
languageType.name,
),
),
);
}
}

Future<LanguageType> getRecordedLanguage() async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ List<String> getTextsFromCredential(
) {
final textList = <String>[];
try {
final fieldsPath = JsonPath(jsonPath.replaceAll('.vc', ''));
final fieldsPath = JsonPath(jsonPath);
fieldsPath.read(data).forEach((a) {
final dynamic value = a.value;
if (value is String) {
Expand Down
3 changes: 3 additions & 0 deletions packages/credential_manifest/lib/src/models/format.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class Format {
this.jwtVc,
this.ldpVp,
this.ldpVc,
this.vcSdJwt,
});

factory Format.fromJson(Map<String, dynamic> json) => _$FormatFromJson(json);
Expand All @@ -22,6 +23,8 @@ class Format {
FormatType? ldpVp;
@JsonKey(name: 'ldp_vc')
FormatType? ldpVc;
@JsonKey(name: 'vc+sd-jwt')
FormatType? vcSdJwt;

Map<String, dynamic> toJson() => _$FormatToJson(this);
}
Loading

0 comments on commit c1cc005

Please sign in to comment.