import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../../features/auth/providers/auth_provider.dart'; import '../../../../core/theme/app_colors.dart'; import '../../../theme/mobile_theme.dart'; class MobileLoginScreen extends ConsumerStatefulWidget { const MobileLoginScreen({super.key}); @override ConsumerState createState() => _MobileLoginScreenState(); } class _MobileLoginScreenState extends ConsumerState { final _formKey = GlobalKey(); final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future _handleLogin() async { if (!_formKey.currentState!.validate()) return; final auth = ref.read(authProvider.notifier); final success = await auth.login( _usernameController.text.trim(), _passwordController.text, ); if (success && mounted) { context.go('/playlists'); } } @override Widget build(BuildContext context) { final authState = ref.watch(authProvider); return Theme( data: MobileTheme.darkTheme, child: Scaffold( backgroundColor: AppColors.background, body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Logo Container( width: 72, height: 72, decoration: BoxDecoration( color: AppColors.surface, borderRadius: BorderRadius.circular(16), border: Border.all(color: AppColors.border), ), child: const Icon( Icons.live_tv, color: AppColors.primary, size: 36, ), ), const SizedBox(height: 16), const Text( 'XtremFlow', style: TextStyle( fontSize: 28, fontWeight: FontWeight.w800, color: AppColors.textPrimary, letterSpacing: -0.5, ), ), const SizedBox(height: 4), const Text( 'Mobile Edition', style: TextStyle( fontSize: 12, color: AppColors.textSecondary, letterSpacing: 1.5, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 48), // Form Form( key: _formKey, child: Column( children: [ TextFormField( controller: _usernameController, style: const TextStyle(color: AppColors.textPrimary), decoration: const InputDecoration( labelText: 'Username', prefixIcon: Icon(Icons.person_outline), ), validator: (value) => (value == null || value.trim().isEmpty) ? 'Required' : null, textInputAction: TextInputAction.next, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: _obscurePassword, style: const TextStyle(color: AppColors.textPrimary), decoration: InputDecoration( labelText: 'Password', prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, ), onPressed: () => setState( () => _obscurePassword = !_obscurePassword), ), ), validator: (value) => (value == null || value.isEmpty) ? 'Required' : null, onFieldSubmitted: (_) => _handleLogin(), ), if (authState.errorMessage != null) ...[ const SizedBox(height: 16), Text( authState.errorMessage!, style: const TextStyle( color: AppColors.error, fontSize: 12), textAlign: TextAlign.center, ), ], const SizedBox(height: 32), SizedBox( width: double.infinity, child: FilledButton( onPressed: authState.isLoading ? null : _handleLogin, child: authState.isLoading ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.black), ) : const Text('Sign In'), ), ), ], ), ), const SizedBox(height: 24), const Text( 'Default: admin / admin', style: TextStyle( fontSize: 12, color: AppColors.textTertiary, fontStyle: FontStyle.italic, ), ), ], ), ), ), ), ); } }