Skip to content

Commit 203a378

Browse files
committed
feat(sdk): Support m.room.membership with membership: "invite" as latest event.
1 parent 8eb7264 commit 203a378

File tree

1 file changed

+41
-26
lines changed

1 file changed

+41
-26
lines changed

crates/matrix-sdk/src/latest_events/latest_event.rs

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -927,32 +927,7 @@ fn filter_timeline_event(
927927
}
928928
}
929929

930-
// We don't currently support most state events…
931-
AnySyncTimelineEvent::State(state) => {
932-
// … but we make an exception for knocked state events _if_ the current user
933-
// can either accept or decline them.
934-
if let AnySyncStateEvent::RoomMember(member) = state
935-
&& matches!(member.membership(), MembershipState::Knock)
936-
{
937-
let can_accept_or_decline_knocks = match power_levels {
938-
Some((own_user_id, room_power_levels)) => {
939-
room_power_levels.user_can_invite(own_user_id)
940-
|| room_power_levels.user_can_kick(own_user_id)
941-
}
942-
_ => false,
943-
};
944-
945-
// The current user can act on the knock changes, so they should be
946-
// displayed
947-
if can_accept_or_decline_knocks {
948-
// We can only decide whether the user can accept or decline knocks if the
949-
// event isn't redacted.
950-
return matches!(member, SyncStateEvent::Original(_));
951-
}
952-
}
953-
954-
false
955-
}
930+
AnySyncTimelineEvent::State(state) => filter_any_sync_state_event(state, power_levels),
956931
}
957932
}
958933

@@ -993,6 +968,46 @@ fn filter_any_message_like_event_content(event: AnyMessageLikeEventContent) -> b
993968
}
994969
}
995970

971+
fn filter_any_sync_state_event(
972+
event: AnySyncStateEvent,
973+
power_levels: &Option<(&UserId, RoomPowerLevels)>,
974+
) -> bool {
975+
match event {
976+
AnySyncStateEvent::RoomMember(member) => {
977+
match member.membership() {
978+
MembershipState::Knock => {
979+
let can_accept_or_decline_knocks = match power_levels {
980+
Some((own_user_id, room_power_levels)) => {
981+
room_power_levels.user_can_invite(own_user_id)
982+
|| room_power_levels.user_can_kick(own_user_id)
983+
}
984+
_ => false,
985+
};
986+
987+
// The current user can act on the knock changes, so they should be
988+
// displayed
989+
if can_accept_or_decline_knocks {
990+
// We can only decide whether the user can accept or decline knocks if the
991+
// event isn't redacted.
992+
return matches!(member, SyncStateEvent::Original(_));
993+
}
994+
995+
false
996+
}
997+
998+
MembershipState::Invite => {
999+
// We can only decide whether the user is invited if the event isn't redacted.
1000+
matches!(member, SyncStateEvent::Original(_))
1001+
}
1002+
1003+
_ => false,
1004+
}
1005+
}
1006+
1007+
_ => false,
1008+
}
1009+
}
1010+
9961011
#[cfg(test)]
9971012
mod tests_latest_event_content {
9981013
use std::ops::Not;

0 commit comments

Comments
 (0)