import 'package:common/services/msal_service.dart';
import 'package:concierge/data/remote/api/payment_interceptor.dart';
import 'package:concierge/presentation/app/cart_cubit.dart';
import 'package:concierge/presentation/app/concierge_cubit.dart';
import 'package:concierge/presentation/screens/confirm_order/confirm_order_route.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart';
import 'package:concierge/presentation/screens/payment/payment_route.dart';
import 'package:concierge/presentation/screens/product_details/product_details_route.dart';
import 'package:concierge/presentation/screens/provide_location/provide_location_route.dart';
import 'package:concierge/presentation/screens/receipt/receipt_route.dart';
import 'package:concierge/presentation/screens/review_order/review_order_route.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:payment_plugin/payment_plugin.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import 'data/remote/api/concierge_interceptor.dart';
import 'data/remote/api/concierge_service.dart';
import 'domain/repositories/property_repository.dart';
import 'flavors.dart';
final conciergeNavigatorKey = GlobalKey<NavigatorState>();
final conciergeShellRoute = StatefulShellRoute.indexedStack(
branches: [
StatefulShellBranch(
navigatorKey: conciergeNavigatorKey,
routes: [
$hotelOverviewPageRoute,
$productDetailsRoute,
$reviewOrderRoute,
$confirmOrderRoute,
$paymentRoute,
$provideLocationRoute,
$receiptRoute,
],
),
],
builder: (context, state, child) {
Future<(ConciergeService, Dio)> getDependencies() async {
try {
F.appFlavor = Flavor.values.firstWhere((flavor) => flavor.name == appFlavor?.toLowerCase());
final msal = MSALService();
await msal.init();
final dio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
dio.interceptors.addAll([
ConciergeInterceptor(msal),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
final apimDio = Dio(BaseOptions(baseUrl: F.baseApimUrl));
apimDio.interceptors.addAll([
PaymentInterceptor(msal),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
return (ConciergeService(dio), apimDio);
} catch (e, st) {
if (kDebugMode) print("qqq concierge init error=$e, $st");
rethrow;
}
}
return FutureBuilder(
future: getDependencies(),
builder: (context, asyncSnapshot) {
final (service, apimDio) = asyncSnapshot.requireData;
return MultiRepositoryProvider(
providers: [
RepositoryProvider(create: (context) => PropertyRepository(service)),
RepositoryProvider(create: (context) => AdyenRepository(dio: apimDio)),
RepositoryProvider(create: (context) => PaymentPlugin.instance),
],
child: MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => ConciergeCubit(
context.read(),
launchParameters: state.uri.queryParameters,
),
),
BlocProvider(create: (context) => CartCubit(context.read())),
],
child: child,
),
);
},
);
},
);