From 71860813889ed55745fd925bcdd0a8a0ad110ba2 Mon Sep 17 00:00:00 2001 From: dvdrw Date: Thu, 7 May 2026 19:48:35 +0200 Subject: [PATCH] feat: add an invisible startup screen --- lib/features/connection/startup_screen.dart | 68 +++++++++++++++++++++ lib/router.dart | 4 ++ 2 files changed, 72 insertions(+) create mode 100644 lib/features/connection/startup_screen.dart diff --git a/lib/features/connection/startup_screen.dart b/lib/features/connection/startup_screen.dart new file mode 100644 index 0000000..bb1cfca --- /dev/null +++ b/lib/features/connection/startup_screen.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; + +import '../../data/sources/localiser/realtime_data_client.dart'; +import '../../data/sources/localiser/session_client.dart'; +import '../../providers.dart'; + +class StartupScreen extends ConsumerStatefulWidget { + const StartupScreen({super.key}); + + @override + ConsumerState createState() => _StartupScreenState(); +} + +class _StartupScreenState extends ConsumerState { + @override + void initState() { + super.initState(); + _bootstrap(); + } + + Future _bootstrap() async { + final store = ref.read(credentialStoreProvider); + + final config = await store.loadServer(); + if (!mounted) return; + + if (config == null) { + context.go('/connect'); + return; + } + + final creds = await store.load(); + if (!mounted) return; + + if (creds == null) { + context.go('/connect'); + return; + } + + try { + final tokenResponse = + await SessionClient(config: config).login(creds.username, creds.password); + if (!mounted) return; + + final token = tokenResponse.token; + ref.read(serverConfigProvider.notifier).state = config; + ref.read(authTokenProvider.notifier).state = token; + + final realtime = RealtimeDataClient(config: config, token: token); + await realtime.connect(); + if (!mounted) return; + + ref.read(realtimeDataClientProvider.notifier).state = realtime; + context.go('/floorplan'); + } catch (_) { + if (mounted) context.go('/connect'); + } + } + + @override + Widget build(BuildContext context) { + return const Scaffold( + body: Center(child: CircularProgressIndicator()), + ); + } +} diff --git a/lib/router.dart b/lib/router.dart index a424134..81eaf11 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -30,6 +30,10 @@ final routerProvider = Provider((ref) { return null; }, routes: [ + GoRoute( + path: '/', + builder: (context, state) => const StartupScreen(), + ), GoRoute( path: '/connect', builder: (context, state) => const ServerDiscoveryScreen(),