use leptos::{ error::Error, prelude::{Read, expect_context}, }; use reactive_stores::Store; use rocie_client::{ apis::{ api_get_inventory_api::amount_by_id, api_get_product_api::{ product_by_id, product_by_name, product_suggestion_by_name, products, }, api_get_unit_api::unit_by_id, api_get_unit_property_api::unit_property_by_id, api_set_barcode_api::buy_barcode, configuration::Configuration, }, models::{ BarcodeId, Product, ProductAmount, ProductId, Unit, UnitId, UnitProperty, UnitPropertyId, }, }; use crate::{ConfigState, ConfigStateStoreFields}; pub(crate) async fn get_amount_by_id(product_id: ProductId) -> Result { let config = expect_context::>(); amount_by_id(&config.config().read(), product_id) .await .map_err(Into::::into) } pub(crate) async fn get_product_by_id(product_id: ProductId) -> Result { let config = expect_context::>(); product_by_id(&config.config().read(), product_id) .await .map_err(Into::::into) } pub(crate) async fn get_product_by_name( name: String, ) -> Result< Product, rocie_client::apis::Error, > { let config = expect_context::>(); product_by_name(&config.config().read(), &name).await } pub(crate) async fn get_products_by_part_name(part_name: String) -> Result, Error> { let config = expect_context::>(); product_suggestion_by_name(&config.config().read(), &part_name) .await .map_err(Into::::into) } pub(crate) async fn get_unit_by_id(unit_id: UnitId) -> Result { let config = expect_context::>(); unit_by_id(&config.config().read(), unit_id) .await .map_err(Into::::into) } pub(crate) async fn get_unit_property_by_id( unit_id: UnitPropertyId, ) -> Result { let config = expect_context::>(); unit_property_by_id(&config.config().read(), unit_id) .await .map_err(Into::::into) } pub(crate) async fn get_full_product_by_id( id: ProductId, ) -> Result<(Product, ProductAmount, Unit), Error> { let amount = get_amount_by_id(id).await?; let product = get_product_by_id(id).await?; let unit = get_unit_by_id(amount.amount.unit).await?; Ok::<_, Error>((product, amount, unit)) } pub(crate) async fn get_product_unit_by_id( id: ProductId, ) -> Result<(Product, UnitProperty), Error> { let product = get_product_by_id(id).await?; let unit = get_unit_property_by_id(product.unit_property).await?; Ok::<_, Error>((product, unit)) } pub(crate) async fn get_products() -> Result, Error> { let config = expect_context::>(); products(&config.config().read()) .await .map_err(Into::::into) } pub(crate) async fn buy_barcode_wrapper( config: &Configuration, barcode_number: u32, ) -> Result<(), Error> { buy_barcode( config, BarcodeId { value: barcode_number, }, ) .await .map_err(Into::::into) }