diff --git a/server/src/graphql.rs b/server/src/graphql.rs index d416f91..90c6082 100644 --- a/server/src/graphql.rs +++ b/server/src/graphql.rs @@ -1,7 +1,6 @@ - use async_graphql::{ - connection::{Connection}, - Context, EmptySubscription, Enum, Error, FieldResult, Object, Schema, SimpleObject, Union, + connection::Connection, Context, EmptySubscription, Enum, Error, FieldResult, Object, Schema, + SimpleObject, Union, }; use log::info; use notmuch::Notmuch; @@ -273,7 +272,7 @@ impl Mutation { unread: bool, ) -> Result { let nm = ctx.data_unchecked::(); - info!("set_read_status({unread})"); + info!("set_read_status({query}, {unread})"); if unread { nm.tag_add("unread", &format!("{query}"))?; } else { diff --git a/server/src/nm.rs b/server/src/nm.rs index af1e6c8..70fdecd 100644 --- a/server/src/nm.rs +++ b/server/src/nm.rs @@ -80,7 +80,7 @@ pub async fn search( .0 .into_iter() .map(|ts| ThreadSummary { - thread: ts.thread, + thread: format!("thread:{}", ts.thread), timestamp: ts.timestamp, date_relative: ts.date_relative, matched: ts.matched, @@ -248,7 +248,7 @@ pub async fn thread( // TODO(wathiede): parse message and fill out attachments let attachments = extract_attachments(&m, &id)?; messages.push(Message { - id, + id: format!("id:{id}"), from, to, cc, @@ -752,3 +752,16 @@ fn render_content_type_tree(m: &ParsedMail) -> String { SKIP_HEADERS.join("\n ") ) } + +pub async fn set_read_status<'ctx>( + nm: &Notmuch, + query: String, + unread: bool, +) -> Result { + if unread { + nm.tag_add("unread", &format!("{query}"))?; + } else { + nm.tag_remove("unread", &format!("{query}"))?; + } + Ok(true) +} diff --git a/web/src/state.rs b/web/src/state.rs index a3cec65..f1622fe 100644 --- a/web/src/state.rs +++ b/web/src/state.rs @@ -372,7 +372,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { { let threads = selected_threads .iter() - .map(|tid| format!("thread:{tid}")) + .map(|tid| tid.to_string()) .collect::>() .join(" "); orders @@ -387,7 +387,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { { let threads = selected_threads .iter() - .map(|tid| format!("thread:{tid}")) + .map(|tid| tid.to_string()) .collect::>() .join(" "); orders @@ -402,7 +402,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { { let threads = selected_threads .iter() - .map(|tid| format!("thread:{tid}")) + .map(|tid| tid.to_string()) .collect::>() .join(" "); orders @@ -417,7 +417,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { { let threads = selected_threads .iter() - .map(|tid| format!("thread:{tid}")) + .map(|tid| tid.to_string()) .collect::>() .join(" "); orders diff --git a/web/src/view/mod.rs b/web/src/view/mod.rs index 0937cec..5327d6b 100644 --- a/web/src/view/mod.rs +++ b/web/src/view/mod.rs @@ -73,6 +73,7 @@ fn removable_tags_chiclet<'a>( "is-grouped-multiline" ], tags.iter().map(move |tag| { + let thread_id = thread_id.to_string(); let hex = compute_color(tag); let style = style! {St::BackgroundColor=>hex}; let classes = C!["tag", IF!(is_mobile => "is-small")]; @@ -81,7 +82,6 @@ fn removable_tags_chiclet<'a>( }; let tag = tag.clone(); let rm_tag = tag.clone(); - let thread_id = format!("thread:{thread_id}"); div![ C!["control"], div![ @@ -592,7 +592,7 @@ fn render_open_header(msg: &ShowThreadQueryThreadMessages) -> Node { ], ev(Ev::Click, move |e| { e.stop_propagation(); - Msg::SetUnread(format!("id:{id}"), !is_unread) + Msg::SetUnread(id, !is_unread) }) ] ] @@ -664,7 +664,7 @@ fn render_closed_header(msg: &ShowThreadQueryThreadMessages) -> Node { ], ev(Ev::Click, move |e| { e.stop_propagation(); - Msg::SetUnread(format!("id:{id}"), !is_unread) + Msg::SetUnread(id, !is_unread) }) ] ] @@ -808,7 +808,8 @@ fn thread( }); let read_thread_id = thread.thread_id.clone(); let unread_thread_id = thread.thread_id.clone(); - let spam_thread_id = thread.thread_id.clone(); + let spam_add_thread_id = thread.thread_id.clone(); + let spam_unread_thread_id = thread.thread_id.clone(); div![ C!["thread"], h3![C!["is-size-5"], subject], @@ -827,20 +828,14 @@ fn thread( 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( - format!("thread:{read_thread_id}"), - false - )), + 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( - format!("thread:{unread_thread_id}"), - true - )), + ev(Ev::Click, move |_| Msg::SetUnread(unread_thread_id, true)), ], ], ], @@ -854,8 +849,8 @@ fn thread( span![C!["icon", "is-small"], i![C!["far", "fa-hand"]]], IF!(show_icon_text=>span!["Spam"]), ev(Ev::Click, move |_| Msg::MultiMsg(vec![ - Msg::AddTag(format!("thread:{spam_thread_id}"), "Spam".to_string()), - Msg::SetUnread(format!("thread:{spam_thread_id}"), false) + Msg::AddTag(spam_add_thread_id, "Spam".to_string()), + Msg::SetUnread(spam_unread_thread_id, false) ])), ], ],