timetracker/lib/main.dart

106 lines
3 KiB
Dart

import 'package:intl/date_symbol_data_local.dart';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:path_provider/path_provider.dart';
import 'package:timetracker/screens/main_screen.dart';
import 'package:timetracker/src/rust/api.dart';
import 'package:timetracker/src/rust/frb_generated.dart';
import 'package:timetracker/time_tracking_service.dart';
import 'package:provider/provider.dart';
Future<void> main() async {
log("main: Start");
try {
WidgetsFlutterBinding.ensureInitialized();
await initializeDateFormatting('de_DE', null);
try {
await RustLib.init();
} catch (e) {
runApp(ErrorApp(error: "RustLib Init Failed: $e"));
}
try {
final dbDir = await getApplicationDocumentsDirectory();
await Directory(dbDir.path).create(recursive: true);
await initApp(dbDirectoryPath: dbDir.path);
} catch (e) {
runApp(ErrorApp(error: "Database Init Failed: $e"));
return;
}
runApp(
ChangeNotifierProvider(
create: (context) => TimeTrackingService(),
child: const MyApp(),
),
);
} catch (e) {
runApp(ErrorApp(error: "Unhandled error in main: $e"));
}
}
class ErrorApp extends StatelessWidget {
final String error;
const ErrorApp({required this.error, Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text("Initialization Error")),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text("Could not initialize the application:\n\n$error"),
),
),
),
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Rust Time Tracker',
supportedLocales: const [Locale('de', 'DE'), Locale('en', '')],
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true),
home: const InitializerWidget(),
);
}
}
class InitializerWidget extends StatelessWidget {
const InitializerWidget({super.key});
@override
Widget build(BuildContext context) {
final initStatus = context.select(
(TimeTrackingService s) => s.isInitialized,
);
final isLoading = context.select((TimeTrackingService s) => s.isLoading);
if (isLoading) {
return const Scaffold(body: Center(child: CircularProgressIndicator()));
} else if (!initStatus) {
return const Scaffold(
body: Center(
child: Text("Fehler bei der Initialisierung der Datenbank."),
),
);
} else {
return const MainScreen();
}
}
}