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;
|
return null;
|
||||||
},
|
},
|
||||||
routes: [
|
routes: [
|
||||||
|
GoRoute(
|
||||||
|
path: '/',
|
||||||
|
builder: (context, state) => const StartupScreen(),
|
||||||
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: '/connect',
|
path: '/connect',
|
||||||
builder: (context, state) => const ServerDiscoveryScreen(),
|
builder: (context, state) => const ServerDiscoveryScreen(),
|
||||||
|
|||||||
Reference in New Issue
Block a user