collab_ui.rs

  1mod collab_titlebar_item;
  2mod contact_finder;
  3mod contact_list;
  4mod contact_notification;
  5mod contacts_popover;
  6mod incoming_call_notification;
  7mod notifications;
  8mod project_shared_notification;
  9
 10use call::ActiveCall;
 11pub use collab_titlebar_item::{CollabTitlebarItem, ToggleCollaborationMenu};
 12use gpui::MutableAppContext;
 13use project::Project;
 14use std::sync::Arc;
 15use workspace::{AppState, JoinProject, ToggleFollow, Workspace};
 16
 17pub fn init(app_state: Arc<AppState>, cx: &mut MutableAppContext) {
 18    collab_titlebar_item::init(cx);
 19    contact_notification::init(cx);
 20    contact_list::init(cx);
 21    contact_finder::init(cx);
 22    contacts_popover::init(cx);
 23    incoming_call_notification::init(cx);
 24    project_shared_notification::init(cx);
 25
 26    cx.add_global_action(move |action: &JoinProject, cx| {
 27        let project_id = action.project_id;
 28        let follow_user_id = action.follow_user_id;
 29        let app_state = app_state.clone();
 30        cx.spawn(|mut cx| async move {
 31            let existing_workspace = cx.update(|cx| {
 32                cx.window_ids()
 33                    .filter_map(|window_id| cx.root_view::<Workspace>(window_id))
 34                    .find(|workspace| {
 35                        workspace.read(cx).project().read(cx).remote_id() == Some(project_id)
 36                    })
 37            });
 38
 39            let workspace = if let Some(existing_workspace) = existing_workspace {
 40                existing_workspace
 41            } else {
 42                let project = Project::remote(
 43                    project_id,
 44                    app_state.client.clone(),
 45                    app_state.user_store.clone(),
 46                    app_state.languages.clone(),
 47                    app_state.fs.clone(),
 48                    cx.clone(),
 49                )
 50                .await?;
 51
 52                let (_, workspace) = cx.add_window((app_state.build_window_options)(), |cx| {
 53                    let mut workspace = Workspace::new(
 54                        Default::default(),
 55                        0,
 56                        project,
 57                        app_state.dock_default_item_factory,
 58                        cx,
 59                    );
 60                    (app_state.initialize_workspace)(&mut workspace, &app_state, cx);
 61                    workspace
 62                });
 63                workspace
 64            };
 65
 66            cx.activate_window(workspace.window_id());
 67            cx.platform().activate(true);
 68
 69            workspace.update(&mut cx, |workspace, cx| {
 70                if let Some(room) = ActiveCall::global(cx).read(cx).room().cloned() {
 71                    let follow_peer_id = room
 72                        .read(cx)
 73                        .remote_participants()
 74                        .iter()
 75                        .find(|(_, participant)| participant.user.id == follow_user_id)
 76                        .map(|(_, p)| p.peer_id)
 77                        .or_else(|| {
 78                            // If we couldn't follow the given user, follow the host instead.
 79                            let collaborator = workspace
 80                                .project()
 81                                .read(cx)
 82                                .collaborators()
 83                                .values()
 84                                .find(|collaborator| collaborator.replica_id == 0)?;
 85                            Some(collaborator.peer_id)
 86                        });
 87
 88                    if let Some(follow_peer_id) = follow_peer_id {
 89                        if !workspace.is_following(follow_peer_id) {
 90                            workspace
 91                                .toggle_follow(&ToggleFollow(follow_peer_id), cx)
 92                                .map(|follow| follow.detach_and_log_err(cx));
 93                        }
 94                    }
 95                }
 96            });
 97
 98            anyhow::Ok(())
 99        })
100        .detach_and_log_err(cx);
101    });
102}