Set room only after project has been shared to avoid flicker

Antonio Scandurra created

Change summary

crates/call/src/call.rs | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)

Detailed changes

crates/call/src/call.rs 🔗

@@ -50,9 +50,7 @@ impl ActiveCall {
             let room = if let Some(room) = room {
                 room
             } else {
-                let room = cx.update(|cx| Room::create(client, user_store, cx)).await?;
-                this.update(&mut cx, |this, cx| this.set_room(Some(room.clone()), cx));
-                room
+                cx.update(|cx| Room::create(client, user_store, cx)).await?
             };
 
             let initial_project_id = if let Some(initial_project) = initial_project {
@@ -65,6 +63,8 @@ impl ActiveCall {
             } else {
                 None
             };
+
+            this.update(&mut cx, |this, cx| this.set_room(Some(room.clone()), cx));
             room.update(&mut cx, |room, cx| {
                 room.call(recipient_user_id, initial_project_id, cx)
             })
@@ -88,16 +88,18 @@ impl ActiveCall {
     }
 
     fn set_room(&mut self, room: Option<ModelHandle<Room>>, cx: &mut ModelContext<Self>) {
-        if let Some(room) = room {
-            let subscriptions = vec![
-                cx.observe(&room, |_, _, cx| cx.notify()),
-                cx.subscribe(&room, |_, _, event, cx| cx.emit(event.clone())),
-            ];
-            self.room = Some((room, subscriptions));
-        } else {
-            self.room = None;
+        if room.as_ref() != self.room.as_ref().map(|room| &room.0) {
+            if let Some(room) = room {
+                let subscriptions = vec![
+                    cx.observe(&room, |_, _, cx| cx.notify()),
+                    cx.subscribe(&room, |_, _, event, cx| cx.emit(event.clone())),
+                ];
+                self.room = Some((room, subscriptions));
+            } else {
+                self.room = None;
+            }
+            cx.notify();
         }
-        cx.notify();
     }
 
     pub fn room(&self) -> Option<&ModelHandle<Room>> {