83 lines
2.5 KiB
Dart
83 lines
2.5 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 => const DriveScreen(),
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|