Files
frontend_eccp_mobile/lib/bootstrap.dart
2026-04-29 12:53:22 +07:00

147 lines
5.1 KiB
Dart

import 'dart:async';
import 'dart:developer';
import 'package:bloc/bloc.dart';
import 'package:chucker_flutter/chucker_flutter.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/widgets.dart';
import 'package:frontend_eccp_mobile/app/core/config/app_flavor.dart';
import 'package:frontend_eccp_mobile/app/core/di/injection.dart';
import 'package:frontend_eccp_mobile/app/core/navigation/app_resume_once.dart';
import 'package:frontend_eccp_mobile/app/core/navigation/settings_navigator.dart';
import 'package:frontend_eccp_mobile/app/core/notification/fcm_service.dart';
import 'package:frontend_eccp_mobile/app/core/services/bottom_sheet_service.dart';
import 'package:frontend_eccp_mobile/app/core/services/crashlytics_service.dart';
import 'package:frontend_eccp_mobile/app/core/services/location_permission_service.dart';
import 'package:frontend_eccp_mobile/app/core/utils/session_manager.dart';
import 'package:frontend_eccp_mobile/app/core/widgets/bottomsheet/app_bottom_sheet.dart';
import 'package:frontend_eccp_mobile/app/core/widgets/bottomsheet/appbottomsheet_controller.dart';
import 'package:frontend_eccp_mobile/modules/auth/login/data/model/user_session.dart';
class AppBlocObserver extends BlocObserver {
const AppBlocObserver();
@override
void onChange(BlocBase<dynamic> bloc, Change<dynamic> change) {
super.onChange(bloc, change);
log('onChange(${bloc.runtimeType}, $change)');
}
@override
void onError(BlocBase<dynamic> bloc, Object error, StackTrace stackTrace) {
log('onError(${bloc.runtimeType}, $error, $stackTrace)');
super.onError(bloc, error, stackTrace);
}
}
Future<void> initSession() async {
final session = getIt<UserSession>();
final token = await SessionManager.getToken();
final user = await SessionManager.getUser();
if (token != null && user != null) {
session
..token = token
..user = user;
}
}
Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
FlutterError.onError = (details) {
log(details.exceptionAsString(), stackTrace: details.stack);
};
WidgetsFlutterBinding.ensureInitialized();
await configureDependencies();
await Firebase.initializeApp();
await CrashlyticsService.init();
await FcmService.init();
await initSession();
Bloc.observer = const AppBlocObserver();
log('Running flavor: ${Flavor.name}');
if (!Flavor.isProd) {
ChuckerFlutter.showOnRelease = true;
ChuckerFlutter.showNotification = false;
ChuckerFlutter.isDebugMode = true;
}
BottomSheetService.configure(
noInternetBuilder: (context) => AppBottomSheet(
controller: AppBottomSheetController(),
icon: 'assets/images/img-no-internet.png',
title: 'Eh, jaringannya hilang...',
subTitle:
'Harap periksa kembali jaringan internetmu, coba lagi beberapa saat ya!',
primaryText: 'Baik, dimengerti',
onPrimaryPressed: () {
Navigator.pop(context);
},
),
serverErrorBuilder: (ctx) => AppBottomSheet(
controller: AppBottomSheetController(),
title: 'Mohon maaf kami sedang ada gangguan!',
primaryText: 'Baik, dimengerti',
icon: 'assets/images/img-server-error.png',
subTitle:
'Saat ini permintaan kamu belum dapat diproses, coba lagi beberapa saat lagi ya!\nJika berlanjut, hubungi CS.',
onPrimaryPressed: () {
Navigator.pop(ctx);
},
),
notFoundBuilder: (ctx) => AppBottomSheet(
controller: AppBottomSheetController(),
title: 'Opps, kamu tersesat',
primaryText: 'Baik, dimengerti',
icon: 'assets/images/img-not-found.png',
subTitle:
'Mari kembali ke jalur semula, coba lagi beberapa saat lagi ya!\nJika berlanjut, hubungi CS.',
onPrimaryPressed: () {
Navigator.pop(ctx);
},
),
sessionExpiredBuilder: (ctx) => AppBottomSheet(
controller: AppBottomSheetController(),
title: 'Sesi Berakhir',
primaryText: 'Login Ulang',
icon: 'assets/images/img-server-error.png',
subTitle: 'Silakan login ulang untuk melanjutkan.',
onPrimaryPressed: () {
Navigator.pop(ctx);
},
),
locationPermissionBuilder:
(
ctx, {
required onOpenSettings,
VoidCallback? onRequestNow,
}) {
return AppBottomSheet(
controller: AppBottomSheetController(),
title: 'Permintaan Akses Lokasi',
primaryText: 'Buka Pengaturan',
icon: 'assets/images/img-location-permission.png',
subTitle:
'E-CPP ingin meminta akses lokasi kamu agar paket yang diberikan lebih cocok untukmu!',
onPrimaryPressed: () async {
final resumeFut = waitRecheckOnNextResume(() async {
if (await LocationPermissionService.recheckGranted()) {
onOpenSettings();
}
});
await SettingsNavigator.openAppSettings();
await resumeFut;
if (!ctx.mounted) return;
Navigator.pop(ctx);
},
// onSecondary: onRequestNow,
);
},
);
runApp(await builder());
}