import 'package:flutter/material.dart'; import './tables.dart'; import '../layouts/main_layout.dart'; void main() { runApp(const RestaurantApp()); } class RestaurantApp extends StatelessWidget { const RestaurantApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Restaurant App', theme: ThemeData(primarySwatch: Colors.green), home: const LoginScreen(), ); } } class LoginScreen extends StatefulWidget { const LoginScreen({Key? key}) : super(key: key); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { // Static credentials for both Serveur and Admin static const String serveurEmail = 'serveur@restaurant.com'; static const String serveurPassword = 'serveur123'; static const String adminEmail = 'admin@restaurant.com'; static const String adminPassword = 'admin123'; final TextEditingController emailController = TextEditingController(); final TextEditingController passwordController = TextEditingController(); final GlobalKey _formKey = GlobalKey(); bool _isLoading = false; String? _errorMessage; @override void initState() { super.initState(); // Pre-fill with serveur email as shown in design emailController.text = 'serveur@restaurant.com'; } @override void dispose() { emailController.dispose(); passwordController.dispose(); super.dispose(); } void _login() async { if (!_formKey.currentState!.validate()) return; setState(() { _isLoading = true; _errorMessage = null; }); // Simulate network delay await Future.delayed(const Duration(seconds: 1)); setState(() { _isLoading = false; }); // Check credentials String email = emailController.text.trim(); String password = passwordController.text; if ((email == serveurEmail && password == serveurPassword) || (email == adminEmail && password == adminPassword)) { // Login successful - navigate to home/dashboard if (mounted) { String userType = email == adminEmail ? 'Admin' : 'Serveur'; Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const MainLayout( currentRoute: '/tables', child: TablesScreen(), ), ), ); } } else { // Login failed setState(() { _errorMessage = 'Email ou mot de passe incorrect'; }); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFFF5F5F5), // Light gray background body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Card( elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), child: Container( width: 400, padding: const EdgeInsets.all(40.0), child: Form( key: _formKey, child: Column( mainAxisSize: MainAxisSize.min, children: [ // Logo personnalisé Container( width: 80, height: 80, child: Image.asset( 'assets/logo_transparent.png', fit: BoxFit.contain, errorBuilder: (context, error, stackTrace) { // Fallback en cas d'erreur de chargement return Container( width: 64, height: 64, decoration: const BoxDecoration( color: Colors.green, shape: BoxShape.circle, ), child: const Icon( Icons.restaurant_menu, color: Colors.white, size: 32, ), ); }, ), ), const SizedBox(height: 24), // Title const Text( 'Restaurant App', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black87, ), ), const SizedBox(height: 8), // Subtitle const Text( 'Connectez-vous pour accéder au système de commandes', style: TextStyle(color: Colors.grey, fontSize: 14), textAlign: TextAlign.center, ), const SizedBox(height: 32), // Error message if (_errorMessage != null) Container( width: double.infinity, padding: const EdgeInsets.all(12), margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.red.shade50, border: Border.all(color: Colors.red.shade200), borderRadius: BorderRadius.circular(4), ), child: Text( _errorMessage!, style: TextStyle( color: Colors.red.shade600, fontSize: 14, ), textAlign: TextAlign.center, ), ), // Email label const Align( alignment: Alignment.centerLeft, child: Text( 'Email', style: TextStyle( fontSize: 14, color: Colors.black87, fontWeight: FontWeight.w500, ), ), ), const SizedBox(height: 8), // Email field TextFormField( controller: emailController, decoration: InputDecoration( prefixIcon: const Icon( Icons.email_outlined, color: Colors.grey, size: 20, ), hintText: 'serveur@restaurant.com', hintStyle: const TextStyle(color: Colors.grey), border: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: BorderSide(color: Colors.grey.shade300), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: BorderSide(color: Colors.grey.shade300), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: const BorderSide(color: Colors.green), ), contentPadding: const EdgeInsets.symmetric( horizontal: 12, vertical: 16, ), ), keyboardType: TextInputType.emailAddress, validator: (value) { if (value == null || value.isEmpty) { return 'Veuillez entrer votre email'; } return null; }, ), const SizedBox(height: 16), // Password label const Align( alignment: Alignment.centerLeft, child: Text( 'Mot de passe', style: TextStyle( fontSize: 14, color: Colors.black87, fontWeight: FontWeight.w500, ), ), ), const SizedBox(height: 8), // Password field TextFormField( controller: passwordController, decoration: InputDecoration( prefixIcon: const Icon( Icons.lock_outline, color: Colors.grey, size: 20, ), hintText: '••••••••', hintStyle: const TextStyle(color: Colors.grey), border: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: BorderSide(color: Colors.grey.shade300), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: BorderSide(color: Colors.grey.shade300), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(4), borderSide: const BorderSide(color: Colors.green), ), contentPadding: const EdgeInsets.symmetric( horizontal: 12, vertical: 16, ), ), obscureText: true, validator: (value) { if (value == null || value.isEmpty) { return 'Veuillez entrer votre mot de passe'; } return null; }, ), const SizedBox(height: 24), // Login button SizedBox( width: double.infinity, height: 48, child: ElevatedButton( onPressed: _isLoading ? null : _login, style: ElevatedButton.styleFrom( backgroundColor: Colors.green, foregroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(4), ), elevation: 0, ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: Colors.white, strokeWidth: 2, ), ) : const Text( 'Se connecter', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), ), ), const SizedBox(height: 24), // Demo accounts section Container( width: double.infinity, padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.grey.shade100, borderRadius: BorderRadius.circular(4), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Comptes de démonstration :', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Colors.black87, ), ), const SizedBox(height: 8), RichText( text: const TextSpan( style: TextStyle( fontSize: 13, color: Colors.grey, height: 1.4, ), children: [ TextSpan( text: 'Serveur : ', style: TextStyle(fontWeight: FontWeight.w500), ), TextSpan( text: 'serveur@restaurant.com / serveur123\n', ), TextSpan( text: 'Admin : ', style: TextStyle(fontWeight: FontWeight.w500), ), TextSpan( text: 'admin@restaurant.com / admin123', ), ], ), ), ], ), ), ], ), ), ), ), ), ), ); } } // Updated home screen to show user type class HomeScreen extends StatelessWidget { final String userType; const HomeScreen({Key? key, required this.userType}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Restaurant Dashboard - $userType'), backgroundColor: Colors.green, foregroundColor: Colors.white, automaticallyImplyLeading: false, actions: [ IconButton( icon: const Icon(Icons.logout), onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const LoginScreen()), ); }, ), ], ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.check_circle, color: Colors.green, size: 80), const SizedBox(height: 16), Text( 'Connexion réussie!', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: Colors.green, ), ), const SizedBox(height: 8), Text( 'Bienvenue $userType', style: TextStyle(fontSize: 18, color: Colors.grey), ), ], ), ), ); } }