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.
 
 
 
 
 
 

184 lines
6.1 KiB

// widgets/commande_directe_dialog.dart
import 'package:flutter/material.dart';
import 'package:itrimobe/services/restaurant_api_service.dart';
class CommandeDirecteDialog extends StatefulWidget {
final VoidCallback onCommandeCreated;
const CommandeDirecteDialog({super.key, required this.onCommandeCreated});
@override
_CommandeDirecteDialogState createState() => _CommandeDirecteDialogState();
}
class _CommandeDirecteDialogState extends State<CommandeDirecteDialog> {
final _formKey = GlobalKey<FormState>();
final _tableController = TextEditingController();
final _personnesController = TextEditingController(text: '1');
final _totalController = TextEditingController();
bool _isLoading = false;
Future<void> _creerCommande() async {
if (!_formKey.currentState!.validate()) return;
setState(() => _isLoading = true);
final commandeData = {
'table_number': int.parse(_tableController.text),
'persons': int.parse(_personnesController.text),
'total': double.parse(_totalController.text),
'time': TimeOfDay.now().format(context),
'date': DateTime.now().toString().split(' ')[0],
'is_direct': true,
};
final success = await RestaurantApiService.creerCommandeDirecte(
commandeData,
);
setState(() => _isLoading = false);
if (success) {
widget.onCommandeCreated();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Commande directe créée avec succès'),
backgroundColor: Colors.green,
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Erreur lors de la création'),
backgroundColor: Colors.red,
),
);
}
}
@override
Widget build(BuildContext context) {
return Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
child: Container(
padding: EdgeInsets.all(24),
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.add_shopping_cart, color: Color(0xFF007BFF)),
SizedBox(width: 12),
Text(
'Nouvelle Commande Directe',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 24),
TextFormField(
controller: _tableController,
decoration: InputDecoration(
labelText: 'Numéro de table',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
prefixIcon: Icon(Icons.table_restaurant),
),
keyboardType: TextInputType.number,
validator: (value) {
if (value?.isEmpty ?? true) return 'Numéro de table requis';
if (int.tryParse(value!) == null) return 'Numéro invalide';
return null;
},
),
SizedBox(height: 16),
TextFormField(
controller: _personnesController,
decoration: InputDecoration(
labelText: 'Nombre de personnes',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
prefixIcon: Icon(Icons.people),
),
keyboardType: TextInputType.number,
validator: (value) {
if (value?.isEmpty ?? true)
return 'Nombre de personnes requis';
if (int.tryParse(value!) == null) return 'Nombre invalide';
return null;
},
),
SizedBox(height: 16),
TextFormField(
controller: _totalController,
decoration: InputDecoration(
labelText: 'Total (MGA)',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
prefixIcon: Icon(Icons.euro),
),
keyboardType: TextInputType.numberWithOptions(decimal: true),
validator: (value) {
if (value?.isEmpty ?? true) return 'Total requis';
if (double.tryParse(value!) == null)
return 'Montant invalide';
return null;
},
),
SizedBox(height: 24),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
onPressed: _isLoading ? null : () => Navigator.pop(context),
child: Text('Annuler'),
),
SizedBox(width: 12),
ElevatedButton(
onPressed: _isLoading ? null : _creerCommande,
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFF28A745),
foregroundColor: Colors.white,
padding: EdgeInsets.symmetric(
horizontal: 24,
vertical: 12,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child:
_isLoading
? SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(
strokeWidth: 2,
color: Colors.white,
),
)
: Text('Créer'),
),
],
),
],
),
),
),
);
}
}