import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'login_screen.dart'; class RegisterScreen extends StatefulWidget { const RegisterScreen({super.key}); @override State createState() => _RegisterScreenState(); } class _RegisterScreenState extends State { TextEditingController nameController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController passwordController = TextEditingController(); TextEditingController confirmPasswordController = TextEditingController(); bool _isLoading = false; bool _hidePassword = true; bool _hideConfirmPassword = true; String apiUrl = "http://192.168.100.9/kopikaocare_api/register.php"; Future register() async { if (nameController.text.isEmpty || emailController.text.isEmpty || passwordController.text.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Semua field harus diisi'), backgroundColor: Colors.orange, ), ); return; } if (passwordController.text != confirmPasswordController.text) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Password tidak sama'), backgroundColor: Colors.red, ), ); return; } setState(() => _isLoading = true); var response = await http.post( Uri.parse(apiUrl), body: { "name": nameController.text, "email": emailController.text, "password": passwordController.text }, ); var data = response.body.trim(); setState(() => _isLoading = false); if (data == "success") { final prefs = await SharedPreferences.getInstance(); await prefs.setString('name', nameController.text); await prefs.setString('email', emailController.text); showDialog( context: context, barrierDismissible: false, builder: (context) { return AlertDialog( backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), title: const Text( 'Berhasil!', style: TextStyle(color: Colors.green), ), content: const Text('Selamat anda berhasil mendaftar'), actions: [ TextButton( onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const LoginScreen(), ), ); }, child: const Text('OK'), ), ], ); }, ); } else { showDialog( context: context, builder: (context) { return AlertDialog( backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), title: const Text( 'Gagal', style: TextStyle(color: Colors.red), ), content: Text( 'Register gagal: ${data == "error" ? "Email sudah terdaftar" : "Coba lagi"}'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('OK'), ), ], ); }, ); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xfff8f9fa), appBar: AppBar( title: const Text( 'Create Account', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: Colors.transparent, foregroundColor: Colors.red, elevation: 0, ), body: SafeArea( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(24), child: Column( children: [ // Header Icon Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient( colors: [Colors.red.shade100, Colors.red.shade50], ), ), child: const Icon( Icons.person_add_alt_rounded, size: 60, color: Colors.red, ), ), const SizedBox(height: 20), const Text( 'Join Us Now!', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Color(0xff2d2d2d), ), ), const SizedBox(height: 8), Text( 'Create your account to get started', style: TextStyle( fontSize: 14, color: Colors.grey.shade600, ), ), const SizedBox(height: 40), // Form Fields Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( blurRadius: 10, color: Colors.black.withOpacity(0.05), offset: const Offset(0, 5), ), ], ), child: Column( children: [ // Name Field TextField( controller: nameController, style: const TextStyle(fontSize: 16), decoration: InputDecoration( hintText: 'Full Name', prefixIcon: const Icon(Icons.person_outline, color: Colors.red), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), Divider( height: 1, color: Colors.grey.shade200, ), // Email Field TextField( controller: emailController, style: const TextStyle(fontSize: 16), keyboardType: TextInputType.emailAddress, decoration: InputDecoration( hintText: 'Email Address', prefixIcon: const Icon(Icons.email_outlined, color: Colors.red), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), Divider( height: 1, color: Colors.grey.shade200, ), // Password Field TextField( controller: passwordController, obscureText: _hidePassword, style: const TextStyle(fontSize: 16), decoration: InputDecoration( hintText: 'Password', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( _hidePassword ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () { setState(() { _hidePassword = !_hidePassword; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), Divider( height: 1, color: Colors.grey.shade200, ), // Confirm Password Field TextField( controller: confirmPasswordController, obscureText: _hideConfirmPassword, style: const TextStyle(fontSize: 16), decoration: InputDecoration( hintText: 'Confirm Password', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( _hideConfirmPassword ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () { setState(() { _hideConfirmPassword = !_hideConfirmPassword; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(20), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.white, contentPadding: const EdgeInsets.symmetric(vertical: 18), ), ), ], ), ), const SizedBox(height: 30), // Register Button SizedBox( width: double.infinity, height: 55, child: ElevatedButton( onPressed: _isLoading ? null : register, style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Colors.white, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( 'Sign Up', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, letterSpacing: 1, ), ), ), ), const SizedBox(height: 20), // Login Link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Already have an account? ", style: TextStyle(color: Colors.grey.shade600), ), GestureDetector( onTap: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const LoginScreen(), ), ); }, child: const Text( 'Sign In', style: TextStyle( color: Colors.red, fontWeight: FontWeight.bold, ), ), ), ], ), ], ), ), ), ), ); } }