mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
fix: start ephemeral timer when chat is archived
This commit is contained in:
11
src/chat.rs
11
src/chat.rs
@@ -688,6 +688,10 @@ impl ChatId {
|
|||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
if visibility == ChatVisibility::Archived {
|
||||||
|
start_chat_ephemeral_timers(context, self).await?;
|
||||||
|
}
|
||||||
|
|
||||||
context.emit_msgs_changed_without_ids();
|
context.emit_msgs_changed_without_ids();
|
||||||
chatlist_events::emit_chatlist_changed(context);
|
chatlist_events::emit_chatlist_changed(context);
|
||||||
chatlist_events::emit_chatlist_item_changed(context, self);
|
chatlist_events::emit_chatlist_item_changed(context, self);
|
||||||
@@ -3242,10 +3246,10 @@ pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<()>
|
|||||||
.query_map(
|
.query_map(
|
||||||
"SELECT DISTINCT(m.chat_id) FROM msgs m
|
"SELECT DISTINCT(m.chat_id) FROM msgs m
|
||||||
LEFT JOIN chats c ON m.chat_id=c.id
|
LEFT JOIN chats c ON m.chat_id=c.id
|
||||||
WHERE m.state=10 AND m.hidden=0 AND m.chat_id>9 AND c.blocked=0 AND c.archived=1",
|
WHERE m.state=10 AND m.hidden=0 AND m.chat_id>9 AND c.archived=1",
|
||||||
(),
|
(),
|
||||||
|row| row.get::<_, ChatId>(0),
|
|row| row.get::<_, ChatId>(0),
|
||||||
|ids| ids.collect::<Result<Vec<_>, _>>().map_err(Into::into)
|
|ids| ids.collect::<Result<Vec<_>, _>>().map_err(Into::into),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
if chat_ids_in_archive.is_empty() {
|
if chat_ids_in_archive.is_empty() {
|
||||||
@@ -3266,6 +3270,7 @@ pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<()>
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
for chat_id_in_archive in chat_ids_in_archive {
|
for chat_id_in_archive in chat_ids_in_archive {
|
||||||
|
start_chat_ephemeral_timers(context, chat_id_in_archive).await?;
|
||||||
context.emit_event(EventType::MsgsNoticed(chat_id_in_archive));
|
context.emit_event(EventType::MsgsNoticed(chat_id_in_archive));
|
||||||
chatlist_events::emit_chatlist_item_changed(context, chat_id_in_archive);
|
chatlist_events::emit_chatlist_item_changed(context, chat_id_in_archive);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -715,8 +715,9 @@ pub(crate) async fn start_ephemeral_timers(context: &Context) -> Result<()> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::chat::marknoticed_chat;
|
use crate::chat::{marknoticed_chat, set_muted, ChatVisibility, MuteDuration};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
use crate::constants::DC_CHAT_ID_ARCHIVED_LINK;
|
||||||
use crate::download::DownloadState;
|
use crate::download::DownloadState;
|
||||||
use crate::location;
|
use crate::location;
|
||||||
use crate::message::markseen_msgs;
|
use crate::message::markseen_msgs;
|
||||||
@@ -1468,4 +1469,52 @@ mod tests {
|
|||||||
.is_none());
|
.is_none());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tests that archiving the chat starts ephemeral timer.
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_archived_ephemeral_timer() -> Result<()> {
|
||||||
|
let mut tcm = TestContextManager::new();
|
||||||
|
let alice = &tcm.alice().await;
|
||||||
|
let bob = &tcm.bob().await;
|
||||||
|
|
||||||
|
let chat = alice.create_chat(bob).await;
|
||||||
|
let duration = 60;
|
||||||
|
chat.id
|
||||||
|
.set_ephemeral_timer(alice, Timer::Enabled { duration })
|
||||||
|
.await?;
|
||||||
|
let bob_received_message = tcm.send_recv(alice, bob, "Hello!").await;
|
||||||
|
|
||||||
|
bob_received_message
|
||||||
|
.chat_id
|
||||||
|
.set_visibility(bob, ChatVisibility::Archived)
|
||||||
|
.await?;
|
||||||
|
SystemTime::shift(Duration::from_secs(100));
|
||||||
|
|
||||||
|
delete_expired_messages(bob, time()).await?;
|
||||||
|
|
||||||
|
assert!(Message::load_from_db_optional(bob, bob_received_message.id)
|
||||||
|
.await?
|
||||||
|
.is_none());
|
||||||
|
|
||||||
|
// Bob mutes the chat so it is not unarchived.
|
||||||
|
set_muted(bob, bob_received_message.chat_id, MuteDuration::Forever).await?;
|
||||||
|
|
||||||
|
// Now test that for already archived chat
|
||||||
|
// timer is started if all archived chats are marked as noticed.
|
||||||
|
let bob_received_message_2 = tcm.send_recv(alice, bob, "Hello again!").await;
|
||||||
|
assert_eq!(bob_received_message_2.state, MessageState::InFresh);
|
||||||
|
|
||||||
|
marknoticed_chat(bob, DC_CHAT_ID_ARCHIVED_LINK).await?;
|
||||||
|
SystemTime::shift(Duration::from_secs(100));
|
||||||
|
|
||||||
|
delete_expired_messages(bob, time()).await?;
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
Message::load_from_db_optional(bob, bob_received_message_2.id)
|
||||||
|
.await?
|
||||||
|
.is_none()
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user