Skip to content

Commit 67d8db3

Browse files
committed
fix(spaces): filter out non-joined rooms from the space leaving process and handle
1 parent 52518e0 commit 67d8db3

File tree

1 file changed

+49
-32
lines changed

1 file changed

+49
-32
lines changed

crates/matrix-sdk-ui/src/spaces/leave.rs

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for that specific language governing permissions and
1313
// limitations under the License.
1414

15-
use matrix_sdk::{Client, room::RoomMemberRole};
15+
use matrix_sdk::{Client, RoomState, room::RoomMemberRole};
1616
use ruma::{Int, OwnedRoomId};
1717

1818
use crate::spaces::{Error, SpaceRoom};
@@ -45,28 +45,34 @@ impl LeaveSpaceHandle {
4545
let mut rooms = Vec::new();
4646

4747
for room_id in &room_ids {
48-
if let Some(room) = client.get_room(room_id) {
49-
let users_to_power_levels = room.users_with_power_levels().await;
50-
51-
let is_last_admin = users_to_power_levels
52-
.iter()
53-
.filter(|(_, power_level)| {
54-
let Some(power_level) = Int::new(**power_level) else {
55-
return false;
56-
};
57-
58-
RoomMemberRole::suggested_role_for_power_level(power_level.into())
59-
== RoomMemberRole::Administrator
60-
})
61-
.map(|p| p.0)
62-
.collect::<Vec<_>>()
63-
== vec![room.own_user_id()];
64-
65-
rooms.push(LeaveSpaceRoom {
66-
space_room: SpaceRoom::new_from_known(&room, 0),
67-
is_last_admin,
68-
});
48+
let Some(room) = client.get_room(room_id) else {
49+
continue;
50+
};
51+
52+
if room.state() != RoomState::Joined {
53+
continue;
6954
}
55+
56+
let users_to_power_levels = room.users_with_power_levels().await;
57+
58+
let is_last_admin = users_to_power_levels
59+
.iter()
60+
.filter(|(_, power_level)| {
61+
let Some(power_level) = Int::new(**power_level) else {
62+
return false;
63+
};
64+
65+
RoomMemberRole::suggested_role_for_power_level(power_level.into())
66+
== RoomMemberRole::Administrator
67+
})
68+
.map(|p| p.0)
69+
.collect::<Vec<_>>()
70+
== vec![room.own_user_id()];
71+
72+
rooms.push(LeaveSpaceRoom {
73+
space_room: SpaceRoom::new_from_known(&room, 0),
74+
is_last_admin,
75+
});
7076
}
7177

7278
Self { client, rooms }
@@ -97,7 +103,10 @@ mod tests {
97103
use std::collections::BTreeMap;
98104

99105
use matrix_sdk::test_utils::mocks::MatrixMockServer;
100-
use matrix_sdk_test::{JoinedRoomBuilder, async_test, event_factory::EventFactory};
106+
use matrix_sdk_test::{
107+
InvitedRoomBuilder, JoinedRoomBuilder, LeftRoomBuilder, async_test,
108+
event_factory::EventFactory,
109+
};
101110
use ruma::{RoomVersionId, owned_user_id, room_id};
102111

103112
use crate::spaces::SpaceService;
@@ -108,7 +117,7 @@ mod tests {
108117
let client = server.client_builder().build().await;
109118
let user_id = client.user_id().unwrap();
110119
let space_service = SpaceService::new(client.clone());
111-
let factory = EventFactory::new();
120+
let factory = EventFactory::new().sender(user_id);
112121

113122
server.mock_room_state_encryption().plain().mount().await;
114123

@@ -117,6 +126,8 @@ mod tests {
117126
let parent_space_id = room_id!("!parent_space:example.org");
118127
let child_space_id_1 = room_id!("!child_space_1:example.org");
119128
let child_space_id_2 = room_id!("!child_space_2:example.org");
129+
let left_room_id = room_id!("!left_room:example.org");
130+
let invited_room_id = room_id!("!invited_room:example.org");
120131

121132
let mut power_levels = BTreeMap::from([
122133
(user_id.to_owned(), 100.into()),
@@ -130,8 +141,7 @@ mod tests {
130141
.add_state_event(factory.create(user_id, RoomVersionId::V1).with_space_type())
131142
.add_state_event(
132143
factory
133-
.space_parent(parent_space_id.to_owned(), child_space_id_1.to_owned())
134-
.sender(user_id),
144+
.space_parent(parent_space_id.to_owned(), child_space_id_1.to_owned()),
135145
)
136146
.add_state_event(
137147
factory.power_levels(&mut power_levels).state_key("").sender(user_id),
@@ -148,28 +158,35 @@ mod tests {
148158
.add_state_event(factory.create(user_id, RoomVersionId::V1).with_space_type())
149159
.add_state_event(
150160
factory
151-
.space_parent(parent_space_id.to_owned(), child_space_id_2.to_owned())
152-
.sender(user_id),
161+
.space_parent(parent_space_id.to_owned(), child_space_id_2.to_owned()),
153162
)
154163
.add_state_event(
155164
factory.power_levels(&mut power_levels).state_key("").sender(user_id),
156165
),
157166
)
158167
.await;
168+
169+
server.sync_room(&client, LeftRoomBuilder::new(invited_room_id)).await;
170+
server.sync_room(&client, InvitedRoomBuilder::new(invited_room_id)).await;
171+
159172
server
160173
.sync_room(
161174
&client,
162175
JoinedRoomBuilder::new(parent_space_id)
163176
.add_state_event(factory.create(user_id, RoomVersionId::V1).with_space_type())
164177
.add_state_event(
165178
factory
166-
.space_child(parent_space_id.to_owned(), child_space_id_1.to_owned())
167-
.sender(user_id),
179+
.space_child(parent_space_id.to_owned(), child_space_id_1.to_owned()),
168180
)
169181
.add_state_event(
170182
factory
171-
.space_child(parent_space_id.to_owned(), child_space_id_2.to_owned())
172-
.sender(user_id),
183+
.space_child(parent_space_id.to_owned(), child_space_id_2.to_owned()),
184+
)
185+
.add_state_event(
186+
factory.space_child(parent_space_id.to_owned(), left_room_id.to_owned()),
187+
)
188+
.add_state_event(
189+
factory.space_child(parent_space_id.to_owned(), invited_room_id.to_owned()),
173190
),
174191
)
175192
.await;

0 commit comments

Comments
 (0)