import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import '../config/app_config.dart'; import '../providers/auth_provider.dart'; import '../theme/app_theme.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _usernameCtrl = TextEditingController(); final _secretCtrl = TextEditingController(); bool _obscure = true; @override void dispose() { _usernameCtrl.dispose(); _secretCtrl.dispose(); super.dispose(); } Future _submit() async { if (!_formKey.currentState!.validate()) return; final auth = context.read(); final ok = await auth.login( _usernameCtrl.text.trim(), _secretCtrl.text.trim(), ); if (ok && mounted) { context.go('/dashboard'); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppTheme.sidebarBg, body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 420), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // ── Logo ─────────────────────────────────────────────── Container( width: 72, height: 72, decoration: BoxDecoration( color: AppTheme.primary, borderRadius: BorderRadius.circular(20), ), child: const Icon( Icons.radio_rounded, color: Colors.white, size: 38, ), ), const SizedBox(height: 16), const Text( 'NEDA', style: TextStyle( color: Colors.white, fontSize: 32, fontWeight: FontWeight.w800, letterSpacing: 3, ), ), const SizedBox(height: 6), const Text( 'پنل مدیریت سیستم', style: TextStyle( color: AppTheme.sidebarText, fontSize: 14, ), ), const SizedBox(height: 40), // ── Card ─────────────────────────────────────────────── Container( padding: const EdgeInsets.all(28), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.2), blurRadius: 40, offset: const Offset(0, 8), ), ], ), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Text( 'ورود به حساب', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w700, color: AppTheme.textPrimary, ), ), const SizedBox(height: 4), const Text( 'اطلاعات مدیر سیستم را وارد کنید', style: TextStyle( fontSize: 13, color: AppTheme.textSecondary, ), ), const SizedBox(height: 24), // Username field TextFormField( controller: _usernameCtrl, textDirection: TextDirection.ltr, decoration: const InputDecoration( labelText: 'نام کاربری', prefixIcon: Icon(Icons.person_outline_rounded), ), validator: (v) => (v == null || v.trim().isEmpty) ? 'نام کاربری الزامی است' : null, textInputAction: TextInputAction.next, ), const SizedBox(height: 16), // Secret field TextFormField( controller: _secretCtrl, obscureText: _obscure, textDirection: TextDirection.ltr, decoration: InputDecoration( labelText: 'رمز عبور', prefixIcon: const Icon(Icons.lock_outline_rounded), suffixIcon: IconButton( icon: Icon( _obscure ? Icons.visibility_off_outlined : Icons.visibility_outlined, ), onPressed: () => setState(() => _obscure = !_obscure), ), ), validator: (v) => (v == null || v.trim().isEmpty) ? 'رمز عبور الزامی است' : null, onFieldSubmitted: (_) => _submit(), ), const SizedBox(height: 8), // Error message Consumer( builder: (_, auth, __) { if (auth.error == null) return const SizedBox.shrink(); return Padding( padding: const EdgeInsets.only(top: 8), child: Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 10), decoration: BoxDecoration( color: AppTheme.danger.withValues(alpha: 0.08), borderRadius: BorderRadius.circular(8), border: Border.all( color: AppTheme.danger.withValues(alpha: 0.3)), ), child: Row( children: [ const Icon(Icons.error_outline_rounded, color: AppTheme.danger, size: 16), const SizedBox(width: 8), Expanded( child: Text( auth.error!, style: const TextStyle( color: AppTheme.danger, fontSize: 13, ), ), ), ], ), ), ); }, ), const SizedBox(height: 24), // Login button Consumer( builder: (_, auth, __) => SizedBox( height: 48, child: ElevatedButton( onPressed: auth.status == AuthStatus.loading ? null : _submit, child: auth.status == AuthStatus.loading ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator( color: Colors.white, strokeWidth: 2, ), ) : const Text('ورود'), ), ), ), ], ), ), ), // ── Debug hint ───────────────────────────────────────── if (AppConfig.debugMode) ...[ const SizedBox(height: 20), Container( padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 10), decoration: BoxDecoration( color: AppTheme.warning.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(10), border: Border.all( color: AppTheme.warning.withValues(alpha: 0.3)), ), child: const Column( children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.bug_report_rounded, size: 14, color: AppTheme.warning), SizedBox(width: 6), Text( 'حالت آزمایشی فعال', style: TextStyle( color: AppTheme.warning, fontSize: 12, fontWeight: FontWeight.w600, ), ), ], ), SizedBox(height: 4), Text( 'نام کاربری: ${AppConfig.mockAdminUsername} | رمز: ${AppConfig.mockAdminSecret}', style: TextStyle( color: AppTheme.sidebarText, fontSize: 11, ), ), ], ), ), ], ], ), ), ), ), ); } }