use leptos::{
IntoView, component,
prelude::{Get, Read, Show, WriteSignal, expect_context, signal},
task::spawn_local,
view,
};
use leptos_router::{NavigateOptions, hooks::use_navigate};
use log::info;
use reactive_stores::Store;
use rocie_client::{
apis::Error,
models::{Product, Unit},
};
use uuid::Uuid;
use crate::{
ConfigState, ConfigStateStoreFields,
api::{
buy_barcode_wrapper, get_product_by_name, get_product_unit_by_id,
get_products_by_part_name, get_unit_by_id,
},
components::{async_fetch::AsyncResource, banner::Banner, form::Form, site_header::SiteHeader},
};
#[component]
pub fn Buy() -> impl IntoView {
let (on_submit_errored, on_submit_errored_set) = signal(None);
view! {
{
Form! {
on_submit = |barcode_number, amount| {
let config = expect_context::>();
let config = config.config().read();
spawn_local(async move {
if let Err(err) = buy_barcode_wrapper(&config, barcode_number).await {
let error = format!("Error in form on-submit for barcode `{barcode_number}`: {err}");
on_submit_errored_set.set(Some(error));
} else {
on_submit_errored_set.set(None);
info!("Bought barcode {barcode_number} {amount} times");
}
});
};
}
}
}
}
#[component]
pub fn AssociateBarcode() -> impl IntoView {
let product_name_signal;
let (show_units, show_units_set) = signal(false);
view! {
{
Form! {
on_submit = |product_name, amount, unit_id| {
spawn_local(async move {
let navigate = use_navigate();
info!("Got product barcode: {product_name} with amount: {amount}, and {unit_id}");
navigate("/", NavigateOptions::default());
});
};
}
}
}
}
async fn generate_suggest_products(
optional_product_name: Option,
) -> Result