Treat email and news posts as distinct types on the frontend and backend

This commit is contained in:
2024-08-31 11:40:06 -07:00
parent 760cec01a8
commit a8d5617cf2
12 changed files with 324 additions and 72 deletions

View File

@@ -19,6 +19,10 @@ pub(super) fn view(model: &Model) -> Node<Msg> {
thread: ShowThreadQueryThread::EmailThread(thread),
open_messages,
} => view::thread(thread, open_messages, show_icon_text),
Context::ThreadResult {
thread: ShowThreadQueryThread::NewsPost(post),
..
} => view::news_post(post, show_icon_text),
Context::SearchResult {
query,
results,

View File

@@ -13,7 +13,7 @@ use crate::{
};
pub(super) fn view(model: &Model) -> Node<Msg> {
log::info!("tablet::view");
log::info!("mobile::view");
let show_icon_text = false;
let content = match &model.context {
Context::None => div![h1!["Loading"]],
@@ -21,6 +21,10 @@ pub(super) fn view(model: &Model) -> Node<Msg> {
thread: ShowThreadQueryThread::EmailThread(thread),
open_messages,
} => view::thread(thread, open_messages, show_icon_text),
Context::ThreadResult {
thread: ShowThreadQueryThread::NewsPost(post),
..
} => view::news_post(post, show_icon_text),
Context::SearchResult {
query,
results,

View File

@@ -1075,3 +1075,107 @@ pub fn view_tags(model: &Model) -> Node<Msg> {
]
]
}
fn news_post(post: &ShowThreadQueryThreadOnNewsPost, show_icon_text: bool) -> Node<Msg> {
// TODO(wathiede): show per-message subject if it changes significantly from top-level subject
let subject = &post.title;
set_title(subject);
let read_thread_id = post.thread_id.clone();
let unread_thread_id = post.thread_id.clone();
div![
C!["thread"],
h3![C!["is-size-5"], subject],
div![
C!["level", "is-mobile"],
div![
C!["level-item"],
div![
C!["buttons", "has-addons"],
button![
C!["button", "mark-read"],
attrs! {At::Title => "Mark as read"},
span![C!["icon", "is-small"], i![C!["far", "fa-envelope-open"]]],
IF!(show_icon_text=>span!["Read"]),
ev(Ev::Click, move |_| Msg::SetUnread(read_thread_id, false)),
],
button![
C!["button", "mark-unread"],
attrs! {At::Title => "Mark as unread"},
span![C!["icon", "is-small"], i![C!["far", "fa-envelope"]]],
IF!(show_icon_text=>span!["Unread"]),
ev(Ev::Click, move |_| Msg::SetUnread(unread_thread_id, true)),
],
],
],
// This would be the holder for spam buttons on emails
div![C!["level-item"], div![]]
],
div![
C!["message"],
div![C!["header"], render_news_post_header(&post)],
div![C!["body", format!("site-{}", post.slug)], raw![&post.body]]
] /* TODO(wathiede): plumb in orignal id
a![
attrs! {At::Href=>api::original(&thread_node.0.as_ref().expect("message missing").id)},
"Original"
],
*/
]
}
fn render_news_post_header(post: &ShowThreadQueryThreadOnNewsPost) -> Node<Msg> {
let from = &post.site;
let from_detail = post.url.clone();
let avatar: Option<String> = None;
//let avatar: Option<String> = Some(String::from("https://bulma.io/images/placeholders/64x64.png"));
let id = post.thread_id.clone();
// TODO: plumb this through
//let is_unread = has_unread(&msg.tags);
let is_unread = true;
let img = render_avatar(avatar, &from);
article![
C!["media"],
figure![C!["media-left"], p![C!["image", "is-64x64"], img]],
div![
C!["media-content"],
div![
C!["content"],
p![
strong![from],
br![],
small![
&from_detail,
" ",
span![
i![C!["far", "fa-clone"]],
ev(Ev::Click, move |e| {
e.stop_propagation();
Msg::CopyToClipboard(from_detail.to_string())
})
]
],
table![tr![td![
attrs! {At::ColSpan=>2},
span![C!["header"], human_age(post.timestamp)]
]]],
],
],
],
div![
C!["media-right"],
span![
C!["read-status"],
i![C![
"far",
if is_unread {
"fa-envelope"
} else {
"fa-envelope-open"
},
]]
],
ev(Ev::Click, move |e| {
e.stop_propagation();
Msg::SetUnread(id, !is_unread)
})
]
]
}

View File

@@ -1,3 +1,4 @@
use log::info;
use seed::{prelude::*, *};
use crate::{
@@ -16,6 +17,10 @@ pub(super) fn view(model: &Model) -> Node<Msg> {
thread: ShowThreadQueryThread::EmailThread(thread),
open_messages,
} => view::thread(thread, open_messages, show_icon_text),
Context::ThreadResult {
thread: ShowThreadQueryThread::NewsPost(post),
..
} => view::news_post(post, show_icon_text),
Context::SearchResult {
query,
results,