import 'dart:async'; import 'package:background_downloader/background_downloader.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'controllers/session_controller.dart'; import 'controllers/upload_controller.dart'; import 'core/app_theme.dart'; import 'screens/drive_screen.dart'; import 'screens/login_screen.dart'; import 'screens/splash_screen.dart'; import 'services/api_client.dart'; import 'services/token_store.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); const tokens = TokenStore(); final api = ApiClient(tokens); runApp(WhatsDriveApp(tokens: tokens, api: api)); unawaited(_initializeBackgroundUploads()); } Future _initializeBackgroundUploads() async { try { await FileDownloader().configure( globalConfig: [(Config.requestTimeout, const Duration(minutes: 30))], ); FileDownloader().configureNotificationForGroup( 'uploads', running: const TaskNotification( 'Uploading {displayName}', '{progress} • {networkSpeed} • {timeRemaining} remaining', ), complete: const TaskNotification( 'Upload complete', '{displayName} is now in your drive', ), error: const TaskNotification( 'Upload failed', 'Could not upload {displayName}', ), canceled: const TaskNotification( 'Upload canceled', '{displayName} was canceled', ), progressBar: true, ); await FileDownloader().start(); } catch (error, stackTrace) { debugPrint('Background upload initialization failed: $error\n$stackTrace'); } } class WhatsDriveApp extends StatelessWidget { const WhatsDriveApp({super.key, required this.tokens, required this.api}); final TokenStore tokens; final ApiClient api; @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider( create: (_) => SessionController(api, tokens)..initialize(), ), ChangeNotifierProvider(create: (_) => UploadController(tokens)), Provider.value(value: api), ], child: MaterialApp( debugShowCheckedModeBanner: false, title: 'Metatron-Drive', theme: AppTheme.light, home: Consumer( builder: (context, session, _) => switch (session.status) { SessionStatus.loading => const SplashScreen(), SessionStatus.signedOut => const LoginScreen(), SessionStatus.signedIn => DriveScreen( key: ValueKey(session.organizationId), ), }, ), ), ); } }