187 lines
5.8 KiB
Dart
187 lines
5.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_svg/svg.dart';
|
|
import 'package:mobile_scanner/mobile_scanner.dart';
|
|
import 'package:seshat/ui/add_page/view_model/add_view_model.dart';
|
|
import 'package:seshat/ui/add_page/widgets/form_popup.dart';
|
|
import 'package:seshat/ui/add_page/widgets/owner_popup.dart';
|
|
import 'package:seshat/ui/add_page/widgets/price_popup.dart';
|
|
import 'package:seshat/ui/core/ui/navigation_bar.dart';
|
|
|
|
class AddPage extends StatefulWidget {
|
|
const AddPage({super.key, required this.viewModel});
|
|
|
|
final AddViewModel viewModel;
|
|
|
|
@override
|
|
State<AddPage> createState() => _AddPageState();
|
|
}
|
|
|
|
class _AddPageState extends State<AddPage> {
|
|
num? price;
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final MobileScannerController controller = MobileScannerController(
|
|
formats: [BarcodeFormat.ean13],
|
|
detectionTimeoutMs: 1000,
|
|
);
|
|
|
|
final theme = Theme.of(context);
|
|
// return Consumer<TabScreen>(
|
|
// builder: (context, screen, child) {
|
|
return Scaffold(
|
|
bottomNavigationBar: AppNavigationBar(startIndex: 1),
|
|
body: Stack(
|
|
children: [
|
|
ColoredBox(color: Colors.black),
|
|
MobileScanner(
|
|
controller: controller,
|
|
onDetect: (barcodes) async {
|
|
void setPrice(num newPrice) {
|
|
setState(() {
|
|
price = newPrice;
|
|
});
|
|
}
|
|
|
|
if (widget.viewModel.askPrice) {
|
|
await _priceDialogBuilder(context, setPrice, controller);
|
|
} else {
|
|
setPrice(0);
|
|
}
|
|
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text(
|
|
"Envoyé : ${barcodes.barcodes.first.rawValue} pour $price€",
|
|
),
|
|
behavior: SnackBarBehavior.floating,
|
|
),
|
|
);
|
|
debugPrint(price.toString());
|
|
},
|
|
),
|
|
SafeArea(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Center(
|
|
child: Card(
|
|
margin: EdgeInsets.symmetric(horizontal: 50),
|
|
child: Column(
|
|
children: [
|
|
ListenableBuilder(
|
|
listenable: widget.viewModel,
|
|
builder: (context, child) => ListTile(
|
|
leading: Icon(Icons.person),
|
|
title: TextButton(
|
|
child: Text(
|
|
(widget.viewModel.currentOwner == null)
|
|
? "Aucun"
|
|
: "${widget.viewModel.currentOwner!.firstName} ${widget.viewModel.currentOwner!.lastName}",
|
|
),
|
|
onPressed: () => _ownerDialogBuilder(
|
|
context,
|
|
controller,
|
|
widget.viewModel,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
ListTile(
|
|
leading: Icon(Icons.attach_money),
|
|
title: TextButton(
|
|
child: Text(
|
|
(widget.viewModel.askPrice)
|
|
? "Demander à chaque fois"
|
|
: "Prix libre toujours",
|
|
),
|
|
onPressed: () {
|
|
setState(() {
|
|
widget.viewModel.askPrice =
|
|
!widget.viewModel.askPrice;
|
|
});
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Expanded(child: SizedBox()),
|
|
SvgPicture.asset('assets/scan-overlay.svg'),
|
|
Expanded(child: SizedBox()),
|
|
TextButton(
|
|
style: ButtonStyle(
|
|
backgroundColor: WidgetStatePropertyAll(theme.cardColor),
|
|
),
|
|
onPressed: () =>
|
|
_formDialogBuilder(context, controller, widget.viewModel),
|
|
child: Text("Enregistrer manuellement"),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
// },
|
|
// );
|
|
}
|
|
}
|
|
|
|
Future<void> _priceDialogBuilder(
|
|
BuildContext context,
|
|
Function(num) setPrice,
|
|
MobileScannerController controller,
|
|
) {
|
|
controller.stop();
|
|
|
|
void exitPopup(BuildContext localContext) {
|
|
Navigator.of(localContext).pop();
|
|
controller.start();
|
|
}
|
|
|
|
return showDialog(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (context) => PricePopup(exitPopup: exitPopup, setPrice: setPrice),
|
|
);
|
|
}
|
|
|
|
Future<void> _formDialogBuilder(
|
|
BuildContext context,
|
|
MobileScannerController controller,
|
|
AddViewModel viewModel,
|
|
) {
|
|
controller.stop();
|
|
|
|
void exitPopup(BuildContext localContext) {
|
|
Navigator.of(localContext).pop();
|
|
controller.start();
|
|
}
|
|
|
|
return showDialog(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (context) => FormPopup(viewModel: viewModel, exitPopup: exitPopup),
|
|
);
|
|
}
|
|
|
|
Future<void> _ownerDialogBuilder(
|
|
BuildContext context,
|
|
MobileScannerController controller,
|
|
AddViewModel viewModel,
|
|
) {
|
|
controller.stop();
|
|
|
|
void onPressAccept(BuildContext localContext) {
|
|
Navigator.of(localContext).pop();
|
|
controller.start();
|
|
}
|
|
|
|
return showDialog(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (context) =>
|
|
OwnerPopup(viewModel: viewModel, onPressAccept: onPressAccept),
|
|
);
|
|
}
|