diff --git a/lib/main.dart b/lib/main.dart index a725658..b523414 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,20 +1,71 @@ import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'config/theme.dart'; +import 'services/api_service.dart'; +import 'services/background_service.dart'; +import 'screens/login_screen.dart'; +import 'screens/apps_screen.dart'; -void main() { - runApp(const MainApp()); +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + const storage = FlutterSecureStorage(); + final savedUrl = await storage.read(key: 'server_url'); + final savedToken = await storage.read(key: 'auth_token'); + + final api = ApiService(baseUrl: savedUrl ?? 'https://localhost'); + + if (savedToken != null) { + api.setToken(savedToken); + } + + final bgService = BackgroundService(); + await bgService.initialize(); + await bgService.schedulePeriodicCheck(); + + runApp(UpdateForgeApp(api: api, hasToken: savedToken != null)); } -class MainApp extends StatelessWidget { - const MainApp({super.key}); +class UpdateForgeApp extends HookWidget { + final ApiService api; + final bool hasToken; + + const UpdateForgeApp({super.key, required this.api, required this.hasToken}); @override Widget build(BuildContext context) { - return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), - ), + final loggedIn = useState(hasToken && api.isAuthenticated); + + Future saveCredentials() async { + const storage = FlutterSecureStorage(); + await storage.write(key: 'server_url', value: api.baseUrl); + await storage.write(key: 'auth_token', value: api.token); + } + + Future clearCredentials() async { + const storage = FlutterSecureStorage(); + await storage.delete(key: 'auth_token'); + api.setToken(''); + loggedIn.value = false; + } + + return MaterialApp( + title: 'UpdateForge', + theme: buildAppTheme(), + debugShowCheckedModeBanner: false, + home: loggedIn.value + ? AppsScreen( + api: api, + onLogout: clearCredentials, + ) + : LoginScreen( + api: api, + onLogin: () async { + await saveCredentials(); + loggedIn.value = true; + }, + ), ); } }