From 7c3cfec3d145336570e44e6211115134ededac76 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 18 May 2025 09:53:41 -0700 Subject: [PATCH] web: improve keep unread logic in catchup, remove execess logging --- web/src/state.rs | 35 ++++++++++++++++++++++++++++++----- web/src/websocket.rs | 18 +++++++++--------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/web/src/state.rs b/web/src/state.rs index 2a902ad..f8908e8 100644 --- a/web/src/state.rs +++ b/web/src/state.rs @@ -72,10 +72,6 @@ fn on_url_changed(old: &Url, mut new: Url) -> Msg { if did_change { messages.push(Msg::ScrollToTop) } - info!( - "url changed\nold '{old}'\nnew '{new}', history {}", - history().length().unwrap_or(0) - ); let hpp = new.remaining_hash_path_parts(); let msg = match hpp.as_slice() { ["t", tid] => Msg::ShowThreadRequest { @@ -553,7 +549,6 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { }); } Msg::ScrollToTop => { - info!("scrolling to the top"); web_sys::window().unwrap().scroll_to_with_x_and_y(0., 0.); } Msg::WindowScrolled => { @@ -619,6 +614,36 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { orders.send_msg(Msg::CatchupRequest { query }); } Msg::CatchupKeepUnread => { + if let Some(thread_id) = current_thread_id(&model.context) { + if let Context::ThreadResult { + thread: + ShowThreadQueryThread::EmailThread(ShowThreadQueryThreadOnEmailThread { + messages, + .. + }), + .. + } = &model.context + { + //orders.send_msg(Msg::SetUnread(thread_id, false)); + let unread_messages: Vec<_> = messages + .iter() + .filter(|msg| msg.tags.iter().any(|t| t == "unread")) + .map(|msg| &msg.id) + .collect(); + if unread_messages.is_empty() { + // All messages are read, so mark them all unread + orders.send_msg(Msg::SetUnread(thread_id, true)); + } else { + // Do nothing if there are some messages unread + } + } else { + // News post, not email, just mark unread + orders.send_msg(Msg::SetUnread(thread_id, true)); + }; + } else { + // This shouldn't happen + warn!("no current thread_id"); + } orders.send_msg(Msg::CatchupNext); } Msg::CatchupMarkAsRead => { diff --git a/web/src/websocket.rs b/web/src/websocket.rs index 2a731e4..9b9218d 100644 --- a/web/src/websocket.rs +++ b/web/src/websocket.rs @@ -1,7 +1,7 @@ use std::{collections::VecDeque, rc::Rc}; use letterbox_shared::WebsocketMessage; -use log::{error, info}; +use log::{debug, error}; use seed::prelude::*; use serde::{Deserialize, Serialize}; #[cfg(not(target_arch = "wasm32"))] @@ -122,13 +122,13 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { match msg { Msg::WebSocketOpened => { model.web_socket_reconnector = None; - info!("WebSocket connection is open now"); + debug!("WebSocket connection is open now"); } Msg::TextMessageReceived(msg) => { model.updates.push_back(msg); } Msg::WebSocketClosed(close_event) => { - info!( + debug!( r#"================== WebSocket connection was closed: Clean: {0} @@ -148,7 +148,7 @@ Reason: {2} } } Msg::WebSocketFailed => { - info!("WebSocket failed"); + debug!("WebSocket failed"); if model.web_socket_reconnector.is_none() { model.web_socket_reconnector = Some( orders.stream_with_handle(streams::backoff(None, Msg::ReconnectWebSocket)), @@ -156,7 +156,7 @@ Reason: {2} } } Msg::ReconnectWebSocket(retries) => { - info!("Reconnect attempt: {}", retries); + debug!("Reconnect attempt: {}", retries); model.web_socket = create_websocket(&model.ws_url, orders).unwrap(); } Msg::SendMessage(msg) => { @@ -177,16 +177,16 @@ fn create_websocket(url: &str, orders: &impl Orders) -> Result { - info!("Connecting..."); + debug!("Connecting..."); None } ConnectionStatus::Connected => Some(Msg::WebSocketOpened), ConnectionStatus::Error => Some(Msg::WebSocketFailed), ConnectionStatus::Disconnected => { - info!("Disconnected"); + debug!("Disconnected"); None } }; @@ -195,7 +195,7 @@ fn create_websocket(url: &str, orders: &impl Orders) -> Result