use crate::reply::inbox::Row;
use crate::ui::{Model, theme};
pub const HEAD: &str = "inbox";
pub const NOT_ANSWERED: &str = "waiting to hear what is in its inbox";
pub const NO_MAIL: &str = "nothing is waiting in its inbox";
pub const UNSTATED: &str = "?";
pub const SAID_NOTHING: &str = "it says nothing";
pub fn render(ui: &mut egui::Ui, model: &Model) {
theme::paint::section(ui, HEAD);
let Some(rows) = model.records.mail.as_ref() else {
ui.label(NOT_ANSWERED);
return;
};
if rows.is_empty() {
ui.label(NO_MAIL);
return;
}
for row in rows {
ui.horizontal_wrapped(|ui| {
ui.label(headline(row));
if row.deposit.body.trim().is_empty() {
ui.colored_label(theme::INK_WEAK, SAID_NOTHING);
} else {
ui.label(row.deposit.body.clone());
}
});
}
}
pub fn headline(row: &Row) -> String {
let said = format!(
"{} — from {} at {}",
row.name,
row.deposit.said_by().unwrap_or(UNSTATED.to_owned()),
row.deposit
.deposited_at
.clone()
.unwrap_or(UNSTATED.to_owned())
);
match ending(row) {
Some(ended) => format!("{said} — {ended}"),
None => said,
}
}
pub fn ending(row: &Row) -> Option<String> {
let epitaph = row.deposit.epitaph.clone()?;
match &row.deposit.terminal_ref {
Some(at) => Some(format!("ended {epitaph}, at {at}")),
None => Some(format!("ended {epitaph}")),
}
}
#[cfg(test)]
mod tests;