E32221362_BeramalBaik/lib/pages/register_page.dart

204 lines
7.9 KiB
Dart

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<RegisterPage> {
final _formKey = GlobalKey<FormState>();
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<Widget> _buildCircleDecorations() {
final size = MediaQuery.of(context).size;
final List<Offset> 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),
);
}
}