use lan_party_core::{ edit::IntoEdit, event::{Event, EventSpec, EventUpdate}, view::IntoView, }; use log::debug; use reqwasm::http::Method; use sycamore::{futures::spawn_local_scoped, prelude::*}; use crate::{ components::{Block, Button}, util::api_request, }; #[component] pub fn EventsPage<'a, G: Html>(cx: Scope<'a>) -> View { let event_spec = create_signal(cx, EventSpec::default()); let event_update = create_signal(cx, EventUpdate::default()); let events: &'a Signal> = create_signal(cx, Vec::::new()); spawn_local_scoped(cx, async move { events.set( api_request::<_, Vec>(Method::GET, "/event", Option::<()>::None) .await .map(|inner| inner.unwrap()) .unwrap(), ); }); let onadd = move |_| { spawn_local_scoped(cx, async move { let new_event = api_request::( Method::POST, "/event", Some((*event_spec).get().as_ref().clone()), ) .await .unwrap(); debug!("{:#?}", new_event); events.modify().push(new_event.unwrap()); }); }; view! { cx, Block(title="Events".into()) { Keyed( iterable=&events, view=move |cx, event| { let event = create_ref(cx, event); view! { cx, (event.view(cx)) br() } }, key=|event| (event.name.clone()), ) } br() Block(title="Create new event".into()) { (event_spec.edit(cx)) Button(icon="mdi-check".into(), onclick=onadd) } br() Block(title="Update an event".into()) { (event_update.edit(cx)) Button(icon="mdi-check".into(), onclick=move |_| debug!("{:#?}", event_update.get())) } } }