Files
Ely-GPUI-Components/examples/gallery/pages/mail/read.rs
T
ZacharyZhang-NY 70e18af092 Mail · Reading: a message reader, a conversation, and quoted text
MailReader opens a message under its subject: the sender's picture,
name and address, who it went to, when it came, and Reply, Reply all
when it went to more than one, and Forward, each only with a handler;
then its words and its files, each downloadable. MailThreadView lays a
conversation oldest first: the newest stands open, the others fold to
a line of the sender, their first words and when, which a press, Enter
or Space opens. QuotedText folds words quoted from before behind a
small mark; open, they sit behind a rule. Long names give way at the
label width.
2026-09-26 23:57:06 -04:00

98 lines
4.2 KiB
Rust

use ely_gpui_component::mail::{Contact, MailReader, MailThreadView, Message, QuotedText};
use gpui::{App, IntoElement, ParentElement, Styled, div, px};
use jiff::{SignedDuration, Timestamp};
use crate::{probe::probe, ui::section};
fn ana() -> Contact {
Contact::new("Ana Lima", "ana@atrium.studio")
}
fn ben() -> Contact {
Contact::new("Ben Ito", "ben@atrium.studio")
}
fn you() -> Contact {
Contact::new("You", "you@atrium.studio")
}
fn ago(minutes: i64) -> Timestamp {
Timestamp::now() - SignedDuration::from_mins(minutes)
}
fn paragraph(text: &'static str) -> impl IntoElement {
div().child(text)
}
pub fn reader(cx: &mut App) -> impl IntoElement + use<> {
let message = Message::new("review", ana(), ago(12))
.to([you(), ben()])
.cc([Contact::new("Dev Rao", "dev@atrium.studio")])
.file("atrium-plan.pdf", 2_400_000)
.file("stair-hall.jpg", 3_100_000);
section(
"MailReader / QuotedText",
"A message open for reading: the subject, who wrote to whom and when, replies, the words and the files. Words quoted from before fold behind a small mark until pressed.",
cx,
)
.child(probe(
"mail-reader",
div().w(px(640.)).child(
MailReader::new("mail-reader", "Friday's review moves to 10:00", message)
.on_reply(|key, _, _| log::info!("gallery: reply {key}"))
.on_reply_all(|key, _, _| log::info!("gallery: reply all {key}"))
.on_forward(|key, _, _| log::info!("gallery: forward {key}"))
.on_download(|key, file, _, _| log::info!("gallery: download {key} {file}"))
.child(paragraph("Morning both,"))
.child(paragraph(
"Friday's review moves to 10:00, in the model room. The client wants to see the stair at the scale we'll build it, so please bring the plaster samples if they've dried.",
))
.child(paragraph("The plan and a photo of the stair hall are attached. — Ana"))
.child(
QuotedText::new("mail-quoted")
.child(paragraph("On Thursday, Ben Ito wrote:"))
.child(paragraph(
"The samples are in the stair hall: lime, tadelakt and a sanded gypsum. The tadelakt needs another day.",
)),
),
),
))
}
pub fn thread(cx: &mut App) -> impl IntoElement + use<> {
let message = |key: &'static str, from: Contact, minutes: i64, snippet: &'static str| {
Message::new(key, from, ago(minutes))
.to([you()])
.snippet(snippet)
};
section(
"MailThreadView",
"A conversation, oldest first: the newest stands open, and the others fold to a line of who, their first words and when, which a press, Enter or Space opens.",
cx,
)
.child(probe(
"mail-thread",
div().w(px(640.)).child(
MailThreadView::new("mail-thread", "Plaster samples")
.on_reply(|key, _, _| log::info!("gallery: reply {key}"))
.on_forward(|key, _, _| log::info!("gallery: forward {key}"))
.message(
message("s1", ben(), 60 * 30, "Three finishes are in the stair hall: lime, tadelakt and a sanded gypsum."),
paragraph("Three finishes are in the stair hall: lime, tadelakt and a sanded gypsum. Leave notes on the backs."),
)
.message(
message("s2", ana(), 60 * 26, "The lime reads warmest by the windows. Can we see it at dusk?"),
paragraph("The lime reads warmest by the windows. Can we see it at dusk?"),
)
.message(
message("s3", Contact::new("Chloé Martin", "chloe@atrium.studio"), 60 * 5, "Dusk works. I'll bring the lamp we use for the model."),
paragraph("Dusk works. I'll bring the lamp we use for the model."),
)
.message(
message("s4", ben(), 40, "The tadelakt is sealed. All three are ready for Friday."),
paragraph("The tadelakt is sealed. All three are ready for Friday."),
),
),
))
}