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::MeetingUrl;
use crate::{
client::{get_body, get_meeting, get_organization},
components::{AgendaItemList, OrganizationList},
route::{Route, UrlEncoded},
};
#[derive(Debug, Clone, PartialEq, Props)]
pub struct MeetingProps {
meeting_url: UrlEncoded<MeetingUrl>,
}
struct MeetingData {
meeting: oparl_types::Meeting,
body: oparl_types::Body,
organizations: Vec<oparl_types::Organization>,
}
impl MeetingData {
async fn get(meeting_url: &MeetingUrl) -> Result<Self, String> {
let meeting = get_meeting(meeting_url).await?;
let mut organizations = Vec::new();
for organization in &meeting.organization {
let organization = get_organization(organization).await?;
organizations.push(organization);
}
let Some(organization) = organizations.first() else {
return Err("Couldn't load body from list of organizations".to_string());
};
let body = get_body(organization.body.as_ref().unwrap()).await?;
Ok(Self {
meeting,
organizations,
body,
})
}
}
#[component]
pub fn Meeting(props: MeetingProps) -> Element {
let meeting_url = use_signal(|| props.meeting_url.get_inner().unwrap().clone());
let data = { use_resource(move || async move { MeetingData::get(&meeting_url()).await }) };
rsx! {
match &*data.read_unchecked() {
Some(Ok(data)) => rsx! {
if let Some(name) = &data.meeting.name {
dioxus::document::Title { "🗣️ {name}" }
} else {
dioxus::document::Title { "🗣️ Unknown" }
}
h1 {
"🗣️ ",
if let Some(name) = &data.meeting.name {
"{name}"
} else {
i {
"Unknown"
}
}
}
Link {
to: Route::Body{body_url: UrlEncoded::from(data.body.id.clone())},
"🏛️ { data.body.name }"
}
AgendaItemList {
agenda_items: data.meeting.agenda_item.clone()
}
OrganizationList {
organizations: data.organizations.clone()
}
},
Some(Err(e)) => rsx! {
dioxus::document::Title { "Loading failed." },
p { "Loading meeting failed, {e}" }
},
None => rsx! {
dioxus::document::Title { "Loading…" },
p { "Loading..." }
}
}
hr {},
"Meeting URL: {meeting_url}"
}
}