import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../core/auth/auth_provider.dart'; import '../../../core/router/app_router.dart'; /// Écran de connexion utilisateur. class LoginScreen extends ConsumerStatefulWidget { const LoginScreen({super.key}); @override ConsumerState createState() => _LoginScreenState(); } class _LoginScreenState extends ConsumerState { final _formKey = GlobalKey(); final _emailController = TextEditingController(text: 'marie.dupont@demo.local'); final _passwordController = TextEditingController(text: 'password'); @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } Future _submit() async { if (!_formKey.currentState!.validate()) return; final success = await ref.read(authProvider.notifier).login( _emailController.text.trim(), _passwordController.text, ); if (success && mounted) { context.go(AppRoutes.home); } } @override Widget build(BuildContext context) { final authState = ref.watch(authProvider); return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Icon(Icons.local_laundry_service, size: 72, color: Theme.of(context).colorScheme.primary), const SizedBox(height: 16), Text( 'Laverie Connectée', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineMedium, ), const SizedBox(height: 8), Text( 'Connectez-vous pour réserver et laver', textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 32), TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: 'Email', prefixIcon: Icon(Icons.email_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return 'Email requis'; } return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: true, decoration: const InputDecoration( labelText: 'Mot de passe', prefixIcon: Icon(Icons.lock_outline), ), validator: (value) { if (value == null || value.isEmpty) { return 'Mot de passe requis'; } return null; }, ), if (authState.error != null) ...[ const SizedBox(height: 12), Text( authState.error!, style: TextStyle(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.center, ), ], const SizedBox(height: 24), ElevatedButton( onPressed: authState.isLoading ? null : _submit, child: authState.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Se connecter'), ), const SizedBox(height: 12), TextButton( onPressed: () => context.push(AppRoutes.register), child: const Text('Créer un compte'), ), ], ), ), ), ), ), ); } }