diff --git a/src/session/content/room_history.rs b/src/session/content/room_history.rs index 212a1274..570cc3e0 100644 --- a/src/session/content/room_history.rs +++ b/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 diff --git a/src/session/room/room.rs b/src/session/room/room.rs index dfa47d44..78e91b7c 100644 --- a/src/session/room/room.rs +++ b/src/session/room/room.rs @@ -57,6 +57,7 @@ mod imp { pub room_members: RefCell>, /// The user who sent the invite to this room. This is only set when this room is an invitiation. pub inviter: RefCell>, + pub members_loaded: Cell, } #[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) + }, }; }), );