From b79ab06d9523ff11058be8e12a1c1aed30cf2a9d Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Sun, 22 Jun 2025 12:46:17 +0300 Subject: [PATCH] shows a loading indicator when loading. --- .../debounced_communities_service.dart | 6 +-- .../presentation/bloc/communities_bloc.dart | 12 +++++- .../space_management_communities_tree.dart | 41 +++++++++++++------ ...e_management_sidebar_communities_list.dart | 2 - 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/lib/pages/space_management_v2/modules/communities/data/services/debounced_communities_service.dart b/lib/pages/space_management_v2/modules/communities/data/services/debounced_communities_service.dart index ca1923f9..e512679b 100644 --- a/lib/pages/space_management_v2/modules/communities/data/services/debounced_communities_service.dart +++ b/lib/pages/space_management_v2/modules/communities/data/services/debounced_communities_service.dart @@ -14,7 +14,7 @@ final class DebouncedCommunitiesService implements CommunitiesService { final Duration debounceDuration; Timer? _debounceTimer; - Completer? _completer; + late Completer? _completer; @override Future getCommunity( @@ -22,10 +22,6 @@ final class DebouncedCommunitiesService implements CommunitiesService { ) async { _debounceTimer?.cancel(); - if (_completer != null && !_completer!.isCompleted) { - _completer!.completeError(Exception('Request cancelled by newer request')); - } - _completer = Completer(); final currentCompleter = _completer!; diff --git a/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart index 53eb9d3f..ef91baa2 100644 --- a/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart +++ b/lib/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart @@ -24,9 +24,13 @@ class CommunitiesBloc extends Bloc { Emitter emit, ) async { try { - emit(state.copyWith(status: CommunitiesStatus.loading)); + emit( + state.copyWith(status: CommunitiesStatus.loading), + ); - final paginationResponse = await _communitiesService.getCommunity(event.param); + final paginationResponse = await _communitiesService.getCommunity( + event.param, + ); emit( CommunitiesState( @@ -35,6 +39,7 @@ class CommunitiesBloc extends Bloc { hasNext: paginationResponse.hasNext, currentPage: paginationResponse.page, searchQuery: event.param.search, + isLoadingMore: false, ), ); } on APIException catch (e) { @@ -65,6 +70,7 @@ class CommunitiesBloc extends Bloc { emit( state.copyWith( + status: CommunitiesStatus.success, communities: updatedCommunities, hasNext: paginationResponse.hasNext, currentPage: paginationResponse.page, @@ -84,6 +90,7 @@ class CommunitiesBloc extends Bloc { ) { emit( state.copyWith( + status: CommunitiesStatus.failure, isLoadingMore: false, errorMessage: e.message, ), @@ -93,6 +100,7 @@ class CommunitiesBloc extends Bloc { void _onError(Object e, Emitter emit) { emit( state.copyWith( + status: CommunitiesStatus.failure, isLoadingMore: false, errorMessage: e.toString(), ), diff --git a/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_communities_tree.dart b/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_communities_tree.dart index b9902bd6..4501cf7e 100644 --- a/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_communities_tree.dart +++ b/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_communities_tree.dart @@ -42,11 +42,9 @@ class _SpaceManagementCommunitiesTreeState } void _onSearchChanged(String searchQuery) { - context.read().add( - LoadCommunities(LoadCommunitiesParam( - search: searchQuery.trim(), - )), - ); + context + .read() + .add(LoadCommunities(LoadCommunitiesParam(search: searchQuery.trim()))); } void _onLoadMore() { @@ -80,6 +78,13 @@ class _SpaceManagementCommunitiesTreeState CommunitiesStatus.success => _buildCommunitiesTree(context, state), CommunitiesStatus.failure => _buildErrorState(context, state), }, + Visibility( + visible: state.isLoadingMore, + child: const Padding( + padding: EdgeInsets.all(8.0), + child: Center(child: CircularProgressIndicator()), + ), + ), ], ), ); @@ -132,14 +137,24 @@ class _SpaceManagementCommunitiesTreeState } return Expanded( - child: SpaceManagementSidebarCommunitiesList( - communities: state.communities, - onLoadMore: state.hasNext ? _onLoadMore : null, - isLoadingMore: state.isLoadingMore, - hasNext: state.hasNext, - itemBuilder: (context, index) { - return _buildCommunityTile(context, state.communities[index]); - }, + child: Stack( + children: [ + SpaceManagementSidebarCommunitiesList( + communities: state.communities, + onLoadMore: state.hasNext ? _onLoadMore : null, + isLoadingMore: state.isLoadingMore, + hasNext: state.hasNext, + itemBuilder: (context, index) { + return _buildCommunityTile(context, state.communities[index]); + }, + ), + if (state.status == CommunitiesStatus.loading && + state.communities.isNotEmpty) + ColoredBox( + color: Colors.white.withValues(alpha: 0.7), + child: const Center(child: CircularProgressIndicator()), + ), + ], ), ); } diff --git a/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_sidebar_communities_list.dart b/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_sidebar_communities_list.dart index 68119dcd..40766be5 100644 --- a/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_sidebar_communities_list.dart +++ b/lib/pages/space_management_v2/modules/communities/presentation/widgets/space_management_sidebar_communities_list.dart @@ -37,7 +37,6 @@ class _SpaceManagementSidebarCommunitiesListState void _onScroll() { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 100) { - // Trigger pagination when user is close to the bottom if (widget.hasNext && !widget.isLoadingMore && widget.onLoadMore != null) { widget.onLoadMore!(); } @@ -67,7 +66,6 @@ class _SpaceManagementSidebarCommunitiesListState @override Widget build(BuildContext context) { - // Calculate item count including loading indicator final itemCount = widget.communities.length + (widget.isLoadingMore ? 1 : 0); return SingleChildScrollView(