import 'package:flutter/material.dart'; import 'package:farolero/l10n/generated/app_localizations.dart'; import 'package:provider/provider.dart'; import '../estado/estado_juego.dart'; import '../modelos/partida.dart'; import '../tema/componentes_farolero.dart'; import '../tema/componentes_resultado_farolero.dart'; import '../tema/tema_app.dart'; import 'pantalla_adivinanza.dart'; import 'pantalla_debate.dart'; import 'pantalla_fin_partida.dart'; class PantallaResultado extends StatefulWidget { final ResultadoVotacion resultado; const PantallaResultado({super.key, required this.resultado}); @override State createState() => _PantallaResultadoState(); } class _PantallaResultadoState extends State with SingleTickerProviderStateMixin { bool _revelado = false; late AnimationController _animController; late Animation _animOpacidad; @override void initState() { super.initState(); _animController = AnimationController( duration: const Duration(milliseconds: 2500), vsync: this, ); _animOpacidad = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: _animController, curve: const Interval(0.6, 1.0, curve: Curves.easeIn), ), ); // Iniciar animación de suspense Future.delayed(const Duration(milliseconds: 500), () { _animController.forward().then((_) { setState(() => _revelado = true); }); }); } @override void dispose() { _animController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; final estado = context.read(); final partida = estado.partida; return Scaffold( appBar: AppBar( title: Text(l10n.result), automaticallyImplyLeading: false, ), body: FondoFarolero( intenso: true, child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(32), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Animación de suspense if (!_revelado) ...[ const ArteGameplayFarolero.resultado(height: 152), const SizedBox(height: 16), Text( l10n.revealing, style: Theme.of(context).textTheme.headlineMedium, ), const SizedBox(height: 24), const CircularProgressIndicator(color: TemaApp.colorAcento), ], if (_revelado) ...[ FadeTransition( opacity: _animOpacidad, child: ResultadoRondaFarolero( resultado: widget.resultado, jugadores: partida?.jugadores ?? const [], acciones: _construirBotones(context, estado), ), ), ], ], ), ), ), ), ); } Widget _construirBotones(BuildContext context, EstadoJuego estado) { final l10n = AppLocalizations.of(context)!; final partida = estado.partida; if (partida == null) return const SizedBox.shrink(); final finPartida = estado.comprobarFinPartida(); if (finPartida) { return BotonFarolero( texto: l10n.seeEndResult, icono: Icons.emoji_events, onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => const PantallaFinPartida()), ); }, ); } if (widget.resultado.eraImpostor) { return Column( children: [ BotonFarolero.oscuro( texto: l10n.impostorGuessWord, icono: Icons.gps_fixed, onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (_) => const PantallaAdivinanza(), ), ); }, ), const SizedBox(height: 12), BotonFarolero( texto: l10n.nextRound, icono: Icons.skip_next, onPressed: () => _siguienteRonda(context, estado), ), ], ); } return BotonFarolero( texto: l10n.nextRound, icono: Icons.skip_next, onPressed: () => _siguienteRonda(context, estado), ); } void _siguienteRonda(BuildContext context, EstadoJuego estado) { estado.siguienteRonda(); Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => const PantallaDebate()), ); } }