From 385d962092d8e3c656386ddaccabd5a0136fb78f Mon Sep 17 00:00:00 2001 From: Mikkel Troels Kongsted Date: Tue, 11 Feb 2025 12:56:52 +0100 Subject: [PATCH] scan products --- .../android/app/src/main/AndroidManifest.xml | 1 + mobile/lib/pages/cart_page.dart | 68 ++++++++++++++++++- mobile/lib/repos/product.dart | 20 +++++- mobile/pubspec.lock | 24 +++++++ mobile/pubspec.yaml | 1 + 5 files changed, 112 insertions(+), 2 deletions(-) diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index ef5beb7..a82bc28 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -42,4 +42,5 @@ + diff --git a/mobile/lib/pages/cart_page.dart b/mobile/lib/pages/cart_page.dart index 0e1647d..a5dcedc 100644 --- a/mobile/lib/pages/cart_page.dart +++ b/mobile/lib/pages/cart_page.dart @@ -1,6 +1,11 @@ +import 'package:barcode_scan2/model/android_options.dart'; +import 'package:barcode_scan2/model/scan_options.dart'; +import 'package:barcode_scan2/platform_wrapper.dart'; import 'package:flutter/material.dart'; import 'package:mobile/pages/finish_shopping_page.dart'; import 'package:mobile/repos/cart.dart'; +import 'package:mobile/repos/product.dart'; +import 'package:mobile/results.dart'; import 'package:mobile/widgets/primary_button.dart'; import 'package:mobile/widgets/primary_card.dart'; import 'package:provider/provider.dart'; @@ -181,7 +186,68 @@ class CartPage extends StatelessWidget { child: Container( margin: const EdgeInsets.only(left: 10), child: PrimaryButton( - onPressed: () {}, child: const Text("Skan vare")), + onPressed: () async { + final result = await BarcodeScanner.scan( + options: const ScanOptions( + android: AndroidOptions( + appBarTitle: "Skan varer"), + strings: { + "cancel": "Annullér", + "flash_on": "Lommelygte til", + "flash_off": "Lommelygte fra" + })); + switch (result.type.name) { + case "Cancelled": + final snackBar = const SnackBar( + content: + Text("Skanning af varer annulleret")); + if (context.mounted) { + ScaffoldMessenger.of(context) + .showSnackBar(snackBar); + } + case "Barcode": + if (!context.mounted) { + return; + } + final CartRepo cartRepo = + context.read(); + final ProductRepo productRepo = + context.read(); + final productResult = productRepo + .productWithBarcode(result.rawContent); + switch (productResult) { + case Ok(): + { + cartRepo.addToCart(productResult.value); + final snackBar = SnackBar( + content: Text( + "Tilføjet ${productResult.value.name} til indkøbskurven")); + ScaffoldMessenger.of(context) + .showSnackBar(snackBar); + } + case Err(): + final snackBar = const SnackBar( + content: Text( + "Varen du prøver at tilføje eksistere ikke")); + ScaffoldMessenger.of(context) + .showSnackBar(snackBar); + } + + case "Error": + if (!context.mounted) { + return; + } + final snackBar = const SnackBar( + content: + Text("Der skete en fejl, prøv igen")); + ScaffoldMessenger.of(context) + .showSnackBar(snackBar); + + default: + throw Exception("Unreachable"); + } + }, + child: const Text("Skan vare")), ), ), ], diff --git a/mobile/lib/repos/product.dart b/mobile/lib/repos/product.dart index 0e93ee8..ad958cd 100644 --- a/mobile/lib/repos/product.dart +++ b/mobile/lib/repos/product.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mobile/results.dart'; class ProductRepo extends ChangeNotifier { int _nextId = 0; @@ -33,6 +34,15 @@ class ProductRepo extends ChangeNotifier { notifyListeners(); } + Result productWithBarcode(String barcode) { + for (var i = 0; i < products.length; i++) { + if (products[i].barcode == barcode) { + return Ok(products[i]); + } + } + return Err("Product with barcode $barcode doesn't exist"); + } + void _addAllProducts() { products = [ Product( @@ -76,6 +86,12 @@ class ProductRepo extends ChangeNotifier { name: "Jägermeister 750 ml", price: 60, description: ""), + Product( + id: _nextId++, + barcode: "5711953068881", + name: "Protein Chokoladedrik", + price: 15, + description: "Arla's protein chokolade drik der giver store muskler"), ]; } } @@ -93,11 +109,13 @@ class Product { final String description; final int price; final Coordinate? location; + final String? barcode; Product( {required this.id, required this.name, required this.price, required this.description, - this.location}); + this.location, + this.barcode}); } diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 9c587ba..7d92c7e 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + barcode_scan2: + dependency: "direct main" + description: + name: barcode_scan2 + sha256: ee34fad7148248f4450652909f5188ad95c9b6f512e75088e96bc3e96ff2e9eb + url: "https://pub.dev" + source: hosted + version: "4.4.0" boolean_selector: dependency: transitive description: @@ -57,6 +65,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -147,6 +163,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d" + url: "https://pub.dev" + source: hosted + version: "3.1.0" provider: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 02f8c7d..a3e1b6a 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 provider: ^6.1.2 + barcode_scan2: ^4.4.0 dev_dependencies: flutter_test: