import 'package:flutter/material.dart'; import 'package:moonwell_launcher/app/design_system/mw_shells.dart'; import 'package:moonwell_launcher/app/home_screen/home_screen.dart'; import 'package:moonwell_launcher/app/login_screen/login_screen.dart'; import 'package:moonwell_launcher/app/theme/moonwell_design_system.dart'; import 'package:moonwell_launcher/features/launcher/application/restore_launcher_session_use_case.dart'; import 'package:moonwell_launcher/features/launcher/data/launcher_api_client.dart'; import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart'; import 'package:moonwell_launcher/service_container.dart'; class MoonWellApp extends StatefulWidget { const MoonWellApp({super.key}); @override State createState() => _MoonWellAppState(); } class _MoonWellAppState extends State { late final LauncherThemeController _themeController; @override void initState() { super.initState(); _themeController = LauncherThemeController(getIt()); _themeController.load(); } @override void dispose() { _themeController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _themeController, builder: (context, _) => LauncherThemeScope( controller: _themeController, child: MaterialApp( title: 'MoonWell', debugShowCheckedModeBanner: false, home: const _LauncherBootstrapScreen(), theme: MoonWellTheme.create(_themeController.variant), ), ), ); } } class LauncherThemeScope extends InheritedNotifier { const LauncherThemeScope({ super.key, required LauncherThemeController controller, required super.child, }) : super(notifier: controller); static LauncherThemeController of(BuildContext context) { final scope = context .dependOnInheritedWidgetOfExactType(); assert(scope != null, 'LauncherThemeScope is missing'); return scope!.notifier!; } } class _LauncherBootstrapScreen extends StatefulWidget { const _LauncherBootstrapScreen(); @override State<_LauncherBootstrapScreen> createState() => _LauncherBootstrapScreenState(); } class _LauncherBootstrapScreenState extends State<_LauncherBootstrapScreen> { late final Future _bootstrapFuture; @override void initState() { super.initState(); _bootstrapFuture = RestoreLauncherSessionUseCase( launcherApiClient: getIt(), preferencesRepository: getIt(), )(); } @override Widget build(BuildContext context) { return FutureBuilder( future: _bootstrapFuture, builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return const _LauncherBootstrapLoadingScreen(); } final result = snapshot.data ?? const RestoreLauncherSessionResult.unauthenticated(); if (result.isAuthenticated) { return HomeScreen( session: result.session!, manifest: result.manifest!, ); } return const LoginScreen(); }, ); } } class _LauncherBootstrapLoadingScreen extends StatelessWidget { const _LauncherBootstrapLoadingScreen(); @override Widget build(BuildContext context) { return const Scaffold( body: MwArtworkBackground( child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ MwBrandMark(width: 220), SizedBox(height: 24), SizedBox.square( dimension: 28, child: CircularProgressIndicator(strokeWidth: 2), ), ], ), ), ), ); } }