112 lines
4.3 KiB
Dart
112 lines
4.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import '../../core/config/app_constants.dart';
|
|
import '../../l10n/app_localizations.dart';
|
|
import '../providers/repository_provider.dart';
|
|
import '../providers/theme_provider.dart';
|
|
import '../widgets/game_over/game_over_header.dart';
|
|
import '../widgets/game_over/game_over_stats.dart';
|
|
import '../widgets/game_over/game_over_actions.dart';
|
|
import '../widgets/game_over/hinge_divider.dart';
|
|
|
|
/// Écran de fin de partie. Affiche le Pokémon manqué, les stats, et propose de rejouer.
|
|
class GameOverPage extends ConsumerStatefulWidget {
|
|
const GameOverPage({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
ConsumerState<GameOverPage> createState() => _GameOverPageState();
|
|
}
|
|
|
|
class _GameOverPageState extends ConsumerState<GameOverPage> {
|
|
int _seenCount = 0;
|
|
bool _isLoading = true;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_loadSeenCount();
|
|
}
|
|
|
|
Future<void> _loadSeenCount() async {
|
|
final count = await ref.read(pokemonRepositoryProvider).seenCount();
|
|
if (mounted) {
|
|
setState(() {
|
|
_seenCount = count;
|
|
_isLoading = false;
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>?;
|
|
final pokemonImage = args?['pokemonImage'] ?? '';
|
|
final pokemonName = args?['pokemonName'] ?? 'Unknown';
|
|
final int streak = args?['streak'] ?? 0;
|
|
final int score = args?['score'] ?? 0;
|
|
|
|
final palette = appPalettes[ref.watch(themeProvider)];
|
|
final primaryDark = HSLColor.fromColor(palette.primary)
|
|
.withLightness((HSLColor.fromColor(palette.primary).lightness - 0.12).clamp(0.0, 1.0))
|
|
.toColor();
|
|
const silverBg = Color(0xFFC8D1D8);
|
|
|
|
return Scaffold(
|
|
backgroundColor: palette.primary,
|
|
body: _isLoading
|
|
? const Center(child: CircularProgressIndicator(color: Colors.white))
|
|
: SingleChildScrollView(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Column(
|
|
children: [
|
|
GameOverHeader(
|
|
pokemonImage: pokemonImage,
|
|
pokemonName: pokemonName,
|
|
primaryDark: primaryDark,
|
|
surfaceColor: palette.surface,
|
|
),
|
|
HingeDivider(color: primaryDark),
|
|
Container(
|
|
decoration: BoxDecoration(color: primaryDark, border: Border.all(color: primaryDark, width: 4)),
|
|
child: Container(
|
|
width: double.infinity,
|
|
padding: const EdgeInsets.all(16),
|
|
color: silverBg,
|
|
child: Column(
|
|
children: [
|
|
Container(
|
|
width: double.infinity,
|
|
color: palette.surface,
|
|
padding: const EdgeInsets.all(24),
|
|
child: Text(
|
|
AppLocalizations.of(context)!.gameOverMessage,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(color: Colors.white, fontSize: 18, height: 1.5),
|
|
),
|
|
),
|
|
const SizedBox(height: 16),
|
|
GameOverStats(
|
|
streak: streak.toString().padLeft(3, '0'),
|
|
seen: "$_seenCount/${AppConstants.totalPokemon}",
|
|
score: "$score",
|
|
),
|
|
const SizedBox(height: 16),
|
|
GameOverActions(
|
|
primaryColor: palette.primary,
|
|
primaryDark: primaryDark,
|
|
onTryAgain: () => Navigator.pop(context, true),
|
|
onBack: () => Navigator.pop(context, false),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|