This commit is contained in:
2025-10-10 22:49:05 +07:00
parent 02941e2234
commit 38c16bf0b9
49 changed files with 2702 additions and 740 deletions

View File

@@ -0,0 +1,104 @@
/// Generic API Response wrapper
///
/// Wraps all API responses in a consistent format with success status,
/// data payload, optional message, and optional pagination metadata.
class ApiResponse<T> {
final bool success;
final T data;
final String? message;
final PaginationMeta? meta;
const ApiResponse({
required this.success,
required this.data,
this.message,
this.meta,
});
/// Create from JSON with a data parser function
factory ApiResponse.fromJson(
Map<String, dynamic> json,
T Function(dynamic) dataParser,
) {
return ApiResponse(
success: json['success'] as bool? ?? false,
data: dataParser(json['data']),
message: json['message'] as String?,
meta: json['meta'] != null
? PaginationMeta.fromJson(json['meta'] as Map<String, dynamic>)
: null,
);
}
/// Convert to JSON
Map<String, dynamic> toJson(dynamic Function(T) dataSerializer) {
return {
'success': success,
'data': dataSerializer(data),
if (message != null) 'message': message,
if (meta != null) 'meta': meta!.toJson(),
};
}
}
/// Pagination metadata
class PaginationMeta {
final int page;
final int limit;
final int total;
final int totalPages;
final bool hasPreviousPage;
final bool hasNextPage;
const PaginationMeta({
required this.page,
required this.limit,
required this.total,
required this.totalPages,
required this.hasPreviousPage,
required this.hasNextPage,
});
/// Create from JSON
factory PaginationMeta.fromJson(Map<String, dynamic> json) {
return PaginationMeta(
page: json['page'] as int,
limit: json['limit'] as int,
total: json['total'] as int,
totalPages: json['totalPages'] as int,
hasPreviousPage: json['hasPreviousPage'] as bool,
hasNextPage: json['hasNextPage'] as bool,
);
}
/// Convert to JSON
Map<String, dynamic> toJson() {
return {
'page': page,
'limit': limit,
'total': total,
'totalPages': totalPages,
'hasPreviousPage': hasPreviousPage,
'hasNextPage': hasNextPage,
};
}
/// Create a copy with updated fields
PaginationMeta copyWith({
int? page,
int? limit,
int? total,
int? totalPages,
bool? hasPreviousPage,
bool? hasNextPage,
}) {
return PaginationMeta(
page: page ?? this.page,
limit: limit ?? this.limit,
total: total ?? this.total,
totalPages: totalPages ?? this.totalPages,
hasPreviousPage: hasPreviousPage ?? this.hasPreviousPage,
hasNextPage: hasNextPage ?? this.hasNextPage,
);
}
}

View File

@@ -4,5 +4,6 @@
library;
export 'api_interceptor.dart';
export 'api_response.dart';
export 'dio_client.dart';
export 'network_info.dart';