changed pagination in liked tenders tanlet and web

This commit is contained in:
llsajjad
2025-09-03 13:16:57 +03:30
parent ed80b54bef
commit faab29cd99
5 changed files with 344 additions and 210 deletions
+71 -54
View File
@@ -17,67 +17,75 @@ class LikedTendersViewModel with ChangeNotifier {
LikedTendersResponse? data;
int _offset = 0;
final int _limit = 20;
final int _limit = 7;
Future<void> getLikedTenders({bool reset = false}) async {
if (!reset && (isLoadingMore || !hasMore)) {
return;
}
int currentPage = 1;
if (reset) {
_offset = 0;
hasMore = true;
}
Future<void> getLikedTenders({bool reset = false}) async {
if (!reset && (isLoadingMore || !hasMore)) {
return;
}
if (reset) {
_offset = (currentPage - 1) * _limit;
hasMore = true;
data = null;
isLoading = true;
notifyListeners();
} else {
if (_offset == 0) {
isLoading = true;
} else {
isLoadingMore = true;
}
errorMessage = null;
notifyListeners();
final result = await likedTendersRepository.getLikedTenders(
offset: _offset,
limit: _limit,
);
switch (result) {
case Ok<LikedTendersResponse>():
final incoming = result.value;
final incomingList = incoming.data?.feedback ?? [];
if (reset || data == null) {
data = incoming;
} else {
final existingList = data!.data!.feedback ?? [];
final combined = List<LikedTenderFeedback>.of(existingList)
..addAll(incomingList);
final newMeta = incoming.data?.meta ?? data!.data!.meta;
data = data!.copyWith(
data: data!.data!.copyWith(feedback: combined, meta: newMeta),
);
}
// چون offset بر اساس limit حرکت می‌کنه
hasMore = incomingList.length == _limit;
_offset += _limit;
errorMessage = null;
break;
case Error<LikedTendersResponse>():
errorMessage = result.error.toString();
break;
}
isLoading = false;
isLoadingMore = false;
notifyListeners();
}
errorMessage = null;
final result = await likedTendersRepository.getLikedTenders(
offset: _offset,
limit: _limit,
);
switch (result) {
case Ok<LikedTendersResponse>():
final incoming = result.value;
final incomingList = incoming.data?.feedback ?? [];
if (reset) {
data = incoming;
} else {
final existingList = data?.data?.feedback ?? [];
final combined = List<LikedTenderFeedback>.of(existingList)
..addAll(incomingList);
data = data?.copyWith(
data: data?.data?.copyWith(
feedback: combined,
meta: incoming.data?.meta ?? data!.data!.meta,
),
);
}
hasMore = incomingList.length == _limit;
_offset += _limit;
errorMessage = null;
break;
case Error<LikedTendersResponse>():
errorMessage = result.error.toString();
break;
}
isLoading = false;
isLoadingMore = false;
notifyListeners();
}
Future<void> loadMoreIfNeeded() async {
if (isLoadingMore || !hasMore) {
return;
@@ -85,6 +93,13 @@ class LikedTendersViewModel with ChangeNotifier {
await getLikedTenders(reset: false);
}
Future<void> jumpToPage(int page) async {
currentPage = page;
_offset = (page - 1) * _limit;
hasMore = true;
await getLikedTenders(reset: true);
}
void removeTenderById(String id) {
final current = data;
final list = current?.data?.feedback;
@@ -92,14 +107,16 @@ class LikedTendersViewModel with ChangeNotifier {
return;
}
final List<LikedTenderFeedback> updatedList = List<LikedTenderFeedback>.of(
list,
)..removeWhere((e) => e.id == id);
final updatedList = List<LikedTenderFeedback>.of(list)
..removeWhere((e) => e.id == id);
final updatedMeta = current.data?.meta?.copyWith(total: updatedList.length);
data = current.copyWith(
data: current.data?.copyWith(feedback: updatedList, meta: updatedMeta),
data: current.data?.copyWith(
feedback: updatedList,
meta: updatedMeta,
),
);
notifyListeners();