import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../shared/providers/auth_provider.dart'; class RegisterScreen extends ConsumerStatefulWidget { const RegisterScreen({super.key}); @override ConsumerState createState() => _RegisterScreenState(); } class _RegisterScreenState extends ConsumerState { final _formKey = GlobalKey(); final _nameController = TextEditingController(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _isLoading = false; String? _error; @override void dispose() { _nameController.dispose(); _emailController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } Future _handleRegister() async { if (!_formKey.currentState!.validate()) return; setState(() { _isLoading = true; _error = null; }); try { await ref.read(authStateProvider.notifier).signUp( name: _nameController.text.trim(), email: _emailController.text.trim(), password: _passwordController.text, ); if (mounted) { context.go('/'); } } catch (e) { if (mounted) { setState(() { _error = 'Registration failed. Please try again.'; }); } } finally { if (mounted) { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { 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: [ // Logo/Title Icon( Icons.hub, size: 64, color: Theme.of(context).colorScheme.primary, ), const SizedBox(height: 16), Text( 'Create Account', style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 48), // Error message if (_error != null) ...[ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.red.shade50, borderRadius: BorderRadius.circular(8), ), child: Text( _error!, style: TextStyle(color: Colors.red.shade700), textAlign: TextAlign.center, ), ), const SizedBox(height: 16), ], // Name field TextFormField( controller: _nameController, textInputAction: TextInputAction.next, decoration: const InputDecoration( labelText: 'Full Name', prefixIcon: Icon(Icons.person_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter your name'; } return null; }, ), const SizedBox(height: 16), // Email field TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.next, decoration: const InputDecoration( labelText: 'Email', prefixIcon: Icon(Icons.email_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter your email'; } if (!value.contains('@')) { return 'Please enter a valid email'; } return null; }, ), const SizedBox(height: 16), // Password field TextFormField( controller: _passwordController, obscureText: true, textInputAction: TextInputAction.next, decoration: const InputDecoration( labelText: 'Password', prefixIcon: Icon(Icons.lock_outlined), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter a password'; } if (value.length < 8) { return 'Password must be at least 8 characters'; } return null; }, ), const SizedBox(height: 16), // Confirm password field TextFormField( controller: _confirmPasswordController, obscureText: true, textInputAction: TextInputAction.done, onFieldSubmitted: (_) => _handleRegister(), decoration: const InputDecoration( labelText: 'Confirm Password', prefixIcon: Icon(Icons.lock_outlined), ), validator: (value) { if (value != _passwordController.text) { return 'Passwords do not match'; } return null; }, ), const SizedBox(height: 24), // Register button FilledButton( onPressed: _isLoading ? null : _handleRegister, child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Create Account'), ), const SizedBox(height: 16), // Login link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Already have an account?'), TextButton( onPressed: () => context.go('/login'), child: const Text('Sign In'), ), ], ), ], ), ), ), ), ), ); } }