6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit d21727e7

AuthorMikkel Thygesen<mth@dwarf.dk>
Date2025-08-19 17:01:14 +0200
2094: Auth webview

Changed files

comwell_key_app/lib/b2c_auth/b2c_auth_page.dart    |  20 ++++
 .../lib/b2c_auth/bloc/b2c_auth_cubit.dart          |  77 +++++++++++++
 .../lib/login/components/azure_b2c_widget.dart     |  58 ----------
 .../lib/login/components/login_button.dart         |   6 +-
 comwell_key_app/lib/login/cubit/login_cubit.dart   |  20 +---
 comwell_key_app/lib/login/cubit/login_state.dart   |  16 +--
 comwell_key_app/lib/login/login_page.dart          | 124 ++++++++-------------
 .../profile_settings/profile_settings_page.dart    |  37 +-----
 comwell_key_app/lib/routing/app_router.dart        |  45 +++++++-
 comwell_key_app/lib/routing/app_routes.dart        |   3 +
 comwell_key_app/pubspec.yaml                       |   2 +-
 11 files changed, 201 insertions(+), 207 deletions(-)

Diff

diff --git a/comwell_key_app/lib/b2c_auth/b2c_auth_page.dart b/comwell_key_app/lib/b2c_auth/b2c_auth_page.dart
new file mode 100644
index 00000000..d7eb5076
--- /dev/null
+++ b/comwell_key_app/lib/b2c_auth/b2c_auth_page.dart
@@ -0,0 +1,20 @@
+import 'package:aad_b2c_webview/aad_b2c_webview.dart';
+import 'package:comwell_key_app/b2c_auth/bloc/b2c_auth_cubit.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class B2cAuthPage extends StatelessWidget {
+ const B2cAuthPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder<B2CAuthCubit, B2CAuthState>(builder: (context, state) {
+ final cubit = context.read<B2CAuthCubit>();
+ return SafeArea(
+ child: Scaffold(
+ body: AADB2CBase.webview(
+ params: cubit.getB2CParams(), settings: cubit.getWebSettings()),
+ ));
+ });
+ }
+}
diff --git a/comwell_key_app/lib/b2c_auth/bloc/b2c_auth_cubit.dart b/comwell_key_app/lib/b2c_auth/bloc/b2c_auth_cubit.dart
new file mode 100644
index 00000000..4cd7ff5b
--- /dev/null
+++ b/comwell_key_app/lib/b2c_auth/bloc/b2c_auth_cubit.dart
@@ -0,0 +1,77 @@
+import 'package:aad_b2c_webview/aad_b2c_webview.dart';
+import 'package:bloc/bloc.dart';
+import 'package:comwell_key_app/authentication/authentication_repository.dart';
+import 'package:comwell_key_app/login/auth.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
+import 'package:comwell_key_app/utils/secure_storage.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart';
+import 'package:go_router/go_router.dart';
+import 'package:jwt_decoder/jwt_decoder.dart';
+import 'package:comwell_key_app/common/const.dart' as constants;
+
+class B2CAuthCubit extends Cubit<B2CAuthState> {
+ B2CAuthCubit({
+ required this.authType,
+ required this.tracking,
+ required this.authenticationRepository,
+ }) : super(B2CAuthState());
+
+ final Auth authType;
+ final ComwellTracking tracking;
+ final SecureStorage secureStorage = SecureStorage();
+ final AuthenticationRepository authenticationRepository;
+
+ void onIdToken(String token) async {
+ debugPrint(JwtDecoder.decode(token).toString());
+ tracking.trackLogin();
+ secureStorage.write(constants.accessToken, token);
+ }
+
+ void _onRefreshToken(String token) {
+ debugPrint('refresh_token: $token');
+ secureStorage.write(constants.refreshToken, token);
+ authenticationRepository.logIn();
+ }
+
+ void _onB2CSuccess(BuildContext context, _, TokenEntity? idToken,
+ TokenEntity? refreshToken) {
+ final idTokenValue = idToken?.value;
+ final refreshTokenValue = refreshToken?.value;
+ if (idTokenValue != null) onIdToken(idTokenValue);
+ if (refreshTokenValue != null) _onRefreshToken(refreshTokenValue);
+ if (context.mounted) context.pop();
+ }
+
+ void _onB2CError(BuildContext context, String? error) {
+ authenticationRepository.logOut(forced: true);
+ print("qqq error=$error");
+ if (context.mounted) context.pop();
+ }
+
+ B2CWebViewParams getB2CParams() {
+ return B2CWebViewParams(
+ tenantBaseUrl: dotenv.env['AAD_B2C_USER_AUTH_FLOW']!,
+ clientId: dotenv.env['AAD_B2C_CLIENT_ID']!,
+ redirectUrl: dotenv.env['AAD_B2C_REDIRECT_URL']!,
+ scopes: dotenv.env['AAD_B2C_SCOPES']!.split(','),
+ userFlowName: switch (authType) {
+ Auth.login => dotenv.env['AAD_B2C_USER_FLOW_NAME_LOGIN']!,
+ Auth.createUser => dotenv.env['AAD_B2C_USER_FLOW_NAME_CREATE_USER']!,
+ Auth.changePassword =>
+ dotenv.env['AAD_B2C_USER_FLOW_NAME_CHANGE_PASSWORD']!,
+ },
+ isLoginFlow: true,
+ containsChallenge: true,
+ );
+ }
+
+ WebViewSettingsEntity getWebSettings() {
+ return WebViewSettingsEntity(
+ onError: _onB2CError,
+ onSuccess: _onB2CSuccess,
+ controllerBuilder: (context, controller) {});
+ }
+}
+
+class B2CAuthState {}
diff --git a/comwell_key_app/lib/login/components/azure_b2c_widget.dart b/comwell_key_app/lib/login/components/azure_b2c_widget.dart
deleted file mode 100644
index 31ad853c..00000000
--- a/comwell_key_app/lib/login/components/azure_b2c_widget.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-import 'package:aad_b2c_webview/aad_b2c_webview.dart';
-import 'package:comwell_key_app/authentication/authentication_repository.dart';
-import 'package:comwell_key_app/login/auth.dart';
-import 'package:comwell_key_app/tracking/comwell_tracking.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-import 'package:comwell_key_app/utils/secure_storage.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_dotenv/flutter_dotenv.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:jwt_decoder/jwt_decoder.dart';
-import 'package:comwell_key_app/common/const.dart' as constants;
-
-class AzureB2CWidget extends StatelessWidget {
- final Auth authEnum;
- final SecureStorage secureStorage = SecureStorage();
- // final LoginCubit loginCubit = LoginCubit(authenticationRepository: AuthenticationRepository());
- final AuthenticationRepository authenticationRepository;
- final _tracking = locator<ComwellTracking>();
- AzureB2CWidget({
- required this.authEnum,
- required this.authenticationRepository,
- super.key,
- });
-
- @override
- Widget build(BuildContext context) {
- return ADB2CEmbedWebView(
- tenantBaseUrl: dotenv.env['AAD_B2C_USER_AUTH_FLOW']!,
- userFlowName: switch (authEnum) {
- Auth.login => dotenv.env['AAD_B2C_USER_FLOW_NAME_LOGIN']!,
- Auth.createUser => dotenv.env['AAD_B2C_USER_FLOW_NAME_CREATE_USER']!,
- Auth.changePassword => dotenv.env['AAD_B2C_USER_FLOW_NAME_CHANGE_PASSWORD']!,
- },
- clientId: dotenv.env['AAD_B2C_CLIENT_ID']!,
- redirectUrl: dotenv.env['AAD_B2C_REDIRECT_URL']!,
- scopes: dotenv.env['AAD_B2C_SCOPES']!.split(','),
- onAnyTokenRetrieved: (Token anyToken) {
-
- },
- onIDToken: (Token token) {
- _tracking.trackLogin();
- secureStorage.write(constants.accessToken, token.value);
- debugPrint(JwtDecoder.decode(token.value).toString());
- },
- onAccessToken: (Token token) {
-
- },
- onRefreshToken: (Token token) {
- secureStorage.write(constants.refreshToken, token.value);
- debugPrint('refresh_token: ${token.value}');
- authenticationRepository.logIn();
- },
- onErrorOrCancel: (context) => authenticationRepository.logOut(forced: true),
- optionalParameters: const [],
- webViewBackgroundColor: sandColor[40]!,
- );
- }
-}
diff --git a/comwell_key_app/lib/login/components/login_button.dart b/comwell_key_app/lib/login/components/login_button.dart
index f12d658b..fb2df3b1 100644
--- a/comwell_key_app/lib/login/components/login_button.dart
+++ b/comwell_key_app/lib/login/components/login_button.dart
@@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class LoginButton extends StatelessWidget {
- final Function onPressed;
+ final VoidCallback onPressed;
const LoginButton({
required this.onPressed,
@@ -14,9 +14,7 @@ class LoginButton extends StatelessWidget {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 30),
child: ElevatedButton(
- onPressed: () {
- onPressed();
- },
+ onPressed: onPressed,
style: ElevatedButton.styleFrom(
minimumSize: const Size(358, 52),
backgroundColor: Theme.of(context).colorScheme.surface,
diff --git a/comwell_key_app/lib/login/cubit/login_cubit.dart b/comwell_key_app/lib/login/cubit/login_cubit.dart
index feeffcdc..3321748e 100644
--- a/comwell_key_app/lib/login/cubit/login_cubit.dart
+++ b/comwell_key_app/lib/login/cubit/login_cubit.dart
@@ -1,25 +1,11 @@
import 'package:bloc/bloc.dart';
-import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:equatable/equatable.dart';
+
part 'login_state.dart';
class LoginCubit extends Cubit<LoginState> {
- final AuthenticationRepository authenticationRepository;
- LoginCubit({required this.authenticationRepository}) : super(LoginInitial());
-
- void login() {
+ LoginCubit({required this.forced}) : super(LoginState());
- try {
- // Call the login method from the authenticationRepository
- authenticationRepository.logIn();
- emit(LoginSuccessful());
- } catch (e) {
- emit(LoginError(e.toString()));
- }
- }
- void loginErrorFromAzureB2C() {
- emit(const LoginError('Error from az'));
- authenticationRepository.logOut();
- }
+ final bool forced;
}
diff --git a/comwell_key_app/lib/login/cubit/login_state.dart b/comwell_key_app/lib/login/cubit/login_state.dart
index 4be19474..7b3fec17 100644
--- a/comwell_key_app/lib/login/cubit/login_state.dart
+++ b/comwell_key_app/lib/login/cubit/login_state.dart
@@ -1,19 +1,7 @@
part of 'login_cubit.dart';
-sealed class LoginState extends Equatable {
- const LoginState();
+class LoginState extends Equatable {
@override
List<Object> get props => [];
-}
-
-final class LoginInitial extends LoginState {}
-final class LoginSuccessful extends LoginState {}
-final class LoginError extends LoginState {
- final String error;
-
- const LoginError(this.error);
-
- @override
- List<Object> get props => [error];
-}
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/login/login_page.dart b/comwell_key_app/lib/login/login_page.dart
index 8230aad1..2050ef8f 100644
--- a/comwell_key_app/lib/login/login_page.dart
+++ b/comwell_key_app/lib/login/login_page.dart
@@ -1,91 +1,61 @@
-import 'package:comwell_key_app/authentication/authentication_repository.dart';
-import 'package:comwell_key_app/login/auth.dart';
import 'package:comwell_key_app/login/components/create_user_button.dart';
import 'package:comwell_key_app/login/components/forced_logout_banner.dart';
import 'package:comwell_key_app/login/components/login_button.dart';
-import 'package:comwell_key_app/login/components/azure_b2c_widget.dart';
-import 'package:comwell_key_app/tracking/comwell_tracking.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-import 'package:flutter/gestures.dart';
+import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:flutter/material.dart';
-import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:go_router/go_router.dart';
-class LoginPage extends StatelessWidget {
- final bool forced;
+import 'cubit/login_cubit.dart';
- const LoginPage({super.key, required this.forced});
+class LoginPage extends StatelessWidget {
+ const LoginPage({super.key});
@override
Widget build(BuildContext context) {
- final tracking = locator<ComwellTracking>();
-
- return Scaffold(
- body: Container(
- constraints: const BoxConstraints.expand(),
- decoration: const BoxDecoration(
- image: DecorationImage(
- image: AssetImage('assets/images/login_screen_background.png'),
- fit: BoxFit.cover,
+ return BlocBuilder<LoginCubit, LoginState>(builder: (context, state) {
+ final cubit = context.read<LoginCubit>();
+ return Scaffold(
+ body: Container(
+ constraints: const BoxConstraints.expand(),
+ decoration: const BoxDecoration(
+ image: DecorationImage(
+ image: AssetImage('assets/images/login_screen_background.png'),
+ fit: BoxFit.cover,
+ ),
),
- ),
- child: SafeArea(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- if (forced) const ForcedLogoutBanner(),
- // Logo
- Expanded(
- flex: 3,
- child: Image.asset('assets/images/Logo.png',
- width: 175, height: 50),
- ),
- const SizedBox(height: 32),
- // Login Button
- LoginButton(onPressed: () {
- tracking.trackScreenView('Login - Form', '/login/form');
- openModal(context, Auth.login);
- }),
-
- const SizedBox(height: 10),
- // Create New User Button
- CreateUserButton(onPressed: () {
- tracking.trackScreenView(
- 'Create User - Form', '/create-user/form');
- openModal(context, Auth.createUser);
- }),
- const SizedBox(height: 20),
- ],
+ child: SafeArea(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (cubit.forced) const ForcedLogoutBanner(),
+ // Logo
+ Expanded(
+ flex: 3,
+ child: Image.asset(
+ 'assets/images/Logo.png',
+ width: 175,
+ height: 50,
+ ),
+ ),
+ const SizedBox(height: 32),
+ // Login Button
+ LoginButton(
+ onPressed: () {
+ context.push("/${AppRoutes.b2cLogin.name}");
+ },
+ ),
+ const SizedBox(height: 10),
+ // Create New User Button
+ CreateUserButton(onPressed: () {
+ context.push("/${AppRoutes.b2cSignUp.name}");
+ }),
+ const SizedBox(height: 20),
+ ],
+ ),
),
),
- ),
- );
- }
-
- Future<dynamic> openModal(BuildContext context, Auth authEnum) {
- return showCupertinoModalBottomSheet(
- enableDrag: false,
- backgroundColor: Colors.orange,
- topRadius: const Radius.circular(30),
- elevation: 5,
- useRootNavigator: true,
- context: context,
- builder: (BuildContext context) {
- return SizedBox(
- height: 700,
- child: SingleChildScrollView(
- dragStartBehavior: DragStartBehavior.start,
- scrollDirection: Axis.vertical,
- child: SizedBox(
- height: 700,
- width: 400,
- child: AzureB2CWidget(
- authEnum: authEnum,
- authenticationRepository:
- locator<AuthenticationRepository>()),
- ),
- ),
- );
- });
+ );
+ });
}
}
-
diff --git a/comwell_key_app/lib/profile_settings/profile_settings_page.dart b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
index 7afe97e6..357ff107 100644
--- a/comwell_key_app/lib/profile_settings/profile_settings_page.dart
+++ b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
@@ -1,7 +1,4 @@
-import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
-import 'package:comwell_key_app/login/auth.dart';
-import 'package:comwell_key_app/login/components/azure_b2c_widget.dart';
import 'package:comwell_key_app/profile_settings/components/address_bottom_sheet.dart';
import 'package:comwell_key_app/profile_settings/components/comwell_text_field.dart';
import 'package:comwell_key_app/profile_settings/components/date_time_picker.dart';
@@ -10,15 +7,14 @@ import 'package:comwell_key_app/profile_settings/components/intl_phone_field.dar
import 'package:comwell_key_app/profile_settings/components/text_field_with_trailing_icon.dart';
import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
+import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/address_utils.dart';
-import 'package:comwell_key_app/utils/locator.dart';
import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
-import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
+import 'package:go_router/go_router.dart';
import '../common/components/shimmer_loader/profile_settings_shimmer_loader.dart';
class ProfileSettingsPage extends StatelessWidget {
@@ -145,7 +141,7 @@ class ProfileSettingsPage extends StatelessWidget {
text: "profile_settings_edit_password".tr(),
trailingIcon: "assets/icons/arrow-left.svg",
onTap: () {
- openChangePasswordModal(context, Auth.changePassword);
+ context.push("/${AppRoutes.b2cForgotPassword.name}");
},
showTitle: false),
const SizedBox(height: 20),
@@ -206,33 +202,6 @@ class ProfileSettingsPage extends StatelessWidget {
);
}
- Future<dynamic> openChangePasswordModal(BuildContext context, Auth authEnum) {
- return showCupertinoModalBottomSheet(
- enableDrag: false,
- backgroundColor: Colors.orange,
- topRadius: const Radius.circular(30),
- elevation: 5,
- useRootNavigator: true,
- context: context,
- builder: (BuildContext context) {
- return SizedBox(
- height: 700,
- child: SingleChildScrollView(
- dragStartBehavior: DragStartBehavior.start,
- scrollDirection: Axis.vertical,
- child: SizedBox(
- height: 700,
- width: 400,
- child: AzureB2CWidget(
- authEnum: authEnum,
- authenticationRepository:
- locator<AuthenticationRepository>()),
- ),
- ),
- );
- });
- }
-
Future<void> showDeleteProfileDialog(BuildContext context) {
return showDialog<void>(
context: context,
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index be43a001..d3496bf7 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -1,5 +1,7 @@
import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/authentication/enum/authentication_status.dart';
+import 'package:comwell_key_app/b2c_auth/b2c_auth_page.dart';
+import 'package:comwell_key_app/b2c_auth/bloc/b2c_auth_cubit.dart';
import 'package:comwell_key_app/check_in/bloc/check_in_cubit.dart';
import 'package:comwell_key_app/check_in/check_in_page.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_cubit.dart';
@@ -24,6 +26,8 @@ import 'package:comwell_key_app/hotel_information/cubit/hotel_information_cubit.
import 'package:comwell_key_app/hotel_information/hotel_information_page.dart';
import 'package:comwell_key_app/housekeeping/housekeeping_page.dart';
import 'package:comwell_key_app/key/key_page.dart';
+import 'package:comwell_key_app/login/auth.dart';
+import 'package:comwell_key_app/login/cubit/login_cubit.dart';
import 'package:comwell_key_app/login/login_page.dart';
import 'package:comwell_key_app/my_booking/cubit/my_booking_cubit.dart';
import 'package:comwell_key_app/my_booking/my_booking_page.dart';
@@ -52,6 +56,7 @@ import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/routing/go_router_observer.dart';
import 'package:comwell_key_app/share/cubit/share_booking_cubit.dart';
import 'package:comwell_key_app/share/share_booking_page.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
@@ -317,7 +322,9 @@ GoRouter goRouter() {
builder: (context, state) {
final queryForced = state.uri.queryParameters['forced'] ?? 'false';
final forced = bool.parse(queryForced);
- return LoginPage(forced: forced);
+ return BlocProvider(
+ create: (context) => LoginCubit(forced: forced),
+ child: const LoginPage());
},
),
GoRoute(
@@ -325,6 +332,40 @@ GoRouter goRouter() {
name: AppRoutes.redeem.name,
builder: (context, state) => const RedeemPage(),
),
+ GoRoute(
+ path: "/${AppRoutes.b2cLogin.name}",
+ builder: (context, state) {
+ return BlocProvider(
+ create: (context) => B2CAuthCubit(
+ authType: Auth.login,
+ tracking: locator.get(),
+ authenticationRepository: locator.get(),
+ ),
+ child: const B2cAuthPage());
+ }),
+ GoRoute(
+ path: "/${AppRoutes.b2cSignUp.name}",
+ builder: (context, state) {
+ return BlocProvider(
+ create: (context) => B2CAuthCubit(
+ authType: Auth.createUser,
+ tracking: locator.get(),
+ authenticationRepository: locator.get(),
+ ),
+ child: const B2cAuthPage(),
+ );
+ }),
+ GoRoute(
+ path: "/${AppRoutes.b2cForgotPassword.name}",
+ builder: (context, state) {
+ return BlocProvider(
+ create: (context) => B2CAuthCubit(
+ authType: Auth.changePassword,
+ tracking: locator.get(),
+ authenticationRepository: locator.get(),
+ ),
+ child: const B2cAuthPage());
+ }),
GoRoute(
path: "/${AppRoutes.preregistration.name}",
name: AppRoutes.preregistration.name,
@@ -480,7 +521,7 @@ GoRouter goRouter() {
builder: (context, state) {
final cubit = context.read<UpSalesCubit>();
cubit.addUpSalesToBooking();
-
+
return BlocBuilder<UpSalesCubit, UpSalesState>(
builder: (context, state) {
return UpSalesProcessingPage(key: ValueKey(state));
diff --git a/comwell_key_app/lib/routing/app_routes.dart b/comwell_key_app/lib/routing/app_routes.dart
index bd6c8b5b..1b0ab301 100644
--- a/comwell_key_app/lib/routing/app_routes.dart
+++ b/comwell_key_app/lib/routing/app_routes.dart
@@ -37,4 +37,7 @@ enum AppRoutes {
shareRoom,
forceUpdate,
upSalesError,
+ b2cLogin,
+ b2cSignUp,
+ b2cForgotPassword,
}
diff --git a/comwell_key_app/pubspec.yaml b/comwell_key_app/pubspec.yaml
index 874ebb9b..d32bf304 100644
--- a/comwell_key_app/pubspec.yaml
+++ b/comwell_key_app/pubspec.yaml
@@ -32,7 +32,7 @@ dependencies:
device_info_plus: ^10.1.2
sheet: ^1.0.0
wolt_modal_sheet: ^0.9.2
- aad_b2c_webview: ^0.0.57
+ aad_b2c_webview: ^0.1.3
modal_bottom_sheet: ^3.0.0
mocktail: ^1.0.4
flutter_svg: ^2.0.10+1