made communities paginatable.

This commit is contained in:
Faris Armoush
2025-06-22 11:11:25 +03:00
parent 2f233db332
commit 51c088d998
8 changed files with 272 additions and 51 deletions

View File

@ -14,6 +14,8 @@ class CommunitiesBloc extends Bloc<CommunitiesEvent, CommunitiesState> {
}) : _communitiesService = communitiesService,
super(const CommunitiesState()) {
on<LoadCommunities>(_onLoadCommunities);
on<LoadMoreCommunities>(_onLoadMoreCommunities);
on<SearchCommunities>(_onSearchCommunities);
}
final CommunitiesService _communitiesService;
@ -23,24 +25,113 @@ class CommunitiesBloc extends Bloc<CommunitiesEvent, CommunitiesState> {
Emitter<CommunitiesState> emit,
) async {
try {
emit(const CommunitiesState(status: CommunitiesStatus.loading));
final communities = await _communitiesService.getCommunity(event.param);
emit(state.copyWith(status: CommunitiesStatus.loading));
final paginationResponse = await _communitiesService.getCommunity(event.param);
emit(
CommunitiesState(
status: CommunitiesStatus.success,
communities: communities,
communities: paginationResponse.communities,
hasNext: paginationResponse.hasNext,
currentPage: paginationResponse.page,
searchQuery: event.param.search,
),
);
} on APIException catch (e) {
emit(
CommunitiesState(
state.copyWith(
status: CommunitiesStatus.failure,
errorMessage: e.message,
),
);
} catch (e) {
emit(
state.copyWith(
status: CommunitiesStatus.failure,
errorMessage: e.toString(),
),
);
}
}
Future<void> _onLoadMoreCommunities(
LoadMoreCommunities event,
Emitter<CommunitiesState> emit,
) async {
if (!state.hasNext || state.isLoadingMore) return;
try {
emit(state.copyWith(isLoadingMore: true));
final param = LoadCommunitiesParam(
page: state.currentPage + 1,
search: state.searchQuery,
);
final paginationResponse = await _communitiesService.getCommunity(param);
final updatedCommunities = List<CommunityModel>.from(state.communities)
..addAll(paginationResponse.communities);
emit(
state.copyWith(
communities: updatedCommunities,
hasNext: paginationResponse.hasNext,
currentPage: paginationResponse.page,
isLoadingMore: false,
),
);
} on APIException catch (e) {
emit(
state.copyWith(
isLoadingMore: false,
errorMessage: e.message,
),
);
} catch (e) {
emit(
state.copyWith(
isLoadingMore: false,
errorMessage: e.toString(),
),
);
}
}
Future<void> _onSearchCommunities(
SearchCommunities event,
Emitter<CommunitiesState> emit,
) async {
try {
emit(state.copyWith(status: CommunitiesStatus.loading));
final param = LoadCommunitiesParam(
page: 1,
search: event.searchQuery,
);
final paginationResponse = await _communitiesService.getCommunity(param);
emit(
CommunitiesState(
status: CommunitiesStatus.success,
communities: paginationResponse.communities,
hasNext: paginationResponse.hasNext,
currentPage: paginationResponse.page,
searchQuery: event.searchQuery,
),
);
} on APIException catch (e) {
emit(
state.copyWith(
status: CommunitiesStatus.failure,
errorMessage: e.message,
),
);
} catch (e) {
emit(
state.copyWith(
status: CommunitiesStatus.failure,
errorMessage: e.toString(),
),

View File

@ -15,3 +15,19 @@ class LoadCommunities extends CommunitiesEvent {
@override
List<Object?> get props => [param];
}
class LoadMoreCommunities extends CommunitiesEvent {
const LoadMoreCommunities();
@override
List<Object?> get props => [];
}
class SearchCommunities extends CommunitiesEvent {
const SearchCommunities(this.searchQuery);
final String searchQuery;
@override
List<Object?> get props => [searchQuery];
}

View File

@ -7,12 +7,48 @@ final class CommunitiesState extends Equatable {
this.status = CommunitiesStatus.initial,
this.communities = const [],
this.errorMessage,
this.isLoadingMore = false,
this.hasNext = false,
this.currentPage = 1,
this.searchQuery = '',
});
final CommunitiesStatus status;
final List<CommunityModel> communities;
final String? errorMessage;
final bool isLoadingMore;
final bool hasNext;
final int currentPage;
final String searchQuery;
CommunitiesState copyWith({
CommunitiesStatus? status,
List<CommunityModel>? communities,
String? errorMessage,
bool? isLoadingMore,
bool? hasNext,
int? currentPage,
String? searchQuery,
}) {
return CommunitiesState(
status: status ?? this.status,
communities: communities ?? this.communities,
errorMessage: errorMessage ?? this.errorMessage,
isLoadingMore: isLoadingMore ?? this.isLoadingMore,
hasNext: hasNext ?? this.hasNext,
currentPage: currentPage ?? this.currentPage,
searchQuery: searchQuery ?? this.searchQuery,
);
}
@override
List<Object?> get props => [status, communities, errorMessage];
List<Object?> get props => [
status,
communities,
errorMessage,
isLoadingMore,
hasNext,
currentPage,
searchQuery,
];
}