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,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2022-05-15 19:33:06 +02:00
|
|
|
impl From<CartMsg> for Msg {
|
|
|
|
fn from(msg: CartMsg) -> Self {
|
|
|
|
Msg::Cart(msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub type Items = indexmap::IndexMap<ProductId, Item>;
|
2022-05-15 14:05:26 +02:00
|
|
|
|
|
|
|
#[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();
|
|
|
|
}
|