Changed the on-click behavior of joining a channel to not open the chat, and only open 1 project instead of all projects

Mikayla , conrad , and max created

Co-authored-by: conrad <conrad.irwin@gmail.com>
Co-authored-by: max <max@zed.dev>

Change summary

crates/call/src/room.rs              | 12 +++++-------
crates/collab_ui/src/collab_panel.rs | 25 +++++++------------------
2 files changed, 12 insertions(+), 25 deletions(-)

Detailed changes

crates/call/src/room.rs 🔗

@@ -598,9 +598,8 @@ impl Room {
             .map_or(&[], |v| v.as_slice())
     }
 
-    /// projects_to_join returns a list of shared projects sorted such
-    /// that the most 'active' projects appear last.
-    pub fn projects_to_join(&self) -> Vec<(u64, u64)> {
+    /// Returns the most 'active' projects, defined as most people in the project
+    pub fn most_active_project(&self) -> Option<(u64, u64)> {
         let mut projects = HashMap::default();
         let mut hosts = HashMap::default();
         for participant in self.remote_participants.values() {
@@ -617,12 +616,11 @@ impl Room {
         }
 
         let mut pairs: Vec<(u64, usize)> = projects.into_iter().collect();
-        pairs.sort_by_key(|(_, count)| 0 - *count as i32);
+        pairs.sort_by_key(|(_, count)| *count as i32);
 
         pairs
-            .into_iter()
-            .map(|(project_id, _)| (project_id, hosts[&project_id]))
-            .collect()
+            .first()
+            .map(|(project_id, _)| (*project_id, hosts[&project_id]))
     }
 
     async fn handle_room_updated(

crates/collab_ui/src/collab_panel.rs 🔗

@@ -3208,27 +3208,16 @@ impl CollabPanel {
                 .update(&mut cx, |call, cx| call.join_channel(channel_id, cx))
                 .await?;
 
-            let tasks = room.update(&mut cx, |room, cx| {
-                let Some(workspace) = workspace.upgrade(cx) else {
-                    return vec![];
-                };
-                let projects = room.projects_to_join();
-
-                if projects.is_empty() {
-                    ChannelView::open(channel_id, workspace, cx).detach();
-                    return vec![];
-                }
-                room.projects_to_join()
-                    .into_iter()
-                    .map(|(project_id, user_id)| {
-                        let app_state = workspace.read(cx).app_state().clone();
-                        workspace::join_remote_project(project_id, user_id, app_state, cx)
-                    })
-                    .collect()
+            let task = room.update(&mut cx, |room, cx| {
+                let workspace = workspace.upgrade(cx)?;
+                let (project, host) = room.most_active_project()?;
+                let app_state = workspace.read(cx).app_state().clone();
+                Some(workspace::join_remote_project(project, host, app_state, cx))
             });
-            for task in tasks {
+            if let Some(task) = task {
                 task.await?;
             }
+
             anyhow::Ok(())
         })
         .detach_and_log_err(cx);