Extracted pagination data into a generic DTO.

This commit is contained in:
Faris Armoush
2025-06-22 16:00:20 +03:00
parent 28ac911f3f
commit 41d4fbb555
6 changed files with 53 additions and 75 deletions

View File

@ -0,0 +1,45 @@
import 'package:equatable/equatable.dart';
class PaginatedDataModel<T> extends Equatable {
const PaginatedDataModel({
required this.data,
required this.page,
required this.size,
required this.hasNext,
required this.totalItems,
required this.totalPages,
});
final List<T> data;
final int page;
final int size;
final bool hasNext;
final int totalItems;
final int totalPages;
factory PaginatedDataModel.fromJson(
Map<String, dynamic> json,
T Function(Map<String, dynamic>) fromJsonT,
) {
return PaginatedDataModel<T>(
data: (json['data'] as List<dynamic>? ?? [])
.map((e) => fromJsonT(e as Map<String, dynamic>))
.toList(),
page: json['page'] as int? ?? 1,
size: json['size'] as int? ?? 25,
hasNext: json['hasNext'] as bool? ?? false,
totalItems: json['totalItem'] as int? ?? 0,
totalPages: json['totalPage'] as int? ?? 0,
);
}
@override
List<Object?> get props => [
data,
page,
size,
hasNext,
totalItems,
totalPages,
];
}

View File

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/communities_pagination_model.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart';

View File

@ -1,6 +1,6 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/communities_pagination_model.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/services/communities_service.dart';
import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/api_exception.dart';
@ -30,7 +30,7 @@ class RemoteCommunitiesService implements CommunitiesService {
}, },
expectedResponseModel: (json) { expectedResponseModel: (json) {
final data = json as Map<String, dynamic>; final data = json as Map<String, dynamic>;
return CommunitiesPaginationModel.fromJson(data); return CommunitiesPaginationModel.fromJson(data, CommunityModel.fromJson);
}, },
); );

View File

@ -1,69 +0,0 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart';
class CommunitiesPaginationModel extends Equatable {
const CommunitiesPaginationModel({
required this.communities,
required this.page,
required this.size,
required this.hasNext,
required this.totalItems,
required this.totalPages,
});
final List<CommunityModel> communities;
final int page;
final int size;
final bool hasNext;
final int totalItems;
final int totalPages;
const CommunitiesPaginationModel.empty()
: communities = const [],
page = 1,
size = 25,
hasNext = false,
totalItems = 0,
totalPages = 0;
factory CommunitiesPaginationModel.fromJson(Map<String, dynamic> json) {
return CommunitiesPaginationModel(
communities: (json['data'] as List<dynamic>? ?? [])
.map((e) => CommunityModel.fromJson(e as Map<String, dynamic>))
.toList(),
page: json['page'] as int? ?? 1,
size: json['size'] as int? ?? 25,
hasNext: json['hasNext'] as bool? ?? false,
totalItems: json['totalItem'] as int? ?? 0,
totalPages: json['totalPage'] as int? ?? 0,
);
}
CommunitiesPaginationModel copyWith({
List<CommunityModel>? communities,
int? page,
int? size,
bool? hasNext,
int? totalItems,
int? totalPages,
}) {
return CommunitiesPaginationModel(
communities: communities ?? this.communities,
page: page ?? this.page,
size: size ?? this.size,
hasNext: hasNext ?? this.hasNext,
totalItems: totalItems ?? this.totalItems,
totalPages: totalPages ?? this.totalPages,
);
}
@override
List<Object?> get props => [
communities,
page,
size,
hasNext,
totalItems,
totalPages,
];
}

View File

@ -1,6 +1,9 @@
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/communities_pagination_model.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/shared/models/paginated_data_model.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/models/community_model.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart';
typedef CommunitiesPaginationModel = PaginatedDataModel<CommunityModel>;
abstract class CommunitiesService { abstract class CommunitiesService {
Future<CommunitiesPaginationModel> getCommunity(LoadCommunitiesParam param); Future<CommunitiesPaginationModel> getCommunity(LoadCommunitiesParam param);
} }

View File

@ -36,7 +36,7 @@ class CommunitiesBloc extends Bloc<CommunitiesEvent, CommunitiesState> {
emit( emit(
CommunitiesState( CommunitiesState(
status: CommunitiesStatus.success, status: CommunitiesStatus.success,
communities: paginationResponse.communities, communities: paginationResponse.data,
hasNext: paginationResponse.hasNext, hasNext: paginationResponse.hasNext,
currentPage: paginationResponse.page, currentPage: paginationResponse.page,
searchQuery: event.param.search, searchQuery: event.param.search,
@ -67,7 +67,7 @@ class CommunitiesBloc extends Bloc<CommunitiesEvent, CommunitiesState> {
final paginationResponse = await _communitiesService.getCommunity(param); final paginationResponse = await _communitiesService.getCommunity(param);
final updatedCommunities = List<CommunityModel>.from(state.communities) final updatedCommunities = List<CommunityModel>.from(state.communities)
..addAll(paginationResponse.communities); ..addAll(paginationResponse.data);
emit( emit(
state.copyWith( state.copyWith(