import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:adminduk_puger/theme.dart'; import 'package:adminduk_puger/cubit/Auth/Auth_cubit.dart'; import 'package:adminduk_puger/cubit/Auth/Auth_state.dart'; class RegisterScreen extends StatefulWidget { const RegisterScreen({super.key}); @override _RegisterScreenState createState() => _RegisterScreenState(); } class _RegisterScreenState extends State { bool _obscureText = true; bool _obscureConfirmText = true; final _formKey = GlobalKey(); final TextEditingController _nameController = TextEditingController(); final TextEditingController _nikController = TextEditingController(); final TextEditingController _noKkController = TextEditingController(); final TextEditingController _emailController = TextEditingController(); final TextEditingController _phoneController = TextEditingController(); final TextEditingController _addressController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); final TextEditingController _confirmPasswordController = TextEditingController(); @override void dispose() { _nameController.dispose(); _nikController.dispose(); _noKkController.dispose(); _emailController.dispose(); _phoneController.dispose(); _addressController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } String? _validateName(String? value) { if (value == null || value.isEmpty) { return 'Nama tidak boleh kosong'; } return null; } String? _validateEmail(String? value) { if (value == null || value.isEmpty) { return 'Email tidak boleh kosong'; } if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) { return 'Email tidak valid'; } return null; } String? _validatePhone(String? value) { if (value == null || value.isEmpty) { return 'Nomor telepon tidak boleh kosong'; } if (!RegExp(r'^[0-9]{10,13}$').hasMatch(value)) { return 'Nomor telepon tidak valid (10-13 digit)'; } return null; } String? _validateAddress(String? value) { if (value == null || value.isEmpty) { return 'Alamat tidak boleh kosong'; } return null; } String? _validatePassword(String? value) { if (value == null || value.isEmpty) { return 'Password tidak boleh kosong'; } if (value.length < 8) { return 'Password minimal 8 karakter'; } return null; } String? _validateConfirmPassword(String? value) { if (value == null || value.isEmpty) { return 'Konfirmasi password tidak boleh kosong'; } if (value != _passwordController.text) { return 'Password tidak sama'; } return null; } void _submitForm() { if (_formKey.currentState!.validate()) { context.read().register( _nameController.text, _emailController.text, _phoneController.text, _passwordController.text, _addressController.text, _nikController.text, _noKkController.text, ); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( backgroundColor: Colors.transparent, elevation: 0, leading: IconButton( icon: Icon(Icons.arrow_back, color: Colors.black), onPressed: () => Navigator.of(context).pop(), ), ), body: BlocListener( listener: (context, state) { if (state is AuthSuccess) { Navigator.pushReplacementNamed(context, '/home'); } else if (state is AuthFailure) { ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(state.error))); } else if (state is AuthRegistrationSuccess) { Navigator.pushReplacementNamed( context, '/login', ); // Pindah ke login ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(state.email)), // Tampilkan pesan dari API ); } }, child: SingleChildScrollView( padding: const EdgeInsets.all(30.0), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Header Center( child: Text.rich( TextSpan( children: [ TextSpan( text: "Adminduk\n", style: GoogleFonts.poppins( fontWeight: FontWeight.bold, fontSize: 30, color: Colors.black, ), ), TextSpan( text: "PUGER", style: GoogleFonts.poppins( fontWeight: FontWeight.bold, fontSize: 30, color: dongker, ), ), ], ), textAlign: TextAlign.center, ), ), const SizedBox(height: 40), Center( child: Text( 'Buat Akun Baru', style: GoogleFonts.poppins( fontSize: 18, fontWeight: FontWeight.w600, ), ), ), const SizedBox(height: 30), // Name Input TextFormField( controller: _nameController, validator: _validateName, decoration: InputDecoration( labelText: 'Nama Lengkap', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.person), ), ), const SizedBox(height: 30), // Name Input TextFormField( controller: _nikController, validator: _validateName, decoration: InputDecoration( labelText: 'NIK', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.person), ), ), const SizedBox(height: 30), // Name Input TextFormField( controller: _noKkController, validator: _validateName, decoration: InputDecoration( labelText: 'No. KK', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.person), ), ), const SizedBox(height: 20), // Email Input TextFormField( controller: _emailController, validator: _validateEmail, keyboardType: TextInputType.emailAddress, decoration: InputDecoration( labelText: 'Email', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.email), ), ), const SizedBox(height: 20), // Phone Input TextFormField( controller: _phoneController, validator: _validatePhone, keyboardType: TextInputType.phone, decoration: InputDecoration( labelText: 'Nomor Telepon', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.phone), ), ), const SizedBox(height: 20), // Address Input TextFormField( controller: _addressController, validator: _validateAddress, maxLines: 1, decoration: InputDecoration( labelText: 'Alamat', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.home), alignLabelWithHint: true, ), ), const SizedBox(height: 20), TextFormField( controller: _passwordController, validator: _validatePassword, obscureText: _obscureText, decoration: InputDecoration( labelText: 'Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.lock), suffixIcon: IconButton( icon: Icon( _obscureText ? Icons.visibility_off_outlined : Icons.remove_red_eye_outlined, color: Colors.grey, ), onPressed: () { setState(() { _obscureText = !_obscureText; }); }, ), ), ), const SizedBox(height: 20), TextFormField( controller: _confirmPasswordController, validator: _validateConfirmPassword, obscureText: _obscureConfirmText, decoration: InputDecoration( labelText: 'Konfirmasi Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(30), ), prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _obscureConfirmText ? Icons.visibility_off_outlined : Icons.remove_red_eye_outlined, color: Colors.grey, ), onPressed: () { setState(() { _obscureConfirmText = !_obscureConfirmText; }); }, ), ), ), const SizedBox(height: 40), // Submit Button BlocBuilder( builder: (context, state) { return SizedBox( width: double.infinity, height: 50, child: ElevatedButton( onPressed: state is AuthLoading ? null : _submitForm, style: ElevatedButton.styleFrom( backgroundColor: dongker, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), child: state is AuthLoading ? CircularProgressIndicator(color: Colors.white) : Text( "Daftar", style: GoogleFonts.poppins( fontSize: 16, fontWeight: FontWeight.w600, color: Colors.white, ), ), ), ); }, ), const SizedBox(height: 25), // Login Link Center( child: GestureDetector( onTap: () { Navigator.pushReplacementNamed(context, '/login'); }, child: RichText( text: TextSpan( children: [ TextSpan( text: "Sudah punya akun? ", style: GoogleFonts.poppins( color: Colors.black, fontSize: 14, ), ), TextSpan( text: "Login", style: GoogleFonts.poppins( color: dongker, fontWeight: FontWeight.bold, fontSize: 14, ), ), ], ), ), ), ), const SizedBox(height: 20), ], ), ), ), ), ); } }