import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; class RegisterScreen extends StatefulWidget { const RegisterScreen({Key? key}) : super(key: key); @override State createState() => _RegisterScreenState(); } class _RegisterScreenState extends State { final TextEditingController _nameController = TextEditingController(); final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); final TextEditingController _confirmPasswordController = TextEditingController(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; bool _isLoading = false; Future _register() async { setState(() { _isLoading = true; }); final url = Uri.parse('http://localhost:8000/api/register'); // Ganti jika base URL berbeda try { final response = await http.post( url, headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'name': _nameController.text.trim(), 'email': _emailController.text.trim(), 'password': _passwordController.text, 'password_confirmation': _confirmPasswordController.text, 'role': 'karyawan', }), ); final data = jsonDecode(response.body); if (response.statusCode == 201) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(data['message'] ?? 'Registrasi berhasil.')), ); await Future.delayed(const Duration(milliseconds: 500)); if (mounted) Navigator.pop(context); } else { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(data['message'] ?? 'Registrasi gagal.')), ); } } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Terjadi kesalahan. Coba lagi nanti.')), ); } finally { if (mounted) { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 32.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 24), Image.asset( 'assets/logom.png', height: 80, fit: BoxFit.contain, ), const SizedBox(height: 12), const Text( 'Buat akun baru Anda', style: TextStyle(fontSize: 16, color: Colors.black54), textAlign: TextAlign.center, ), const SizedBox(height: 32), Align( alignment: Alignment.centerLeft, child: Text( 'Nama Lengkap', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), ), const SizedBox(height: 8), TextField( controller: _nameController, decoration: InputDecoration( prefixIcon: Icon(Icons.person_outline), hintText: 'Masukkan nama lengkap Anda', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), ), const SizedBox(height: 20), Align( alignment: Alignment.centerLeft, child: Text( 'Email', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), ), const SizedBox(height: 8), TextField( controller: _emailController, decoration: InputDecoration( prefixIcon: Icon(Icons.email_outlined), hintText: 'Masukkan email Anda', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), keyboardType: TextInputType.emailAddress, ), const SizedBox(height: 20), Align( alignment: Alignment.centerLeft, child: Text( 'Password', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), ), const SizedBox(height: 8), TextField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( prefixIcon: Icon(Icons.lock_outline), hintText: 'Buat password Anda', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), ), const SizedBox(height: 20), Align( alignment: Alignment.centerLeft, child: Text( 'Konfirmasi Password', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), ), const SizedBox(height: 8), TextField( controller: _confirmPasswordController, obscureText: _obscureConfirmPassword, decoration: InputDecoration( prefixIcon: Icon(Icons.lock_outline), hintText: 'Konfirmasi password Anda', border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword ? Icons.visibility_off : Icons.visibility, ), onPressed: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, ), ), ), const SizedBox(height: 28), SizedBox( height: 48, child: ElevatedButton( onPressed: _isLoading ? null : _register, style: ElevatedButton.styleFrom( backgroundColor: Colors.blue, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: _isLoading ? const SizedBox( width: 24, height: 24, child: CircularProgressIndicator( color: Colors.white, strokeWidth: 2, ), ) : const Text( 'Daftar', style: TextStyle( fontSize: 18, color: Colors.white, ), ), ), ), const SizedBox(height: 24), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Sudah punya akun? '), GestureDetector( onTap: () { Navigator.pop(context); }, child: const Text( 'Sign in', style: TextStyle( color: Colors.blue, fontWeight: FontWeight.bold, ), ), ), ], ), ], ), ), ), ), ); } }