85 lines
2.6 KiB
Dart

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<void> _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<SessionController>(
builder: (context, session, _) => switch (session.status) {
SessionStatus.loading => const SplashScreen(),
SessionStatus.signedOut => const LoginScreen(),
SessionStatus.signedIn => DriveScreen(
key: ValueKey(session.organizationId),
),
},
),
),
);
}
}