Files
trainhub-flutter/lib/presentation/welcome/welcome_screen.dart
Kazimierz Ciołek 9dcc4b87de
Some checks failed
Build Linux App / build (push) Failing after 1m18s
Next refactors
2026-02-24 02:19:28 +01:00

80 lines
2.5 KiB
Dart

import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:trainhub_flutter/core/constants/ui_constants.dart';
import 'package:trainhub_flutter/core/router/app_router.dart';
import 'package:trainhub_flutter/core/theme/app_colors.dart';
import 'package:trainhub_flutter/presentation/settings/ai_model_settings_controller.dart';
import 'package:trainhub_flutter/presentation/settings/ai_model_settings_state.dart';
import 'package:trainhub_flutter/presentation/welcome/widgets/download_progress.dart';
import 'package:trainhub_flutter/presentation/welcome/widgets/initial_prompt.dart';
@RoutePage()
class WelcomeScreen extends ConsumerStatefulWidget {
const WelcomeScreen({super.key});
@override
ConsumerState<WelcomeScreen> createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends ConsumerState<WelcomeScreen> {
bool _hasNavigated = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
ref
.read(aiModelSettingsControllerProvider.notifier)
.validateModels()
.then((_) {
if (!mounted) return;
final validated = ref
.read(aiModelSettingsControllerProvider)
.areModelsValidated;
if (validated) _navigateToApp();
});
});
}
void _navigateToApp() {
if (_hasNavigated) return;
_hasNavigated = true;
context.router.replace(const ShellRoute());
}
@override
Widget build(BuildContext context) {
final modelState = ref.watch(aiModelSettingsControllerProvider);
ref.listen<AiModelSettingsState>(aiModelSettingsControllerProvider,
(prev, next) {
if (!_hasNavigated &&
next.areModelsValidated &&
!next.isDownloading) {
_navigateToApp();
}
});
return Scaffold(
backgroundColor: AppColors.surface,
body: Center(
child: SizedBox(
width: 560,
child: AnimatedSwitcher(
duration: UIConstants.animationDuration,
child: modelState.isDownloading
? DownloadProgress(modelState: modelState)
: InitialPrompt(
onDownload: () => ref
.read(aiModelSettingsControllerProvider.notifier)
.downloadAll(),
onSkip: _navigateToApp,
),
),
),
),
);
}
}