feat: add an invisible startup screen
This commit is contained in:
@@ -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<StartupScreen> createState() => _StartupScreenState();
|
||||
}
|
||||
|
||||
class _StartupScreenState extends ConsumerState<StartupScreen> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_bootstrap();
|
||||
}
|
||||
|
||||
Future<void> _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()),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,10 @@ final routerProvider = Provider<GoRouter>((ref) {
|
||||
return null;
|
||||
},
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: '/',
|
||||
builder: (context, state) => const StartupScreen(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/connect',
|
||||
builder: (context, state) => const ServerDiscoveryScreen(),
|
||||
|
||||
Reference in New Issue
Block a user