import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import '../services/auth_service.dart'; class RegisterPage extends StatefulWidget { const RegisterPage({super.key}); @override _RegisterPageState createState() => _RegisterPageState(); } class _RegisterPageState extends State { final _formKey = GlobalKey(); final _authService = AuthService(); String username = ''; String password = ''; String errorMessage = ''; bool _obscurePassword = true; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.green[700], title: const Text('REGISTER'), centerTitle: true, ), body: Stack( children: [ ..._buildCircleDecorations(), SingleChildScrollView( padding: const EdgeInsets.all(24), child: Center( child: Column( children: [ const SizedBox(height: 40), const Icon(Icons.person_add_alt_1_outlined, size: 80, color: Colors.green), const SizedBox(height: 12), const Text( 'Buat Akun Baru', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.green, ), ), const SizedBox(height: 32), Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: Colors.white.withOpacity(0.95), borderRadius: BorderRadius.circular(20), boxShadow: const [ BoxShadow( color: Colors.black12, blurRadius: 8, offset: Offset(0, 4), ), ], ), child: Form( key: _formKey, child: Column( children: [ TextFormField( decoration: const InputDecoration( labelText: 'Username', border: OutlineInputBorder(), ), onChanged: (val) => username = val.trim(), validator: (val) => val == null || val.isEmpty ? 'Masukkan username' : null, ), const SizedBox(height: 16), TextFormField( decoration: InputDecoration( labelText: 'Password', border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: Colors.green, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), obscureText: _obscurePassword, onChanged: (val) => password = val.trim(), validator: (val) { if (val == null || val.isEmpty) { return 'Masukkan password'; } if (val.length < 6) { return 'Password minimal 6 karakter'; } return null; }, ), const SizedBox(height: 24), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.green[700], foregroundColor: Colors.white, minimumSize: const Size(double.infinity, 48), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: const Text('Register'), onPressed: () async { if (_formKey.currentState!.validate()) { String? result = await _authService.register( username, password); if (result == null) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text( 'Register berhasil! Silakan login.')), ); Navigator.pushReplacementNamed( context, '/login'); } } else { setState(() => errorMessage = result); } } }, ), const SizedBox(height: 12), RichText( text: TextSpan( text: 'Sudah punya akun? ', style: const TextStyle(color: Colors.black), children: [ TextSpan( text: 'Login', style: const TextStyle( color: Colors.green, fontWeight: FontWeight.bold, decoration: TextDecoration.underline, ), recognizer: TapGestureRecognizer() ..onTap = () { Navigator.pop(context); }, ), ], ), ), if (errorMessage.isNotEmpty) ...[ const SizedBox(height: 20), Text(errorMessage, style: const TextStyle(color: Colors.red)), ], ], ), ), ), ], ), ), ), ], ), ); } List _buildCircleDecorations() { final size = MediaQuery.of(context).size; final List positions = List.generate( 40, (index) => Offset( (index * 50 + 30) % size.width, (index * 80 + 70) % size.height, ), ); return positions .map((pos) => Positioned( top: pos.dy, left: pos.dx, child: _circle(24, Colors.green.shade100.withOpacity(0.3)), )) .toList(); } Widget _circle(double size, Color color) { return Container( width: size, height: size, decoration: BoxDecoration(color: color, shape: BoxShape.circle), ); } }