import 'package:auth/auth.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:design_system/design_system.dart'; import 'package:sca_treezor/sca_treezor_module.dart'; import 'package:sf_app_platform/config/env/questia_env_config.dart'; import 'package:sf_app_platform/navigation/app_router.dart'; import 'package:navigation/navigation.dart'; import 'package:sf_app_platform/providers/app_state_provider.dart'; import 'package:sf_app_platform/providers/permissions/permissions_provider.dart'; import 'package:sf_app_platform/providers/wallet_heartbeat_service.dart'; import 'package:sf_infrastructure/sf_infrastructure.dart'; import 'package:sf_shared/sf_shared.dart'; import 'package:sf_localizations/sf_localizations.dart'; import 'package:utils/utils.dart'; import 'package:fonts/fonts.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); navigationModule(); scaTreezorModule(); configureAppRouter(); themePackages(); await dotenv.load(fileName: '.env'); await configureDependencies( QuestiaEnvConfig(), log: kDebugMode, onTreezorTokenExpired: () => appRouter.go(AppRoutes.scaTreezor), ); runApp(const ProviderScope(child: PlatformApp())); } class PlatformApp extends ConsumerStatefulWidget { const PlatformApp({super.key}); @override PlatformAppState createState() => PlatformAppState(); } class PlatformAppState extends ConsumerState with WidgetsBindingObserver { late final WalletHeartbeatService walletHeartbeat; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); walletHeartbeat = WalletHeartbeatService( repository: ref.read(treezorRepositoryProvider), sessionLocal: SessionLocalDatasourceImpl(), ); onBeforeSessionCleared = walletHeartbeat.stop; walletHeartbeat.start(); } @override void dispose() { walletHeartbeat.stop(); WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { debugPrint('State: $state'); ref.read(appLifecycleStateProvider.notifier).setState(state); if (state == AppLifecycleState.resumed) { walletHeartbeat.start(); ref.read(permissionsProvider.notifier).checkPermissions(); } else if (state == AppLifecycleState.paused) { walletHeartbeat.stop(); } super.didChangeAppLifecycleState(state); } @override Widget build(BuildContext context) { SizeUtils.init(context: context); return MaterialApp.router( title: 'SaveFamily', theme: ThemeData( fontFamily: AppFonts.stolzl, colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF329E95)), ), routerConfig: appRouter, debugShowCheckedModeBanner: false, localizationsDelegates: [ // CountryLocalizations.delegate, SFLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], supportedLocales: [for (final lang in supportedLanguages) Locale(lang)], localeResolutionCallback: (locale, supportedLocales) { if (locale == null) return supportedLocales.first; for (var supportedLocale in supportedLocales) { if (supportedLocale.languageCode == locale.languageCode) { return supportedLocale; } } return supportedLocales.first; }, ); } }