Avoid flicker when moving between channels

Max Brunsfeld created

Change summary

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(-)

Detailed changes

crates/call/src/call.rs 🔗

@@ -279,21 +279,17 @@ impl ActiveCall {
         channel_id: u64,
         cx: &mut ModelContext<Self>,
     ) -> Task<Result<()>> {
-        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?;

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(

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?;