import 'package:common/services/msal_service.dart';
import 'package:common/utils/env_utils.dart';
import 'package:concierge/data/remote/api/concierge_interceptor.dart';
import 'package:concierge/data/remote/api/concierge_service.dart';
import 'package:concierge/domain/repositories/property_repository.dart';
import 'package:concierge/presentation/navigation/router.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/bloc/hotel_overview_page_cubit.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:payment_plugin/payment_plugin.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import 'flavors.dart';
class ConciergeApp extends StatelessWidget {
const ConciergeApp({
super.key,
required this.authToken,
required this.flavor,
required this.hotelCode,
});
final String hotelCode;
final String authToken;
final String flavor;
Future<ConciergeService> _getDependencies() async {
F.appFlavor = Flavor.values.firstWhere((flavor) {
return flavor.name == this.flavor.toLowerCase();
});
final msal = MSALService();
await msal.init();
final conciergeDio = Dio(BaseOptions(baseUrl: F.baseConciergeUrl));
conciergeDio.interceptors.addAll([
ConciergeInterceptor(msal),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
final apimDio = Dio(
BaseOptions(baseUrl: dotenv.SERVICE_URL),
);
apimDio.interceptors.addAll([
ConciergeInterceptor(msal),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
return (ConciergeService(conciergeDio));
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getDependencies(),
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if (asyncSnapshot.hasError) {
return Center(child: Text(asyncSnapshot.error.toString()));
}
final (service) = asyncSnapshot.data!;
return MultiRepositoryProvider(
providers: [
RepositoryProvider(create: (context) => PropertyRepository(service)),
RepositoryProvider(create: (context) => PaymentPlugin.instance),
],
child: MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => HotelOverviewPageCubit(
context.read(),
context.read(),
hotelCode: hotelCode,
),
),
],
child: Builder(
builder: (context) {
return MaterialApp.router(
routerConfig: router,
);
},
),
),
);
},
);
}
}