Track room participant role
(Also wire that through to project collaboration rules for now)
This commit is contained in:
parent
88ed5f7290
commit
bf304b3fe7
6 changed files with 73 additions and 9 deletions
|
@ -36,6 +36,7 @@ impl ParticipantLocation {
|
|||
pub struct LocalParticipant {
|
||||
pub projects: Vec<proto::ParticipantProject>,
|
||||
pub active_project: Option<WeakModel<Project>>,
|
||||
pub role: proto::ChannelRole,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
|
|
@ -247,14 +247,18 @@ impl Room {
|
|||
let response = client.request(proto::CreateRoom {}).await?;
|
||||
let room_proto = response.room.ok_or_else(|| anyhow!("invalid room"))?;
|
||||
let room = cx.new_model(|cx| {
|
||||
Self::new(
|
||||
let mut room = Self::new(
|
||||
room_proto.id,
|
||||
None,
|
||||
response.live_kit_connection_info,
|
||||
client,
|
||||
user_store,
|
||||
cx,
|
||||
)
|
||||
);
|
||||
if let Some(participant) = room_proto.participants.first() {
|
||||
room.local_participant.role = participant.role()
|
||||
}
|
||||
room
|
||||
})?;
|
||||
|
||||
let initial_project_id = if let Some(initial_project) = initial_project {
|
||||
|
@ -710,7 +714,21 @@ impl Room {
|
|||
this.participant_user_ids.clear();
|
||||
|
||||
if let Some(participant) = local_participant {
|
||||
let role = participant.role();
|
||||
this.local_participant.projects = participant.projects;
|
||||
if this.local_participant.role != role {
|
||||
this.local_participant.role = role;
|
||||
// TODO!() this may be better done using optional replica ids instead.
|
||||
// (though need to figure out how to handle promotion? join and leave the project?)
|
||||
this.joined_projects.retain(|project| {
|
||||
if let Some(project) = project.upgrade() {
|
||||
project.update(cx, |project, _| project.set_role(role));
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
this.local_participant.projects.clear();
|
||||
}
|
||||
|
@ -1091,10 +1109,19 @@ impl Room {
|
|||
) -> Task<Result<Model<Project>>> {
|
||||
let client = self.client.clone();
|
||||
let user_store = self.user_store.clone();
|
||||
let role = self.local_participant.role;
|
||||
cx.emit(Event::RemoteProjectJoined { project_id: id });
|
||||
cx.spawn(move |this, mut cx| async move {
|
||||
let project =
|
||||
Project::remote(id, client, user_store, language_registry, fs, cx.clone()).await?;
|
||||
let project = Project::remote(
|
||||
id,
|
||||
client,
|
||||
user_store,
|
||||
language_registry,
|
||||
fs,
|
||||
role,
|
||||
cx.clone(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
this.update(&mut cx, |this, cx| {
|
||||
this.joined_projects.retain(|project| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue