MIF_E31222656/lib/screens/auth/reset_password_screen.dart

141 lines
4.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class ResetPasswordScreen extends StatefulWidget {
const ResetPasswordScreen({super.key});
@override
State<ResetPasswordScreen> createState() => _ResetPasswordScreenState();
}
class _ResetPasswordScreenState extends State<ResetPasswordScreen> {
final _formKey = GlobalKey<FormState>();
final _passwordController = TextEditingController();
final _confirmPasswordController = TextEditingController();
bool _loading = false;
bool _obscurePassword = true;
bool _obscureConfirmPassword = true;
final supabase = Supabase.instance.client;
Future<void> _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)),
),
],
),
),
),
);
}
}