import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:fooder/screens/based.dart'; import 'package:fooder/models/product.dart'; import 'package:fooder/models/entry.dart'; import 'package:fooder/widgets/product.dart'; import 'package:fooder/screens/add_product.dart'; import 'package:fooder/components/text.dart'; import 'package:fooder/components/floating_action_button.dart'; import 'package:simple_barcode_scanner/simple_barcode_scanner.dart'; class EditEntryScreen extends BasedScreen { final Entry entry; const EditEntryScreen({super.key, required super.ctx, required this.entry}); @override State createState() => _EditEntryScreen(); } class _EditEntryScreen extends BasedState { final gramsController = TextEditingController(); final productNameController = TextEditingController(); List products = []; Entry get entry => widget.entry; @override void dispose() { gramsController.dispose(); productNameController.dispose(); super.dispose(); } void popMeDaddy() { Navigator.pop(context); } @override void initState() { super.initState(); setState(() { gramsController.text = entry.grams.toString(); productNameController.text = entry.product.name; products = [entry.product]; }); } Future getProducts() async { var products = await client.product.list(productNameController.text); setState(() { this.products = products; }); } Future saveEntry() async { if (products.length != 1) { showError("Pick product first"); return; } var grams = await parseDouble(gramsController.text, "Grams"); if (grams == null) { return; } await client.entry.update( entry.id, grams: grams, productId: products[0].id, mealId: entry.mealId, ); popMeDaddy(); } Future deleteEntry() async { await client.entry.delete(widget.entry.id); popMeDaddy(); } Future findProductByBarCode() async { var res = await Navigator.push( context, MaterialPageRoute( builder: (context) => const SimpleBarcodeScannerPage(), ), ); if (res is String) { try { var product = await client.product.getByBarcode(res); setState(() { products = [product]; productNameController.text = product.name; }); } catch (e) { showError("Product not found"); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: appBar(), body: Center( child: Container( constraints: const BoxConstraints(maxWidth: 720), padding: const EdgeInsets.all(10), child: ListView(children: [ FTextInput( labelText: 'Product name', controller: productNameController, onChanged: (_) => getProducts(), autofocus: true, ), FTextInput( labelText: 'Grams', keyboardType: const TextInputType.numberWithOptions(decimal: true), inputFormatters: [ FilteringTextInputFormatter.allow( RegExp(r'^(\d+)?[\.,]?\d{0,2}')), ], controller: gramsController, ), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => AddProductScreen( ctx: ctx, ), ), ).then((product) { if (product == null) { return; } setState(() { products = [product]; productNameController.text = product.name; }); }); }, child: const Text("Don't see your product? Add it!"), ), for (var product in products) ListTile( onTap: () { setState(() { products = [product]; productNameController.text = product.name; }); }, title: ProductWidget( product: product, ), ), ])), ), floatingActionButton: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ FActionButton( onPressed: findProductByBarCode, icon: Icons.photo_camera, ), const SizedBox(width: 10), FActionButton( onPressed: deleteEntry, tag: "fap1", icon: Icons.delete, ), const SizedBox(width: 10), FActionButton( onPressed: saveEntry, tag: "fap2", icon: Icons.save, ), ], ), ); } }