6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit d4b53267
Changed files
comwell_key_app/lib/comwell_app.dart | 1 - .../components/booking_details_bottom_sheet.dart | 2 +- .../components/concierge_button.dart | 12 ++++++--- .../hotel_overview_page_route.g.dart | 2 ++ concierge/lib/concierge_app.dart | 4 +-- concierge/lib/concierge_route.dart | 30 ++++++++++------------ .../secure_storage/concierge_secure_storage.dart | 13 +++++----- concierge/lib/flavors.dart | 7 ++++- .../lib/presentation/app/concierge_cubit.dart | 27 ++++++++++++++++++- .../hotel_overview_page_route.dart | 2 ++ 10 files changed, 68 insertions(+), 32 deletions(-)
Diff
diff --git a/comwell_key_app/lib/comwell_app.dart b/comwell_key_app/lib/comwell_app.dart
index 33a2e8b8..3716950b 100644
--- a/comwell_key_app/lib/comwell_app.dart
+++ b/comwell_key_app/lib/comwell_app.dart
@@ -82,7 +82,6 @@ class ComwellApp extends StatelessWidget {
title: 'Comwell Key App',
routerConfig: router,
supportedLocales: AppLocalizations.supportedLocales,
-
localizationsDelegates: localizationDelegates,
builder: (context, child) {
if (child != null) {
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/components/booking_details_bottom_sheet.dart b/comwell_key_app/lib/presentation/screens/booking_details/components/booking_details_bottom_sheet.dart
index 9830155a..018d2b70 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/components/booking_details_bottom_sheet.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/components/booking_details_bottom_sheet.dart
@@ -137,7 +137,7 @@ class BookingDetailsBottomSheet extends StatelessWidget {
Widget _buildUpSalesCatalogButton(ReservationStatus reservationStatus, BuildContext context) {
switch (reservationStatus) {
case ReservationStatus.checkedin:
- return ConciergeButton(hotelCode: cubit.booking.hotelCode);
+ return ConciergeButton(booking: cubit.booking);
case ReservationStatus.newreservation:
return _buildServices(context);
case ReservationStatus.preregistered:
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart b/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
index a5073a15..f77f0e62 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
@@ -1,4 +1,6 @@
import 'package:comwell_key_app/data/remote/msal_service.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/presentation/app/bloc/profile_cubit.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/env_utils.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
@@ -6,12 +8,13 @@ import 'package:comwell_key_app/utils/locator.dart';
import 'package:concierge/flavors.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
class ConciergeButton extends StatelessWidget {
- final String hotelCode;
+ final Booking booking;
- const ConciergeButton({super.key, required this.hotelCode});
+ const ConciergeButton({super.key, required this.booking});
@override
Widget build(BuildContext context) {
@@ -23,10 +26,11 @@ class ConciergeButton extends StatelessWidget {
final token = await msalService.acquireTokenSilent();
if (context.mounted) {
HotelOverviewPageRoute(
- hotelCode: hotelCode,
+ hotelCode: booking.hotelCode,
authToken: token,
flavor: F.appFlavor.name,
- subKey: dotenv.OCP_APIM_SUBSCRIPTION_KEY
+ roomNumber: booking.roomNumber,
+ subKey: dotenv.OCP_APIM_SUBSCRIPTION_KEY,
).push(context);
}
},
diff --git a/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart b/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
index 6f8f2418..4131ccad 100644
--- a/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
+++ b/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
@@ -20,6 +20,7 @@ mixin $HotelOverviewPageRoute on GoRouteData {
authToken: state.uri.queryParameters['auth-token']!,
flavor: state.uri.queryParameters['flavor']!,
subKey: state.uri.queryParameters['sub-key']!,
+ roomNumber: state.uri.queryParameters['room-number']!,
);
HotelOverviewPageRoute get _self => this as HotelOverviewPageRoute;
@@ -32,6 +33,7 @@ mixin $HotelOverviewPageRoute on GoRouteData {
'auth-token': _self.authToken,
'flavor': _self.flavor,
'sub-key': _self.subKey,
+ 'room-number': _self.roomNumber,
},
);
diff --git a/concierge/lib/concierge_app.dart b/concierge/lib/concierge_app.dart
index 3c75e96e..99d9762c 100644
--- a/concierge/lib/concierge_app.dart
+++ b/concierge/lib/concierge_app.dart
@@ -30,8 +30,8 @@ class ConciergeApp extends StatelessWidget {
F.appFlavor = Flavor.values.firstWhere((flavor) {
return flavor.name == this.flavor.toLowerCase();
});
- final storage = ConciergeSecureStorage(FlutterSecureStorage());
- final conciergeDio = Dio(BaseOptions(baseUrl: F.baseUrl));
+ final storage = ConciergeSecureStorage();
+ final conciergeDio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
conciergeDio.interceptors.addAll([
ConciergeInterceptor(storage),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
diff --git a/concierge/lib/concierge_route.dart b/concierge/lib/concierge_route.dart
index d5a683fc..b99f2d10 100644
--- a/concierge/lib/concierge_route.dart
+++ b/concierge/lib/concierge_route.dart
@@ -21,6 +21,8 @@ import 'data/remote/api/concierge_interceptor.dart';
import 'data/remote/api/concierge_service.dart';
import 'domain/repositories/property_repository.dart';
import 'flavors.dart';
+final _rootNavigatorKey = GlobalKey<NavigatorState>();
+
final conciergeShellRoute = StatefulShellRoute.indexedStack(
redirect: (context, state) {
@@ -28,6 +30,7 @@ final conciergeShellRoute = StatefulShellRoute.indexedStack(
},
branches: [
StatefulShellBranch(
+ navigatorKey: _rootNavigatorKey,
routes: [
$hotelOverviewPageRoute,
$productDetailsRoute,
@@ -41,26 +44,15 @@ final conciergeShellRoute = StatefulShellRoute.indexedStack(
],
builder: (context, state, child) {
Future<(ConciergeService, ConciergeSecureStorage, Dio)> getDependencies() async {
- final flavorName = state.uri.queryParameters["flavor"] ?? "";
- final authToken = state.uri.queryParameters["auth-token"] ?? "";
- final subscriptionKey = state.uri.queryParameters["sub-key"] ?? "";
- final storage = ConciergeSecureStorage(FlutterSecureStorage());
- if (state.uri.queryParameters.isNotEmpty) {
- if (authToken.isNotEmpty) await storage.setUserToken(authToken);
- if (subscriptionKey.isNotEmpty) await storage.setSubscriptionKey(subscriptionKey);
- if (flavorName.isNotEmpty) {
- F.appFlavor = Flavor.values.firstWhere((flavor) => flavor.name == flavorName);
- }
- }
- final dio = Dio(BaseOptions(baseUrl: F.baseUrl));
+ final storage = ConciergeSecureStorage(
+ );
+ final dio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
dio.interceptors.addAll([
ConciergeInterceptor(storage),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
final apimDio = Dio(
- BaseOptions(
- baseUrl: "https://apim-comwell-net-services-stage.azure-api.net/api",
- ),
+ BaseOptions(baseUrl: F.baseApimUrl),
);
apimDio.interceptors.addAll([
PaymentInterceptor(storage),
@@ -91,7 +83,13 @@ final conciergeShellRoute = StatefulShellRoute.indexedStack(
],
child: MultiBlocProvider(
providers: [
- BlocProvider(create: (context) => ConciergeCubit(context.read())),
+ BlocProvider(
+ create: (context) => ConciergeCubit(
+ context.read(),
+ context.read(),
+ launchParameters: state.uri.queryParameters,
+ ),
+ ),
BlocProvider(create: (context) => CartCubit(context.read())),
],
child: child,
diff --git a/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart b/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
index 893cccf0..a8b4b714 100644
--- a/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
+++ b/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
@@ -4,9 +4,12 @@ class ConciergeSecureStorage {
static const _tokenKey = 'concierge_user_token';
static const _subscriptionKey = 'subscription_key';
- final FlutterSecureStorage _storage;
+ final FlutterSecureStorage _storage = FlutterSecureStorage(
+ iOptions: IOSOptions(groupId: "concierge"),
+ aOptions: AndroidOptions(sharedPreferencesName: "concierge"),
+ );
- const ConciergeSecureStorage(this._storage);
+ ConciergeSecureStorage();
Future<void> setUserToken(String token) async {
await _storage.write(key: _tokenKey, value: token);
@@ -24,9 +27,7 @@ class ConciergeSecureStorage {
return await _storage.read(key: _subscriptionKey) ?? "";
}
- Future<void> clearUserToken() async {
- await _storage.delete(key: _tokenKey);
+ Future<void> dispose() async {
+ await _storage.deleteAll();
}
}
-
-
diff --git a/concierge/lib/flavors.dart b/concierge/lib/flavors.dart
index a03a70d4..8896b424 100644
--- a/concierge/lib/flavors.dart
+++ b/concierge/lib/flavors.dart
@@ -32,8 +32,13 @@ class F {
}
}
- static String get baseUrl => switch (appFlavor) {
+ static String get baseConciergeUrl => switch (appFlavor) {
Flavor.stage => "https://admin-stage.concierge.comwell.com/api/da/",
Flavor.production => "https://admin.concierge.comwell.com/api/da/",
};
+
+ static String get baseApimUrl => switch(appFlavor) {
+ Flavor.stage => "https://apim-comwell-net-services-stage.azure-api.net/api",
+ Flavor.production => "https://apim-comwell-net-services-prod.azure-api.net/api",
+ };
}
diff --git a/concierge/lib/presentation/app/concierge_cubit.dart b/concierge/lib/presentation/app/concierge_cubit.dart
index 56e79d57..a5e00910 100644
--- a/concierge/lib/presentation/app/concierge_cubit.dart
+++ b/concierge/lib/presentation/app/concierge_cubit.dart
@@ -1,3 +1,5 @@
+import 'package:concierge/concierge.dart';
+import 'package:concierge/data/local/secure_storage/concierge_secure_storage.dart';
import 'package:concierge/data/remote/models/product.dart';
import 'package:concierge/domain/models/app_error.dart';
import 'package:concierge/domain/models/data_state.dart';
@@ -9,8 +11,25 @@ part '../../_generated/presentation/app/concierge_cubit.freezed.dart';
class ConciergeCubit extends BaseCubit<ConciergeState> {
final PropertyRepository _propertyRepository;
+ final ConciergeSecureStorage _storage;
+ final Map<String, String> launchParameters;
- ConciergeCubit(this._propertyRepository) : super(const ConciergeState());
+ ConciergeCubit(
+ this._propertyRepository,
+ this._storage, {
+ required this.launchParameters,
+ }) : super(const ConciergeState());
+
+ Future<void> init() async {
+ final flavorName = launchParameters["flavor"] ?? "";
+ final authToken = launchParameters["auth-token"] ?? "";
+ final subscriptionKey = launchParameters["sub-key"] ?? "";
+ if (authToken.isNotEmpty) await _storage.setUserToken(authToken);
+ if (subscriptionKey.isNotEmpty) await _storage.setSubscriptionKey(subscriptionKey);
+ if (flavorName.isNotEmpty) {
+ F.appFlavor = Flavor.values.firstWhere((flavor) => flavor.name == flavorName);
+ }
+ }
DataState getProductState(int pId) {
final pExists = state.products.containsKey(pId);
@@ -42,6 +61,12 @@ class ConciergeCubit extends BaseCubit<ConciergeState> {
copy[pId] = dataState;
safeEmit(state.copyWith(products: copy));
}
+
+ @override
+ Future<void> close() async {
+ await _storage.dispose();
+ return super.close();
+ }
}
@freezed
diff --git a/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart b/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
index d4a8148d..6ebba7bb 100644
--- a/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
+++ b/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
@@ -14,12 +14,14 @@ class HotelOverviewPageRoute extends GoRouteData with $HotelOverviewPageRoute {
final String authToken;
final String flavor;
final String subKey;
+ final String roomNumber;
HotelOverviewPageRoute({
required this.hotelCode,
required this.authToken,
required this.flavor,
required this.subKey,
+ required this.roomNumber,
});
@override