import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../cubit/auth_cubit.dart'; import '../cubit/auth_state.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { // English: Form key to manage state and invoke validation. // Arabic: مفتاح النموذج لإدارة الحالة واستدعاء التحقق من الصحة. final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _isPasswordVisible = false; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { // English: We use a dark, premium theme with purple/blue gradients. // Arabic: نحن نستخدم سمة داكنة ومميزة مع تدرجات أرجوانية وزرقاء. return Scaffold( body: Container( decoration: const BoxDecoration( gradient: LinearGradient( colors: [Color(0xFF0F0C20), Color(0xFF15102A), Color(0xFF0A0814)], begin: Alignment.topCenter, end: Alignment.bottomCenter, ), ), child: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 24.0), child: Form( key: _formKey, child: BlocConsumer( listener: (context, state) { if (state is AuthFailure) { // English: Show failure message as SnackBar when state is AuthFailure. // Arabic: عرض رسالة الفشل كشريط وجبة خفيفة عندما تكون الحالة فشل المصادقة. ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( state.errorMessage, style: const TextStyle(color: Colors.white, fontFamily: 'Outfit'), ), backgroundColor: Colors.redAccent, behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ); } }, builder: (context, state) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // English: Logo placeholder with dynamic design. // Arabic: رمز شعار تجريبي بتصميم ديناميكي. Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( shape: BoxShape.circle, color: Colors.deepPurple.withOpacity(0.2), ), child: const Icon( Icons.security, size: 64, color: Colors.purpleAccent, ), ), const SizedBox(height: 24), const Text( 'نـبـيـه', style: TextStyle( fontSize: 36, fontWeight: FontWeight.bold, color: Colors.white, letterSpacing: 2, ), ), const SizedBox(height: 8), Text( 'تسجيل الدخول للمشرفين والعملاء', style: TextStyle( fontSize: 14, color: Colors.white.withOpacity(0.6), ), ), const SizedBox(height: 40), // English: Email text input with custom borders and icons. // Arabic: إدخال نص البريد الإلكتروني مع حدود وأيقونات مخصصة. TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: 'البريد الإلكتروني', labelStyle: TextStyle(color: Colors.white.withOpacity(0.6)), prefixIcon: const Icon(Icons.email_outlined, color: Colors.purpleAccent), filled: true, fillColor: Colors.white.withOpacity(0.05), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: Colors.white.withOpacity(0.1)), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: const BorderSide(color: Colors.purpleAccent, width: 2), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), ), validator: (value) { if (value == null || value.trim().isEmpty) { return 'الرجاء إدخال البريد الإلكتروني'; } if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) { return 'الرجاء إدخال بريد إلكتروني صالح'; } return null; }, ), const SizedBox(height: 20), // English: Password text input with visibility toggle. // Arabic: إدخال نص كلمة المرور مع إمكانية التبديل بين إظهارها وإخفائها. TextFormField( controller: _passwordController, obscureText: !_isPasswordVisible, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: 'كلمة المرور', labelStyle: TextStyle(color: Colors.white.withOpacity(0.6)), prefixIcon: const Icon(Icons.lock_outline, color: Colors.purpleAccent), suffixIcon: IconButton( icon: Icon( _isPasswordVisible ? Icons.visibility : Icons.visibility_off, color: Colors.white.withOpacity(0.6), ), onPressed: () { setState(() { _isPasswordVisible = !_isPasswordVisible; }); }, ), filled: true, fillColor: Colors.white.withOpacity(0.05), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: Colors.white.withOpacity(0.1)), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: const BorderSide(color: Colors.purpleAccent, width: 2), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), ), validator: (value) { if (value == null || value.isEmpty) { return 'الرجاء إدخال كلمة المرور'; } return null; }, ), const SizedBox(height: 40), // English: Submit button. Shows progress bar during login request. // Arabic: زر الإرسال. يعرض شريط تقدم تحميل البيانات أثناء المصادقة. if (state is AuthLoading) const CircularProgressIndicator(color: Colors.purpleAccent) else GestureDetector( onTap: () { if (_formKey.currentState!.validate()) { // English: Dispatch login method to AuthCubit. // Arabic: استدعاء دالة تسجيل الدخول إلى الكيوبيت. context.read().login( _emailController.text.trim(), _passwordController.text, ); } }, child: Container( width: double.infinity, height: 56, decoration: BoxDecoration( gradient: const LinearGradient( colors: [Colors.purpleAccent, Colors.deepPurpleAccent], begin: Alignment.centerLeft, end: Alignment.centerRight, ), borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.purpleAccent.withOpacity(0.3), blurRadius: 12, offset: const Offset(0, 4), ) ], ), child: const Center( child: Text( 'تسجيل الدخول', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ), ], ); }, ), ), ), ), ), ), ); } }