2024-12-09 19:24:46 +03:00
|
|
|
/// Main application entry point for CompareWare.
|
|
|
|
/// Combines the item management components (form and list) to provide a cohesive user interface.
|
2024-12-06 14:45:14 +03:00
|
|
|
use leptos::*;
|
2024-12-10 18:35:39 +03:00
|
|
|
use leptos_meta::*;
|
2024-12-06 14:45:14 +03:00
|
|
|
use crate::components::{item_form::ItemForm, items_list::ItemsList};
|
|
|
|
use crate::models::item::Item;
|
2024-12-10 22:28:38 +03:00
|
|
|
use crate::nostr::NostrClient;
|
2024-12-12 23:24:23 +03:00
|
|
|
use std::sync::mpsc;
|
2024-12-09 14:58:05 +03:00
|
|
|
use uuid::Uuid;
|
2024-12-10 22:28:38 +03:00
|
|
|
use leptos::spawn_local;
|
2024-12-06 14:45:14 +03:00
|
|
|
|
|
|
|
#[component]
|
|
|
|
pub fn App() -> impl IntoView {
|
2024-12-10 18:35:39 +03:00
|
|
|
provide_meta_context();
|
2024-12-09 19:24:46 +03:00
|
|
|
// Signal to store and update the list of items.
|
2024-12-09 13:56:39 +03:00
|
|
|
let (items_signal, set_items) = create_signal(Vec::<Item>::new());
|
2024-12-12 23:24:23 +03:00
|
|
|
let (tx, mut rx) = mpsc::channel::<String>();
|
2024-12-10 22:28:38 +03:00
|
|
|
|
|
|
|
spawn_local(async move {
|
|
|
|
//initialize nostr client
|
|
|
|
let nostr_client = NostrClient::new("wss://relay.example.com").await.unwrap();
|
|
|
|
nostr_client.subscribe_to_items(tx.clone()).await.unwrap();
|
|
|
|
|
|
|
|
// Handle incoming events
|
2024-12-12 23:24:23 +03:00
|
|
|
while let Ok(content) = rx.recv(){
|
2024-12-10 22:28:38 +03:00
|
|
|
if let Ok(item) = serde_json::from_str::<Item>(&content) {
|
|
|
|
set_items.update(|items| items.push(item));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2024-12-06 14:45:14 +03:00
|
|
|
|
2024-12-09 19:24:46 +03:00
|
|
|
// Function to handle adding a new item to the list.
|
2024-12-06 14:45:14 +03:00
|
|
|
let add_item = move |name: String, description: String, tags: Vec<(String, String)>| {
|
2024-12-09 14:58:05 +03:00
|
|
|
set_items.update(|items| {
|
2024-12-10 22:28:38 +03:00
|
|
|
let item = Item {
|
2024-12-09 14:58:05 +03:00
|
|
|
id: Uuid::new_v4().to_string(),
|
2024-12-10 22:28:38 +03:00
|
|
|
name: name.clone(),
|
|
|
|
description: description.clone(),
|
|
|
|
tags: tags.clone(),
|
|
|
|
};
|
|
|
|
items.push(item);
|
|
|
|
});
|
|
|
|
|
|
|
|
spawn_local(async move {
|
|
|
|
let nostr_client = NostrClient::new("wss://relay.example.com").await.unwrap();
|
|
|
|
nostr_client.publish_item(name, description, tags).await.unwrap();
|
2024-12-06 14:45:14 +03:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
view! {
|
2024-12-10 18:35:39 +03:00
|
|
|
<>
|
|
|
|
<Stylesheet href="/assets/style.css" />
|
|
|
|
<div>
|
|
|
|
<h1>{ "CompareWare" }</h1>
|
|
|
|
// Form component for adding new items.
|
|
|
|
<ItemForm on_submit=Box::new(add_item) />
|
|
|
|
// Component to display the list of items.
|
|
|
|
<ItemsList items=items_signal />
|
|
|
|
</div>
|
|
|
|
</>
|
2024-12-06 14:45:14 +03:00
|
|
|
}
|
2024-12-12 23:24:23 +03:00
|
|
|
}
|