use dioxus::prelude::{Props, component, dioxus_elements, rsx};
use dioxus_core::Element;
use dioxus_router::Link;
use oparl_types::{DateTime, Meeting};
use time::{OffsetDateTime, format_description};
use crate::route::{Route, UrlEncoded};
#[derive(Debug, Clone, PartialEq, Props)]
pub struct MeetingProps {
meeting: Meeting,
}
#[component]
pub fn Meeting(props: MeetingProps) -> Element {
rsx! {
Link {
to: Route::Meeting { meeting_url: UrlEncoded::from(props.meeting.id) },
span {
class: "infobox",
span {
class: "label",
if let Some(name) = props.meeting.name {
"{name}"
} else {
i {
"Unknown"
}
}
}
br {}
if let Some(timespan) = timespan(props.meeting.start,props.meeting.end) {
"{timespan}"
}
br {}
"{props.meeting.agenda_item.len()} agenda items"
}
}
}
}
fn timespan(start: Option<DateTime>, end: Option<DateTime>) -> Option<String> {
let date_format = format_description::parse("[year]-[month]-[day]").unwrap();
let time_format = format_description::parse("[hour]:[minute]").unwrap();
let date_time_format =
format_description::parse("[year]-[month]-[day] [hour]:[minute]").unwrap();
let start: Option<OffsetDateTime> = start.map(Into::into);
let end: Option<OffsetDateTime> = end.map(Into::into);
match (start, end) {
(Some(start), Some(end)) if start.date() == end.date() => {
let date = start.format(&date_format).unwrap();
let start_time = start.format(&time_format).unwrap();
let end_time = end.format(&time_format).unwrap();
Some(format!("{date} | {start_time} - {end_time}"))
}
(Some(start), Some(end)) => {
let start = start.format(&date_time_format).unwrap();
let end = end.format(&date_time_format).unwrap();
Some(format!("{start} - {end}"))
}
(Some(start), None) => Some(start.format(&date_time_format).unwrap()),
(None, _) => None,
}
}