import 'package:flutter/material.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class ResetPasswordScreen extends StatefulWidget { const ResetPasswordScreen({super.key}); @override State createState() => _ResetPasswordScreenState(); } class _ResetPasswordScreenState extends State { final _formKey = GlobalKey(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); bool _loading = false; bool _obscurePassword = true; bool _obscureConfirmPassword = true; final supabase = Supabase.instance.client; Future _resetPassword() async { if (!_formKey.currentState!.validate()) return; setState(() => _loading = true); try { // Update user's password await supabase.auth.updateUser( UserAttributes( password: _passwordController.text, ), ); if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Password berhasil diubah')), ); // Navigate to login screen Navigator.of(context).pushNamedAndRemoveUntil('/login', (route) => false); } catch (error) { if (!mounted) return; // Log the actual error for debugging (optional) print('Reset password error: $error'); // Show user-friendly message ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Gagal mengubah password. Password tidak boleh sama dengan password sebelumnya')), ); } finally { if (mounted) { setState(() => _loading = false); } } } @override void dispose() { _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Reset Password')), body: Padding( padding: const EdgeInsets.all(20), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( 'Buat password baru', style: Theme.of(context).textTheme.titleLarge, textAlign: TextAlign.center, ), const SizedBox(height: 30), TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: 'Password Baru', border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon(_obscurePassword ? Icons.visibility_off : Icons.visibility), onPressed: () => setState(() => _obscurePassword = !_obscurePassword), ), ), obscureText: _obscurePassword, validator: (val) { if (val == null || val.isEmpty) { return 'Password tidak boleh kosong'; } if (val.length < 6) { return 'Password minimal 6 karakter'; } return null; }, ), const SizedBox(height: 20), TextFormField( controller: _confirmPasswordController, decoration: InputDecoration( labelText: 'Konfirmasi Password', border: const OutlineInputBorder(), suffixIcon: IconButton( icon: Icon(_obscureConfirmPassword ? Icons.visibility_off : Icons.visibility), onPressed: () => setState(() => _obscureConfirmPassword = !_obscureConfirmPassword), ), ), obscureText: _obscureConfirmPassword, validator: (val) { if (val == null || val.isEmpty) { return 'Konfirmasi password tidak boleh kosong'; } if (val != _passwordController.text) { return 'Password tidak sama'; } return null; }, ), const SizedBox(height: 30), ElevatedButton( onPressed: _loading ? null : _resetPassword, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 15), ), child: _loading ? const CircularProgressIndicator(color: Colors.white) : const Text('Simpan Password Baru', style: TextStyle(fontSize: 16)), ), ], ), ), ), ); } }