Files

69 lines
1.7 KiB
Dart

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()),
);
}
}