diff --git a/src/app.rs b/src/app.rs index 16d9502..031142f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,7 +2,7 @@ use leptos::*; use leptos_meta::*; use leptos_router::*; use leptos::logging::log; -use crate::components::items_list::ItemsList; +use crate::components::items_list::{ItemsList, load_items_from_db}; use crate::models::item::Item; use crate::nostr::NostrClient; use tokio::sync::mpsc; diff --git a/src/components/items_list.rs b/src/components/items_list.rs index d1c9db8..cef133c 100644 --- a/src/components/items_list.rs +++ b/src/components/items_list.rs @@ -27,6 +27,51 @@ struct DbItem { custom_properties: String, } +//function to load items from database +pub async fn load_items_from_db(current_url: &str) -> Result, String> { + let response = gloo_net::http::Request::get("/api/items?url={}") + .send() + .await + .map_err(|err| format!("Failed to fetch items: {:?}", err))?; + + if response.status() == 200 { + // Deserialize into Vec + log!("Loading items from DB..."); + let db_items = response + .json::>() + .await + .map_err(|err| format!("Failed to parse items: {:?}", err))?; + + // log!("Deserialized DB items: {:?}", db_items); + + // Convert DbItem to Item + let items = db_items + .into_iter() + .map(|db_item| { + // Deserialize `custom_properties` from a JSON string to a HashMap + let custom_properties: HashMap = + serde_json::from_str(&db_item.custom_properties) + .unwrap_or_default(); // Fallback to an empty HashMap if deserialization fails + + log!("Loaded item: {:?}", db_item.id); + log!("Custom properties: {:?}", custom_properties); + + Item { + id: db_item.id, + name: db_item.name, + description: db_item.description, + wikidata_id: db_item.wikidata_id, + custom_properties, + } + }) + .collect(); + // log!("Converted items: {:?}", items); + Ok(items) + } else { + Err(format!("Failed to fetch items: {}", response.status_text())) + } +} + #[component] pub fn ItemsList( items: ReadSignal>, @@ -177,51 +222,6 @@ pub fn ItemsList( } } - //function to load items from database - async fn load_items_from_db(url: &str) -> Result, String> { - let response = gloo_net::http::Request::get("/api/items?url={}") - .send() - .await - .map_err(|err| format!("Failed to fetch items: {:?}", err))?; - - if response.status() == 200 { - // Deserialize into Vec - log!("Loading items from DB..."); - let db_items = response - .json::>() - .await - .map_err(|err| format!("Failed to parse items: {:?}", err))?; - - // log!("Deserialized DB items: {:?}", db_items); - - // Convert DbItem to Item - let items = db_items - .into_iter() - .map(|db_item| { - // Deserialize `custom_properties` from a JSON string to a HashMap - let custom_properties: HashMap = - serde_json::from_str(&db_item.custom_properties) - .unwrap_or_default(); // Fallback to an empty HashMap if deserialization fails - - log!("Loaded item: {:?}", db_item.id); - log!("Custom properties: {:?}", custom_properties); - - Item { - id: db_item.id, - name: db_item.name, - description: db_item.description, - wikidata_id: db_item.wikidata_id, - custom_properties, - } - }) - .collect(); - // log!("Converted items: {:?}", items); - Ok(items) - } else { - Err(format!("Failed to fetch items: {}", response.status_text())) - } - } - // Function to remove an item let remove_item = move |index: usize| { let item_id = items.get()[index].id.clone();