use crate::models::item::Item; use gloo_net::http::Request; use leptos::logging::log; use leptos::*; use serde::Deserialize; use std::collections::HashMap; use wasm_bindgen_futures::spawn_local; #[derive(Deserialize, Clone, Debug)] struct WikidataResponse { entities: HashMap, } #[derive(Deserialize, Clone, Debug)] struct WikidataEntity { labels: Option>, descriptions: Option>, } #[derive(Deserialize, Clone, Debug)] struct WikidataLabel { value: String, } #[component] pub fn ItemsList(items: ReadSignal>, set_items: WriteSignal>, on_add_item: impl Fn() + 'static, ) -> impl IntoView { let (wikidata_data, set_wikidata_data) = create_signal(Vec::>::new()); // Fetch data from Wikidata for a given item name let fetch_wikidata = move |item_name: String| { spawn_local(async move { let url = format!("https://www.wikidata.org/w/api.php?action=wbsearchentities&search={}&language=en&limit=1&format=json", item_name); match Request::get(&url).send().await { Ok(response) => match response.json::().await { Ok(parsed_data) => { if let Some(entity) = parsed_data.entities.values().next() { set_wikidata_data.update(|current_data| { current_data.push(Some(entity.clone())); }); } } Err(_) => log!("Failed to parse response from Wikidata"), }, Err(_) => log!("Failed to make request to Wikidata"), } }); }; // Handle updating grid cells let update_item = move |index: usize, column: &str, value: String| { set_items.update(|items| { if let Some(item) = items.get_mut(index) { match column { "name" => item.name = value, "description" => item.description = value, "tags" => item.tags.push((value.clone(), value)), // For simplicity, adding the same value as key and value. "review" => item.reviews.push(crate::models::item::ReviewWithRating { content: value.clone(), rating: 5, // Assuming a default rating of 5 }), "rating" => { if let Ok(rating) = value.parse::() { item.reviews.last_mut().map(|r| r.rating = rating); } } _ => (), } } }); }; // Trigger add item event let add_item = move |_| { on_add_item(); // Call the passed closure from App to add a new item }; view! {

{ "CompareWare" }

{move || { items.get().iter().enumerate().map(|(index, item)| { view! {
{ "Name" } { "Description" } { "Tags" } { "Review" } { "Rating" }