@@ -21,10 +21,12 @@ mod imp {
21
21
use super :: * ;
22
22
use adw:: subclass:: prelude:: AdwWindowImpl ;
23
23
use once_cell:: sync:: { Lazy , OnceCell } ;
24
+ use std:: cell:: Cell ;
24
25
25
26
#[ derive( Debug , Default , CompositeTemplate ) ]
26
27
#[ template( resource = "/com/github/melix99/telegrand/ui/content-chat-info-window.ui" ) ]
27
28
pub ( crate ) struct ChatInfoWindow {
29
+ pub ( super ) loading : Cell < bool > ,
28
30
pub ( super ) chat : OnceCell < Chat > ,
29
31
#[ template_child]
30
32
pub ( super ) toast_overlay : TemplateChild < adw:: ToastOverlay > ,
@@ -288,26 +290,62 @@ impl ChatInfoWindow {
288
290
289
291
if supergroup_full_info. can_get_members {
290
292
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(
295
299
supergroup_id,
296
300
None ,
297
- offset ,
301
+ 0 ,
298
302
limit,
299
303
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 ;
309
307
}
308
+ imp. loading. set( false ) ;
310
309
} ) ) ;
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
+ } ) ) ;
311
349
}
312
350
313
351
self . update_info_list_visibility ( ) ;
0 commit comments