bazzar/web/src/shopping_cart.rs

69 lines
1.7 KiB
Rust
Raw Normal View History

2022-05-15 14:05:26 +02:00
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<model::ProductId, Item>;
#[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<model::ShoppingCartId>,
pub items: Items,
}
pub fn init(model: &mut Model, _orders: &mut impl Orders<Msg>) {
model.cart = load_local();
}
pub fn update(msg: CartMsg, model: &mut Model, _orders: &mut impl Orders<Msg>) {
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();
}