Browse Source

room: Load members only when the room is displayed

Loading members for all rooms at the app start makes the app hange and
is pretty slow, therefore only load the members once the room is opened
by the user.
merge-requests/1327/merge
Julian Sparber 5 years ago
parent
commit
7a93447d28
  1. 1
      src/session/content/room_history.rs
  2. 16
      src/session/room/room.rs

1
src/session/content/room_history.rs

@ -248,6 +248,7 @@ impl RoomHistory {
);
priv_.empty_timeline_handler.replace(Some(handler_id));
room.load_members();
}
// TODO: use gtk::MultiSelection to allow selection

16
src/session/room/room.rs

@ -57,6 +57,7 @@ mod imp {
pub room_members: RefCell<HashMap<UserId, User>>,
/// The user who sent the invite to this room. This is only set when this room is an invitiation.
pub inviter: RefCell<Option<User>>,
pub members_loaded: Cell<bool>,
}
#[glib::object_subclass]
@ -261,7 +262,6 @@ impl Room {
priv_.matrix_room.replace(Some(matrix_room));
self.load_members();
self.load_display_name();
self.load_category();
}
@ -593,16 +593,26 @@ impl Room {
user.update_from_member_event(event);
}
fn load_members(&self) {
pub fn load_members(&self) {
let priv_ = imp::Room::from_instance(self);
if priv_.members_loaded.get() {
return;
}
priv_.members_loaded.set(true);
let matrix_room = self.matrix_room();
do_async(
glib::PRIORITY_LOW,
async move { matrix_room.active_members().await },
clone!(@weak self as obj => move |members| async move {
// FIXME: We should retry to load the room members if the request failed
let priv_ = imp::Room::from_instance(&obj);
match members {
Ok(members) => obj.add_members(members),
Err(error) => error!("Couldn’t load room members: {}", error),
Err(error) => {
priv_.members_loaded.set(false);
error!("Couldn’t load room members: {}", error)
},
};
}),
);

Loading…
Cancel
Save