MIF_E31222381/AdmindukPuger_mobile-master/lib/screen/Auth/register.dart

404 lines
14 KiB
Dart

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<RegisterScreen> {
bool _obscureText = true;
bool _obscureConfirmText = true;
final _formKey = GlobalKey<FormState>();
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<AuthCubit>().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<AuthCubit, AuthState>(
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<AuthCubit, AuthState>(
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),
],
),
),
),
),
);
}
}