use dioxus::{
hooks::{use_resource, use_signal},
prelude::{Props, component, dioxus_elements, rsx},
signals::ReadableExt as _,
};
use dioxus_core::Element;
use dioxus_router::Link;
use oparl_types::AgendaItemUrl;
use crate::{
client::{get_agenda_item, get_meeting},
route::{Route, UrlEncoded},
};
#[derive(Debug, Clone, PartialEq, Props)]
pub struct AgendaItemProps {
agenda_item_url: UrlEncoded<AgendaItemUrl>,
}
struct AgendaItemData {
agenda_item: oparl_types::AgendaItem,
meeting: oparl_types::Meeting,
}
impl AgendaItemData {
async fn get(agenda_item_url: &AgendaItemUrl) -> Result<Self, String> {
let agenda_item = get_agenda_item(agenda_item_url).await?;
let meeting = get_meeting(agenda_item.meeting.as_ref().unwrap()).await?;
Ok(Self {
agenda_item,
meeting,
})
}
}
#[component]
pub fn AgendaItem(props: AgendaItemProps) -> Element {
let agenda_item_url = use_signal(|| props.agenda_item_url.get_inner().unwrap().clone());
let data =
{ use_resource(move || async move { AgendaItemData::get(&agenda_item_url()).await }) };
rsx! {
match &*data.read_unchecked() {
Some(Ok(data)) => rsx! {
if let Some(name) = &data.agenda_item.name {
dioxus::document::Title { "💬 {name}" }
} else {
dioxus::document::Title { "💬 Unknown" }
}
h1 {
"💬 ",
if let Some(name) = &data.agenda_item.name {
"{name}"
} else {
i {
"Unknown"
}
}
}
Link {
to: Route::Meeting{ meeting_url: UrlEncoded::from(data.meeting.id.clone())},
"🗣️ ",
if let Some(name) = &data.meeting.name {
"{name}"
} else {
i {
"Unknown"
}
}
}
},
Some(Err(e)) => rsx! { p { "Loading agenda_item failed, {e}" } },
None => rsx! { p { "Loading..." } }
}
hr {},
"AgendaItem URL: {agenda_item_url}"
}
}