import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:barber_app/core/theme/app_theme.dart'; import 'package:barber_app/core/constants/app_strings.dart'; import 'package:barber_app/features/auth/presentation/bloc/auth_bloc.dart'; import 'package:barber_app/features/auth/presentation/pages/register_page.dart'; import 'package:barber_app/features/home/presentation/pages/home_page.dart'; import 'package:barber_app/shared/widgets/custom_text_field.dart'; import 'package:barber_app/shared/widgets/loading_button.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State with SingleTickerProviderStateMixin { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; late AnimationController _animationController; late Animation _fadeAnimation; @override void initState() { super.initState(); _animationController = AnimationController( vsync: this, duration: const Duration(milliseconds: 800), ); _fadeAnimation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), ); _animationController.forward(); } @override void dispose() { _emailController.dispose(); _passwordController.dispose(); _animationController.dispose(); super.dispose(); } void _onLogin() { if (_formKey.currentState?.validate() ?? false) { context.read().add( AuthLoginRequested( email: _emailController.text, password: _passwordController.text, ), ); } } @override Widget build(BuildContext context) { return Scaffold( body: BlocListener( listener: (context, state) { if (state is AuthAuthenticated) { Navigator.of(context).pushReplacement( MaterialPageRoute(builder: (_) => const HomePage()), ); } else if (state is AuthError) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(state.message), backgroundColor: AppColors.error, ), ); } }, child: SafeArea( child: FadeTransition( opacity: _fadeAnimation, child: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 60), // Logo e título _buildHeader(), const SizedBox(height: 60), // Campos de formulário _buildForm(), const SizedBox(height: 24), // Botão de login _buildLoginButton(), const SizedBox(height: 16), // Link para registro _buildRegisterLink(), ], ), ), ), ), ), ), ); } Widget _buildHeader() { return Column( children: [ const SizedBox(height: 40), // Ícone/Logo imersivo com brilho Container( width: 120, height: 120, decoration: BoxDecoration( shape: BoxShape.circle, gradient: AppColors.goldGradient, boxShadow: AppColors.premiumShadow, border: Border.all( color: Colors.white.withValues(alpha: 0.1), width: 1.5, ), ), child: const Center( child: Icon( Icons.content_cut_rounded, size: 55, color: Colors.black, ), ), ), const SizedBox(height: 40), Text( 'ELITE BARBER', style: TextStyle( fontSize: 32, fontWeight: FontWeight.w900, fontFamily: 'Outfit', letterSpacing: 4, color: AppColors.textPrimary, ), ), const SizedBox(height: 12), Text( 'O PODER DA GESTÃO EM SUAS MÃOS', textAlign: TextAlign.center, style: TextStyle( fontSize: 10, fontWeight: FontWeight.w800, letterSpacing: 2, color: AppColors.primaryColor, ), ), ], ); } Widget _buildForm() { return Column( children: [ CustomTextField( controller: _emailController, label: AppStrings.email, hint: 'seu@email.com', keyboardType: TextInputType.emailAddress, prefixIcon: Icons.email_outlined, validator: (value) { if (value == null || value.isEmpty) { return 'Informe o e-mail'; } if (!value.contains('@')) { return AppStrings.invalidEmail; } return null; }, ), const SizedBox(height: 16), CustomTextField( controller: _passwordController, label: AppStrings.password, hint: '••••••', obscureText: _obscurePassword, prefixIcon: Icons.lock_outline, suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: AppColors.textSecondary, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), validator: (value) { if (value == null || value.isEmpty) { return 'Informe a senha'; } return null; }, ), ], ); } Widget _buildLoginButton() { return BlocBuilder( builder: (context, state) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: AppColors.primaryColor.withValues(alpha: 0.2), blurRadius: 20, offset: const Offset(0, 10), ), ], ), child: LoadingButton( text: 'ENTRAR NO SISTEMA', isLoading: state is AuthLoading, onPressed: _onLogin, ), ); }, ); } Widget _buildRegisterLink() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Não tem uma conta? ', style: TextStyle(color: AppColors.textSecondary), ), TextButton( onPressed: () { Navigator.of( context, ).push(MaterialPageRoute(builder: (_) => const RegisterPage())); }, child: Text( AppStrings.createAccount, style: TextStyle( color: AppColors.primaryColor, fontWeight: FontWeight.bold, ), ), ), ], ); } }