import 'package:flutter/material.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:tugas_akhir_supabase/screens/auth/reset_password_otp_screen.dart'; class ForgotPasswordScreen extends StatefulWidget { const ForgotPasswordScreen({super.key}); @override State createState() => _ForgotPasswordScreenState(); } class _ForgotPasswordScreenState extends State { final _emailController = TextEditingController(); final _formKey = GlobalKey(); bool _loading = false; final supabase = Supabase.instance.client; final Color primaryColor = const Color(0xFF056839); Future _sendResetEmail() async { if (!_formKey.currentState!.validate()) return; setState(() => _loading = true); try { // Check if email exists in the database final String emailToSearch = _emailController.text.trim(); final List userCheck = await supabase .from('profiles') .select('user_id') .ilike('email', emailToSearch) // Using ilike for case-insensitive search .limit(1); if (!mounted) return; if (userCheck.isEmpty) { // Email does not exist ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Email tidak terdaftar. Mohon periksa kembali email yang Anda masukkan.', style: const TextStyle(color: Colors.white)), backgroundColor: Colors.redAccent, behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), ), ); return; // Stop the process } // Email exists, proceed to OTP screen Navigator.of(context).push( MaterialPageRoute( builder: (context) => ResetPasswordOtpScreen( email: _emailController.text.trim(), ), ), ); } catch (error) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Gagal memproses permintaan. Silakan coba lagi nanti.', style: const TextStyle(color: Colors.white)), backgroundColor: Colors.redAccent, behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), ), ); } finally { if (mounted) { setState(() => _loading = false); } } } @override void dispose() { _emailController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Scaffold( backgroundColor: Colors.grey[100], // Light background for contrast appBar: AppBar( title: const Text( 'Lupa Password', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), ), backgroundColor: primaryColor, elevation: 0, iconTheme: const IconThemeData(color: Colors.white), ), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Image.asset( 'assets/images/logo.png', height: 120, ), const SizedBox(height: 32), Text( 'Ubah Password Anda', // This was changed by user textAlign: TextAlign.center, style: theme.textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, color: Colors.black87, ), ), const SizedBox(height: 12), Text( 'Masukkan alamat email yang terhubung dengan akun Anda untuk melanjutkan.', textAlign: TextAlign.center, style: theme.textTheme.bodyMedium?.copyWith(color: Colors.black54), ), const SizedBox(height: 32), TextFormField( controller: _emailController, decoration: InputDecoration( hintText: 'Email Anda', prefixIcon: Icon(Icons.email_outlined, color: primaryColor), filled: true, fillColor: Colors.white, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: primaryColor, width: 2), ), contentPadding: const EdgeInsets.symmetric(vertical: 16, horizontal: 20), ), keyboardType: TextInputType.emailAddress, validator: (val) { if (val == null || val.isEmpty) return 'Email tidak boleh kosong'; if (!RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(val)) { return 'Masukkan alamat email yang valid'; } return null; }, style: const TextStyle(color: Colors.black87), ), const SizedBox(height: 24), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: primaryColor, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), elevation: 2, ), onPressed: _loading ? null : _sendResetEmail, child: _loading ? const SizedBox( height: 24, width: 24, child: CircularProgressIndicator( color: Colors.white, strokeWidth: 3, ), ) : const Text( 'Lanjutkan', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.white, ), ), ), ], ), ), ), ); } }