Skip to content

Commit ffa7e42

Browse files
committed
Display popup error for OIDC4VP transaction
1 parent 3542472 commit ffa7e42

File tree

12 files changed

+83
-11
lines changed

12 files changed

+83
-11
lines changed

lib/app/shared/alert_message/alert_message.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:altme/app/app.dart';
2+
import 'package:altme/app/shared/alert_message/exception_message.dart';
23
import 'package:altme/dashboard/dashboard.dart';
34
import 'package:altme/l10n/l10n.dart';
45
import 'package:flutter/material.dart';
@@ -102,6 +103,19 @@ class AlertMessage {
102103
);
103104
}
104105
}
106+
107+
static void displayMessage({
108+
required BuildContext context,
109+
required ExceptionMessage exception,
110+
}) {
111+
showDialog<bool>(
112+
context: context,
113+
builder: (context) => ErrorDialog(
114+
title: exception.error,
115+
erroDescription: exception.errorDescription,
116+
),
117+
);
118+
}
105119
}
106120

107121
class SnackBarContent extends StatelessWidget {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ExceptionMessage implements Exception {
2+
ExceptionMessage({required this.error, required this.errorDescription});
3+
final String error;
4+
final String errorDescription;
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'package:altme/app/shared/alert_message/exception_message.dart';
2+
import 'package:bloc/bloc.dart';
3+
4+
class MessageCubit extends Cubit<ExceptionMessage> {
5+
MessageCubit() : super(ExceptionMessage(error: '', errorDescription: ''));
6+
7+
void error(ExceptionMessage exception) {
8+
emit(exception);
9+
}
10+
}

lib/app/shared/helper_functions/helper_functions.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,8 @@ MessageHandler getMessageHandler(dynamic e) {
989989
final error = NetworkException.getDioException(error: e);
990990

991991
return NetworkException(data: error.data);
992+
} else if (e is ResponseMessage) {
993+
return e;
992994
} else if (e is FormatException) {
993995
return ResponseMessage(
994996
data: {

lib/app/shared/message_handler/message_handler/message_handler.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22

33
mixin MessageHandler implements Exception {
4+
45
String getMessage(
56
BuildContext context,
67
MessageHandler messageHandler, {

lib/app/shared/message_handler/response_message.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,3 +775,7 @@ class ResponseMessage with MessageHandler {
775775
return '';
776776
}
777777
}
778+
779+
class ErrorMessage extends ResponseMessage {
780+
ErrorMessage({required super.message, super.data});
781+
}

lib/app/view/app.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import 'package:altme/activity_log/activity_log.dart';
99
import 'package:altme/app/app.dart';
10+
import 'package:altme/app/shared/alert_message/message_cubit.dart';
1011
import 'package:altme/chat_room/chat_room.dart';
1112
import 'package:altme/connection_bridge/connection_bridge.dart';
1213
import 'package:altme/credentials/credentials.dart';
@@ -292,6 +293,7 @@ class App extends StatelessWidget {
292293
),
293294
),
294295
BlocProvider(create: (context) => HomeTabbarCubit()),
296+
BlocProvider(create: (context) => MessageCubit()),
295297
],
296298
child: const MaterialAppDefinition(),
297299
),

lib/credentials/cubit/credentials_cubit.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,10 @@ class CredentialsCubit extends Cubit<CredentialsState> {
10451045
await addCryptoProofsPerProfile(cryptoAccountData: cryptoAccountData);
10461046
}
10471047
}
1048+
1049+
void emitError(MessageHandler error) {
1050+
emit(state.error(messageHandler: error));
1051+
}
10481052
}
10491053

10501054
List<DiscoverDummyCredential> getDummiesFromExternalIssuerList(

lib/oidc4vp_transaction/widget/attestation_list.dart

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import 'package:altme/app/shared/issuer/models/issuer.dart';
2-
import 'package:altme/app/shared/loading/loading_view.dart';
3-
import 'package:altme/app/shared/message_handler/response_message.dart';
1+
import 'package:altme/app/app.dart';
2+
import 'package:altme/app/shared/alert_message/exception_message.dart';
3+
import 'package:altme/app/shared/alert_message/message_cubit.dart';
44
import 'package:altme/credentials/cubit/credentials_cubit.dart';
55
import 'package:altme/dashboard/dashboard.dart';
66
import 'package:altme/dashboard/home/tab_bar/credentials/models/blockchain/blockchain_credential_subject_model/blockchain_credential_subject_model.dart';
@@ -26,7 +26,10 @@ class AttestationList extends StatelessWidget {
2626
if (snapshot.connectionState == ConnectionState.waiting) {
2727
return const Center(child: CircularProgressIndicator());
2828
} else if (snapshot.hasError) {
29-
return Center(child: Text('Error: ${snapshot.error}'));
29+
LoadingView().hide();
30+
final error = snapshot.error! as ExceptionMessage;
31+
context.read<MessageCubit>().error(error);
32+
return Center(child: Text(error.error));
3033
} else {
3134
return ListView.builder(
3235
shrinkWrap: true,
@@ -82,6 +85,12 @@ class AttestationList extends StatelessWidget {
8285
[],
8386
profileType: profileModel.profileType,
8487
);
88+
if (credentialManifestPickCubit.state.filteredCredentialList.isEmpty) {
89+
throw ExceptionMessage(
90+
error: 'Credential not found',
91+
errorDescription: 'No suitable credential found in the wallet.',
92+
);
93+
}
8594

8695
/// for sd-jwt we only support single credentials right now
8796
/// skip is not considered for sd-jwt right now
@@ -108,8 +117,13 @@ class AttestationList extends StatelessWidget {
108117
}
109118
return false;
110119
},
111-
orElse: () =>
112-
credentialManifestPickCubit.state.filteredCredentialList[0],
120+
orElse: () {
121+
throw ExceptionMessage(
122+
error: 'No valid crypto account found',
123+
errorDescription:
124+
'No suitable crypto account found in the wallet.',
125+
);
126+
},
113127
);
114128
} else {
115129
firstOne = credentialManifestPickCubit.state.filteredCredentialList[0];
@@ -175,11 +189,9 @@ class AttestationList extends StatelessWidget {
175189

176190
credentialsToBePresented.addAll(credToBePresented);
177191
} else {
178-
throw ResponseMessage(
179-
data: {
180-
'error': 'invalid_request',
181-
'error_description': 'Issue with the disclosure encryption of jwt.',
182-
},
192+
throw ExceptionMessage(
193+
error: 'invalid_request',
194+
errorDescription: 'Issue with the disclosure encryption of jwt.',
183195
);
184196
}
185197

lib/splash/bloclisteners/blocklisteners.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'dart:async';
22
import 'dart:convert';
33

44
import 'package:altme/app/app.dart';
5+
import 'package:altme/app/shared/alert_message/exception_message.dart';
6+
import 'package:altme/app/shared/alert_message/message_cubit.dart';
57
import 'package:altme/connection_bridge/connection_bridge.dart';
68
import 'package:altme/credentials/cubit/credentials_cubit.dart';
79
import 'package:altme/dashboard/dashboard.dart';
@@ -49,6 +51,12 @@ final splashBlocListener = BlocListener<SplashCubit, SplashState>(
4951
},
5052
);
5153

54+
final messageCubitListener = BlocListener<MessageCubit, ExceptionMessage>(
55+
listener: (BuildContext context, exceptionMessage) {
56+
AlertMessage.displayMessage(context: context, exception: exceptionMessage);
57+
},
58+
);
59+
5260
final ProfileCubitListener = BlocListener<ProfileCubit, ProfileState>(
5361
listener: (BuildContext context, ProfileState state) {
5462
if (state.status == AppStatus.addEuropeanProfile) {

0 commit comments

Comments
 (0)