use leptos::*; use leptos_meta::*; use leptos_router::*; use leptos::logging::log; use crate::components::items_list::{ItemsList, load_items_from_db}; use crate::models::item::Item; use leptos::spawn_local; // use tokio::sync::mpsc; // use crate::nostr::NostrClient; // use nostr_sdk::serde_json; #[component] pub fn App() -> impl IntoView { provide_meta_context(); // Signal to manage the list of items let (items_signal, set_items) = create_signal(Vec::<Item>::new()); // let (tx, mut rx) = mpsc::channel::<String>(100); // // Nostr client subscription for items // spawn_local(async move { // let nostr_client = NostrClient::new("wss://relay.example.com").await.unwrap(); // nostr_client.subscribe_to_items(tx.clone()).await.unwrap(); // while let Some(content) = rx.recv().await { // if let Ok(item) = serde_json::from_str::<Item>(&content) { // set_items.update(|items| items.push(item)); // } // } // }); view! { <Router> <Routes> <Route path="/*url" view=move || { let location = use_location(); let current_url = move || location.pathname.get(); // Proper async handling spawn_local({ let current_url = current_url.clone(); async move { match load_items_from_db(¤t_url()).await { Ok(items) => set_items.set(items), Err(e) => log!("Error loading items: {}", e), } } }); view! { <Stylesheet href="/assets/style.css" /> <Stylesheet href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" /> <div> <h1>{ "CompareWare" }</h1> <ItemsList url=current_url() items=items_signal set_items=set_items /> </div> } }/> </Routes> </Router> } }