use model::{ProductId, Quantity, QuantityUnit}; use seed::prelude::*; use serde::{Deserialize, Serialize}; use crate::{Model, Msg}; #[derive(Debug)] pub enum CartMsg { AddItem { quantity: Quantity, quantity_unit: QuantityUnit, product_id: ProductId, }, ModifyItem { quantity: Quantity, quantity_unit: QuantityUnit, product_id: ProductId, }, } pub type Items = indexmap::IndexMap; #[derive(Debug, Serialize, Deserialize)] pub struct Item { product_id: ProductId, quantity: Quantity, quantity_unit: QuantityUnit, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct ShoppingCart { pub cart_id: Option, pub items: Items, } pub fn init(model: &mut Model, _orders: &mut impl Orders) { model.cart = load_local(); } pub fn update(msg: CartMsg, model: &mut Model, _orders: &mut impl Orders) { match msg { CartMsg::AddItem { quantity, quantity_unit, product_id, } => { { let items: &mut Items = &mut model.cart.items; let entry = items.entry(product_id).or_insert_with(|| Item { quantity, quantity_unit, product_id, }); entry.quantity = quantity; entry.quantity_unit = quantity_unit; } store_local(&model.cart); } CartMsg::ModifyItem { .. } => {} } } fn load_local() -> ShoppingCart { LocalStorage::get("ct").unwrap_or_default() } fn store_local(cart: &ShoppingCart) { LocalStorage::insert("ct", cart).ok(); }