69 lines
1.7 KiB
Dart
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()),
|
|
);
|
|
}
|
|
}
|