import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:qyuota/config/colors.dart'; import 'package:qyuota/services/auth_service.dart'; class ChangePasswordScreen extends StatefulWidget { const ChangePasswordScreen({Key? key}) : super(key: key); @override State createState() => _ChangePasswordScreenState(); } class _ChangePasswordScreenState extends State { final _formKey = GlobalKey(); final _currentPasswordController = TextEditingController(); final _newPasswordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _isLoading = false; bool _obscureCurrentPassword = true; bool _obscureNewPassword = true; bool _obscureConfirmPassword = true; @override void dispose() { _currentPasswordController.dispose(); _newPasswordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } Future _changePassword() async { if (_formKey.currentState!.validate()) { setState(() { _isLoading = true; }); try { await AuthService().changePassword( currentPassword: _currentPasswordController.text, newPassword: _newPasswordController.text, confirmPassword: _confirmPasswordController.text, ); Get.back(); Get.snackbar( 'Berhasil', 'Password berhasil diubah', backgroundColor: Colors.green, colorText: Colors.white, ); } catch (e) { Get.snackbar( 'Error', e.toString(), backgroundColor: Colors.red, colorText: Colors.white, ); } finally { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Change Password'), backgroundColor: ConstColors.primaryColor, foregroundColor: Colors.white, ), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 20), TextFormField( controller: _currentPasswordController, obscureText: _obscureCurrentPassword, decoration: InputDecoration( labelText: 'Current Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), suffixIcon: IconButton( icon: Icon( _obscureCurrentPassword ? Icons.visibility_off : Icons.visibility, ), onPressed: () { setState(() { _obscureCurrentPassword = !_obscureCurrentPassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter your current password'; } return null; }, ), const SizedBox(height: 20), TextFormField( controller: _newPasswordController, obscureText: _obscureNewPassword, decoration: InputDecoration( labelText: 'New Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), suffixIcon: IconButton( icon: Icon( _obscureNewPassword ? Icons.visibility_off : Icons.visibility, ), onPressed: () { setState(() { _obscureNewPassword = !_obscureNewPassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter a new password'; } if (value.length < 6) { return 'Password must be at least 6 characters'; } return null; }, ), const SizedBox(height: 20), TextFormField( controller: _confirmPasswordController, obscureText: _obscureConfirmPassword, decoration: InputDecoration( labelText: 'Confirm New Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword ? Icons.visibility_off : Icons.visibility, ), onPressed: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, ), ), validator: (value) { if (value == null || value.isEmpty) { return 'Please confirm your new password'; } if (value != _newPasswordController.text) { return 'Passwords do not match'; } return null; }, ), const SizedBox(height: 30), ElevatedButton( onPressed: _isLoading ? null : _changePassword, style: ElevatedButton.styleFrom( backgroundColor: ConstColors.primaryColor, padding: const EdgeInsets.symmetric(vertical: 15), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: _isLoading ? const CircularProgressIndicator(color: Colors.white) : const Text( 'Change Password', style: TextStyle( fontSize: 16, color: Colors.white, ), ), ), ], ), ), ), ); } }