From ddf3642d47d3fcf2ad6e7abc40d0272387cb8bf1 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 15 Aug 2023 13:18:56 -0700 Subject: [PATCH] Avoid flicker when moving between channels --- crates/call/src/call.rs | 6 +----- crates/call/src/room.rs | 19 +++++++++++-------- crates/collab/src/rpc.rs | 1 + 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/call/src/call.rs b/crates/call/src/call.rs index 6e58be4f15..17540062e4 100644 --- a/crates/call/src/call.rs +++ b/crates/call/src/call.rs @@ -279,21 +279,17 @@ impl ActiveCall { channel_id: u64, cx: &mut ModelContext, ) -> Task> { - let leave_room; if let Some(room) = self.room().cloned() { if room.read(cx).channel_id() == Some(channel_id) { return Task::ready(Ok(())); } else { - leave_room = room.update(cx, |room, cx| room.leave(cx)); + room.update(cx, |room, cx| room.clear_state(cx)); } - } else { - leave_room = Task::ready(Ok(())); } let join = Room::join_channel(channel_id, self.client.clone(), self.user_store.clone(), cx); cx.spawn(|this, mut cx| async move { - leave_room.await?; let room = join.await?; this.update(&mut cx, |this, cx| this.set_room(Some(room.clone()), cx)) .await?; diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index 5a4bc8329f..a4ffa8866e 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -347,7 +347,18 @@ impl Room { } log::info!("leaving room"); + Audio::play_sound(Sound::Leave, cx); + self.clear_state(cx); + + let leave_room = self.client.request(proto::LeaveRoom {}); + cx.background().spawn(async move { + leave_room.await?; + anyhow::Ok(()) + }) + } + + pub(crate) fn clear_state(&mut self, cx: &mut AppContext) { for project in self.shared_projects.drain() { if let Some(project) = project.upgrade(cx) { project.update(cx, |project, cx| { @@ -364,8 +375,6 @@ impl Room { } } - Audio::play_sound(Sound::Leave, cx); - self.status = RoomStatus::Offline; self.remote_participants.clear(); self.pending_participants.clear(); @@ -374,12 +383,6 @@ impl Room { self.live_kit.take(); self.pending_room_update.take(); self.maintain_connection.take(); - - let leave_room = self.client.request(proto::LeaveRoom {}); - cx.background().spawn(async move { - leave_room.await?; - anyhow::Ok(()) - }) } async fn maintain_connection( diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 2396085a01..183aab8496 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -2415,6 +2415,7 @@ async fn join_channel( let channel_id = ChannelId::from_proto(request.channel_id); let joined_room = { + leave_room_for_session(&session).await?; let db = session.db().await; let room_id = db.room_id_for_channel(channel_id).await?;