added pagination in your tenders and some fixes

This commit is contained in:
amirrezaghabeli
2025-09-07 12:15:43 +03:30
parent dd31c54cff
commit cd32bbd812
12 changed files with 313 additions and 448 deletions
+108 -10
View File
@@ -20,6 +20,12 @@ class YourTendersViewModel with ChangeNotifier {
int _offset = 0;
final int _limit = 10;
String? _currentFeedbackType;
// Pagination state for tenders
bool isLoadingMoreTenders = false;
bool hasMoreTenders = true;
int _tendersOffset = 0;
final int _tendersLimit = 10;
// Filter States
DateTimeRange? selectedDateRange;
String selectedStatus = 'All';
@@ -48,20 +54,53 @@ class YourTendersViewModel with ChangeNotifier {
Future<void> getApprovedTenders({
required int limit,
required int offset,
bool reset = false,
}) async {
isLoading = true;
if (!reset && (isLoadingMoreTenders || !hasMoreTenders)) {
return;
}
if (reset) {
_tendersOffset = 0;
hasMoreTenders = true;
data = null;
}
if (_tendersOffset == 0) {
isLoading = true;
} else {
isLoadingMoreTenders = true;
}
notifyListeners();
final result = await yourTendersRepository.getApprovedTenders(
limit: limit,
offset: offset,
limit: _tendersLimit,
offset: _tendersOffset,
createdFrom: startDateUnix,
createdTo: endDateUnix,
);
switch (result) {
case Ok<TenderApprovalsResponse>():
data = result.value;
final incoming = result.value;
final incomingList = incoming.data?.tenders ?? [];
if (reset || data == null) {
data = incoming;
} else {
final existingList = data!.data?.tenders ?? [];
final combined = List.of(existingList)..addAll(incomingList);
final newMetadata = incoming.data?.metadata ?? data!.data?.metadata;
data = data!.copyWith(
data: data!.data!.copyWith(
tenders: combined,
metadata: newMetadata,
),
);
}
hasMoreTenders = incomingList.length == _tendersLimit;
_tendersOffset += _tendersLimit;
errorMessage = null;
break;
case Error<TenderApprovalsResponse>():
@@ -70,6 +109,7 @@ class YourTendersViewModel with ChangeNotifier {
}
isLoading = false;
isLoadingMoreTenders = false;
notifyListeners();
}
@@ -78,19 +118,53 @@ class YourTendersViewModel with ChangeNotifier {
required int offset,
required String createdFrom,
required String createdTo,
bool reset = false,
}) async {
isLoading = true;
if (!reset && (isLoadingMoreTenders || !hasMoreTenders)) {
return;
}
if (reset) {
_tendersOffset = 0;
hasMoreTenders = true;
data = null;
}
if (_tendersOffset == 0) {
isLoading = true;
} else {
isLoadingMoreTenders = true;
}
notifyListeners();
final result = await yourTendersRepository.getTenders(
limit: limit,
offset: offset,
limit: _tendersLimit,
offset: _tendersOffset,
createdFrom: createdFrom,
createdTo: createdTo,
);
switch (result) {
case Ok<TenderApprovalsResponse>():
data = result.value;
final incoming = result.value;
final incomingList = incoming.data?.tenders ?? [];
if (reset || data == null) {
data = incoming;
} else {
final existingList = data!.data?.tenders ?? [];
final combined = List.of(existingList)..addAll(incomingList);
final newMetadata = incoming.data?.metadata ?? data!.data?.metadata;
data = data!.copyWith(
data: data!.data!.copyWith(
tenders: combined,
metadata: newMetadata,
),
);
}
hasMoreTenders = incomingList.length == _tendersLimit;
_tendersOffset += _tendersLimit;
errorMessage = null;
break;
case Error<TenderApprovalsResponse>():
@@ -99,6 +173,7 @@ class YourTendersViewModel with ChangeNotifier {
}
isLoading = false;
isLoadingMoreTenders = false;
notifyListeners();
}
@@ -171,6 +246,28 @@ class YourTendersViewModel with ChangeNotifier {
await getTendersFeedback(feedbackType: _currentFeedbackType!, reset: false);
}
Future<void> loadMoreTenders() async {
if (isLoadingMoreTenders || !hasMoreTenders) {
return;
}
if (selectedStatus == YourTendersStrings.all) {
await getTenders(
limit: _tendersLimit,
offset: _tendersOffset,
createdFrom: startDateUnix,
createdTo: endDateUnix,
reset: false,
);
} else if (selectedStatus == YourTendersStrings.tendersSubmitted) {
await getApprovedTenders(
limit: _tendersLimit,
offset: _tendersOffset,
reset: false,
);
}
}
// --- Filter Actions ---
void setDateRange(DateTimeRange? range) {
selectedDateRange = range;
@@ -191,13 +288,14 @@ class YourTendersViewModel with ChangeNotifier {
Future<void> callWithFilter() async {
if (selectedStatus == YourTendersStrings.all) {
await getTenders(
limit: 10,
limit: _tendersLimit,
offset: 0,
createdFrom: startDateUnix,
createdTo: endDateUnix,
reset: true,
);
} else if (selectedStatus == YourTendersStrings.tendersSubmitted) {
await getApprovedTenders(limit: 10, offset: 0);
await getApprovedTenders(limit: _tendersLimit, offset: 0, reset: true);
} else if (selectedStatus == YourTendersStrings.likeTenders) {
await getTendersFeedback(feedbackType: 'like', reset: true);
} else if (selectedStatus == YourTendersStrings.dislikeTenders) {