Skip to content

Commit 43bd738

Browse files
committed
chat-info-members: Load additional members on scrolling
1 parent ede80af commit 43bd738

File tree

1 file changed

+52
-14
lines changed

1 file changed

+52
-14
lines changed

src/session/content/chat_info_window.rs

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ mod imp {
2121
use super::*;
2222
use adw::subclass::prelude::AdwWindowImpl;
2323
use once_cell::sync::{Lazy, OnceCell};
24+
use std::cell::Cell;
2425

2526
#[derive(Debug, Default, CompositeTemplate)]
2627
#[template(resource = "/com/github/melix99/telegrand/ui/content-chat-info-window.ui")]
2728
pub(crate) struct ChatInfoWindow {
29+
pub(super) loading: Cell<bool>,
2830
pub(super) chat: OnceCell<Chat>,
2931
#[template_child]
3032
pub(super) toast_overlay: TemplateChild<adw::ToastOverlay>,
@@ -288,26 +290,62 @@ impl ChatInfoWindow {
288290

289291
if supergroup_full_info.can_get_members {
290292
imp.members_page.set_visible(true);
291-
spawn(clone!(@weak self as obj => async move {
292-
let limit = 200;
293-
let mut offset = 0;
294-
while let Ok(TdChatMembers(ChatMembers {members, total_count})) = functions::get_supergroup_members(
293+
294+
let limit = 100;
295+
296+
spawn(clone!(@to-owned imp => async move {
297+
imp.loading.set(true);
298+
let result = functions::get_supergroup_members(
295299
supergroup_id,
296300
None,
297-
offset,
301+
0,
298302
limit,
299303
client_id,
300-
).await
301-
{
302-
if offset > total_count {
303-
break;
304-
}
305-
306-
obj.append_members(members).await;
307-
308-
offset += limit;
304+
).await;
305+
if let Ok(TdChatMembers(ChatMembers {members, ..})) = result {
306+
imp.obj().append_members(members).await;
309307
}
308+
imp.loading.set(false);
310309
}));
310+
311+
imp.members_list
312+
.vadjustment()
313+
.unwrap()
314+
.connect_value_changed(clone!(@to-owned imp => move |vadjustment| {
315+
if !imp.loading.get() {
316+
317+
let value = vadjustment.value() + vadjustment.page_size();
318+
let upper = vadjustment.upper();
319+
320+
let offset = imp.members_list.model().unwrap().n_items() as i32;
321+
322+
if value / upper > 0.8 && upper - value < 2000.0 {
323+
324+
imp.loading.set(true);
325+
326+
spawn(clone!(@to-owned imp => async move {
327+
let result = functions::get_supergroup_members(
328+
supergroup_id,
329+
None,
330+
offset,
331+
limit,
332+
client_id,
333+
).await;
334+
if let Ok(TdChatMembers(ChatMembers {members, total_count})) = result {
335+
if offset >= total_count {
336+
// remove callback
337+
}
338+
339+
imp.obj().append_members(members).await;
340+
341+
imp.loading.set(false);
342+
} else {
343+
log::error!("can't load members {result:?}");
344+
}
345+
}))
346+
}
347+
}
348+
}));
311349
}
312350

313351
self.update_info_list_visibility();

0 commit comments

Comments
 (0)