diff --git a/mobile/lib/controllers/product.dart b/mobile/lib/controllers/product.dart index caa06a1..bd77bec 100644 --- a/mobile/lib/controllers/product.dart +++ b/mobile/lib/controllers/product.dart @@ -23,6 +23,10 @@ class ProductController extends ChangeNotifier { } } + Image productImage(int productId) { + return server.productImage(productId); + } + List get filteredProducts { if (query.trim().isEmpty) { return products; diff --git a/mobile/lib/pages/all_products_page.dart b/mobile/lib/pages/all_products_page.dart index 27803f7..b0c412a 100644 --- a/mobile/lib/pages/all_products_page.dart +++ b/mobile/lib/pages/all_products_page.dart @@ -47,6 +47,7 @@ class ProductListItem extends StatelessWidget { final int productId; final String name; final int price; + final Image image; final ProductPage productPage; final Product product; @@ -56,6 +57,7 @@ class ProductListItem extends StatelessWidget { required this.productId, required this.name, required this.price, + required this.image, required this.productPage, required this.product, }); @@ -87,7 +89,7 @@ class ProductListItem extends StatelessWidget { borderRadius: const BorderRadius.only( topRight: Radius.circular(10), bottomRight: Radius.circular(10)), - child: ProductImage(name)), + child: image), ], )), ); @@ -146,7 +148,10 @@ class _AllProductsPageState extends State { productId: products[idx].id, name: products[idx].name, price: products[idx].priceDkkCent, - productPage: ProductPage(product: products[idx]), + productPage: ProductPage( + product: products[idx], + image: productRepo.productImage(products[idx].id)), + image: productRepo.productImage(products[idx].id), product: products[idx], ), itemCount: products.length, diff --git a/mobile/lib/pages/cart_page.dart b/mobile/lib/pages/cart_page.dart index 3a997c9..2f02b62 100644 --- a/mobile/lib/pages/cart_page.dart +++ b/mobile/lib/pages/cart_page.dart @@ -15,6 +15,7 @@ import 'package:provider/provider.dart'; class CartItemView extends StatelessWidget { final CartControllerCache cartRepo; final int productId; + final Image image; final String name; final int price; final int amount; @@ -25,7 +26,8 @@ class CartItemView extends StatelessWidget { required this.productId, required this.name, required this.price, - required this.amount}); + required this.amount, + required this.image}); @override Widget build(BuildContext context) { @@ -87,14 +89,7 @@ class CartItemView extends StatelessWidget { IconButton( onPressed: () => removeCartItemDialog(context), icon: const Icon(Icons.delete_outline)), - Image( - width: 100, - image: AssetImage("assets/products/$name.png"), - errorBuilder: (_, __, ___) => const Image( - image: AssetImage("assets/placeholder.png"), - width: 100, - ), - ) + image ], ), ); @@ -147,6 +142,7 @@ class CartPage extends StatelessWidget { @override Widget build(BuildContext context) { + final productController = context.read(); return Column( children: [ Expanded( @@ -159,6 +155,7 @@ class CartPage extends StatelessWidget { cartRepo: cartRepo, productId: cart[idx].product.id, name: cart[idx].product.name, + image: productController.productImage(cart[idx].product.id), price: cart[idx].product.priceDkkCent, amount: cart[idx].amount), itemCount: cart.length, diff --git a/mobile/lib/pages/product_page.dart b/mobile/lib/pages/product_page.dart index da090a6..cee7dde 100644 --- a/mobile/lib/pages/product_page.dart +++ b/mobile/lib/pages/product_page.dart @@ -9,8 +9,9 @@ import 'package:provider/provider.dart'; class ProductPage extends StatelessWidget { final Product product; + final Image image; - const ProductPage({super.key, required this.product}); + const ProductPage({super.key, required this.product, required this.image}); @override Widget build(BuildContext context) { @@ -54,13 +55,7 @@ class ProductPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Image( - image: AssetImage("assets/products/${product.name}.png"), - errorBuilder: (_, __, ___) => const Image( - image: AssetImage("assets/placeholder.png")), - height: 250, - fit: BoxFit.fitHeight, - ), + image, Text( product.name, style: Theme.of(context).textTheme.bodyLarge, diff --git a/mobile/lib/server/backend_server.dart b/mobile/lib/server/backend_server.dart index 5373776..8e5e1c6 100644 --- a/mobile/lib/server/backend_server.dart +++ b/mobile/lib/server/backend_server.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:mobile/models/cart_item.dart'; import 'package:mobile/models/product.dart'; @@ -189,4 +190,9 @@ class BackendServer implements Server { return Err(res["msg"]); } } + + @override + Image productImage(int productId) { + return Image.network("$_apiUrl/products/image.png?product_id=$productId"); + } } diff --git a/mobile/lib/server/mock_server.dart b/mobile/lib/server/mock_server.dart index 1de4965..fe0a3ee 100644 --- a/mobile/lib/server/mock_server.dart +++ b/mobile/lib/server/mock_server.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:mobile/models/cart_item.dart'; import 'package:mobile/models/coordinate.dart'; import 'package:mobile/models/product.dart'; @@ -146,4 +147,9 @@ class MockServer implements Server { return Ok(Receipt( timestamp: DateTime.now(), id: id, receiptItems: [])); } + + @override + Image productImage(int productId) { + return Image.asset("assets/placeholder.png"); + } } diff --git a/mobile/lib/server/server.dart b/mobile/lib/server/server.dart index 9d75e23..324427f 100644 --- a/mobile/lib/server/server.dart +++ b/mobile/lib/server/server.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:mobile/models/cart_item.dart'; import 'package:mobile/models/product.dart'; import 'package:mobile/models/receipt.dart'; @@ -28,4 +29,6 @@ abstract class Server { Future, String>> allReceipts(String token); Future> oneReceipt(String token, int id); + + Image productImage(int productId); }