import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; import '../providers/penjadwalan_provider.dart'; import '../providers/kandang_provider.dart'; class SignupPage extends StatefulWidget { const SignupPage({super.key}); @override State createState() => _SignupPageState(); } class _SignupPageState extends State { final _nameController = TextEditingController(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; bool _agreedToTerms = false; @override void dispose() { _nameController.dispose(); _emailController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } Future _handleSignup() async { final name = _nameController.text.trim(); final email = _emailController.text.trim(); final password = _passwordController.text; final confirmPassword = _confirmPasswordController.text; // Validation if (name.isEmpty || email.isEmpty || password.isEmpty || confirmPassword.isEmpty) { ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('Semua field harus diisi'))); return; } final emailRegex = RegExp(r'^[\w\-.]+@([\w-]+\.)+[\w-]{2,4}$'); if (!emailRegex.hasMatch(email)) { ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('Email tidak valid'))); return; } if (password != confirmPassword) { ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('Password tidak cocok'))); return; } if (password.length < 6) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Password minimal 6 karakter')), ); return; } if (!_agreedToTerms) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Anda harus menyetujui syarat dan ketentuan'), ), ); return; } final authProvider = context.read(); final success = await authProvider.signup(email, password, name); if (success) { if (!mounted) return; // Initialize user data di Firebase final userId = authProvider.user?.uid; if (userId != null) { final penjadwalanProvider = context.read(); final kandangProvider = context.read(); try { await penjadwalanProvider.initializeWithUser(userId); await kandangProvider.initializeWithUser(userId); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text( 'Akun berhasil dibuat, tetapi sinkronisasi data belum sempurna.', ), ), ); } } ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('Akun berhasil dibuat!'))); if (!mounted) return; Navigator.pushReplacementNamed(context, '/home'); } else { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(authProvider.errorMessage ?? 'Pendaftaran gagal'), ), ); } } @override Widget build(BuildContext context) { return Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.orange.shade100, Colors.amber.shade100, Colors.greenAccent.shade100, ], ), ), child: SafeArea( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ const SizedBox(height: 20), // Back Button Align( alignment: Alignment.centerLeft, child: GestureDetector( onTap: () => Navigator.pop(context), child: Icon( Icons.arrow_back_ios, color: Colors.grey.shade700, size: 28, ), ), ), const SizedBox(height: 30), // Greeting Text( 'Daftar Akun Baru', style: TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Colors.orange.shade700, ), ), const SizedBox(height: 12), Text( 'Bergabunglah dengan TelurKu', style: TextStyle(fontSize: 16, color: Colors.grey.shade700), ), const SizedBox(height: 40), // Signup Form Card Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, offset: const Offset(0, 5), ), ], ), padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Name Field Text( 'Nama Lengkap', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _nameController, decoration: InputDecoration( hintText: 'Masukkan nama lengkap', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.person_outlined, color: Colors.orange.shade600, ), ), ), const SizedBox(height: 20), // Email Field Text( 'Email', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _emailController, keyboardType: TextInputType.emailAddress, decoration: InputDecoration( hintText: 'Masukkan email Anda', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.email_outlined, color: Colors.orange.shade600, ), ), ), const SizedBox(height: 20), // Password Field Text( 'Password', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( hintText: 'Minimal 6 karakter', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.lock_outlined, color: Colors.orange.shade600, ), suffixIcon: GestureDetector( onTap: () { setState(() { _obscurePassword = !_obscurePassword; }); }, child: Icon( _obscurePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, color: Colors.orange.shade600, ), ), ), ), const SizedBox(height: 20), // Confirm Password Field Text( 'Konfirmasi Password', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: Colors.grey.shade700, ), ), const SizedBox(height: 8), TextField( controller: _confirmPasswordController, obscureText: _obscureConfirmPassword, decoration: InputDecoration( hintText: 'Konfirmasi password Anda', hintStyle: TextStyle(color: Colors.grey.shade400), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), prefixIcon: Icon( Icons.lock_outlined, color: Colors.orange.shade600, ), suffixIcon: GestureDetector( onTap: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, child: Icon( _obscureConfirmPassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, color: Colors.orange.shade600, ), ), ), ), const SizedBox(height: 20), // Terms and Conditions Checkbox Row( children: [ Checkbox( value: _agreedToTerms, onChanged: (value) { setState(() { _agreedToTerms = value ?? false; }); }, activeColor: Colors.orange.shade600, ), Expanded( child: RichText( text: TextSpan( text: 'Saya setuju dengan ', style: TextStyle( fontSize: 13, color: Colors.grey.shade700, ), children: [ TextSpan( text: 'Syarat & Ketentuan', style: TextStyle( color: Colors.orange.shade600, fontWeight: FontWeight.bold, ), ), ], ), ), ), ], ), const SizedBox(height: 30), // Signup Button Consumer( builder: (context, authProvider, _) { return SizedBox( width: double.infinity, height: 56, child: ElevatedButton( onPressed: authProvider.isLoading ? null : _handleSignup, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFF4D03F), disabledBackgroundColor: Colors.grey.shade300, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), ), child: authProvider.isLoading ? const SizedBox( width: 24, height: 24, child: CircularProgressIndicator( strokeWidth: 2, ), ) : Text( 'Daftar', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.grey.shade800, ), ), ), ); }, ), ], ), ), const SizedBox(height: 24), // Login Link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Sudah punya akun? ', style: TextStyle( fontSize: 14, color: Colors.grey.shade700, ), ), GestureDetector( onTap: () => Navigator.pushNamed(context, '/login'), child: Text( 'Masuk di sini', style: TextStyle( fontSize: 14, color: Colors.orange.shade600, fontWeight: FontWeight.bold, ), ), ), ], ), const SizedBox(height: 20), ], ), ), ), ), ), ); } }