You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
16 KiB
435 lines
16 KiB
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<LoginScreen> createState() => _LoginScreenState();
|
|
}
|
|
|
|
class _LoginScreenState extends State<LoginScreen> {
|
|
// 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<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
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: [
|
|
const Icon(Icons.check_circle, color: Colors.green, size: 80),
|
|
const SizedBox(height: 16),
|
|
const Text(
|
|
'Connexion réussie!',
|
|
style: TextStyle(
|
|
fontSize: 24,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.green,
|
|
),
|
|
),
|
|
const SizedBox(height: 8),
|
|
Text(
|
|
'Bienvenue $userType',
|
|
style: const TextStyle(fontSize: 18, color: Colors.grey),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|