@@ -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