404 lines
14 KiB
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),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|