Fixed pagination for your tenders in home

This commit is contained in:
llsajjad
2025-09-07 10:43:54 +03:30
parent cd827ecbe4
commit 468556acb3
11 changed files with 486 additions and 93 deletions
+54 -36
View File
@@ -14,7 +14,7 @@ class HomeViewModel with ChangeNotifier {
final HomeRepository _homeRepository;
HomeViewModel({required HomeRepository homeRepository})
: _homeRepository = homeRepository {
: _homeRepository = homeRepository {
init();
}
@@ -36,7 +36,6 @@ class HomeViewModel with ChangeNotifier {
bool _isLoadingMore = false;
bool _hasMore = true;
/// آیا الان در حالت Recommended هستیم یا YourTenders
bool _isRecommendedMode = false;
List<TenderData> get tenders => _tenders;
@@ -46,11 +45,11 @@ class HomeViewModel with ChangeNotifier {
void init() async {
await getApprovedStates();
await getYourTenders();
await getYourTenders(reset: true);
await getFeedbackStats();
}
Future<void> getHomeRecommandTenders({bool reset = false}) async {
Future<void> getHomeRecommendTenders({bool reset = false}) async {
if (_isLoadingMore || (!_hasMore && !reset)) {
return;
}
@@ -63,7 +62,7 @@ class HomeViewModel with ChangeNotifier {
_isLoadingMore = true;
_errorMessage = null;
_isRecommendedMode = true; // ✅ اینجا یعنی در حالت Recommended هستیم
_isRecommendedMode = true;
notifyListeners();
final result = await _homeRepository.getHomeRecommendedTenders(
@@ -94,38 +93,58 @@ class HomeViewModel with ChangeNotifier {
notifyListeners();
}
Future<void> getYourTenders() async {
_isLoading = true;
_isRecommendedMode = false; // ✅ وقتی YourTenders میاد → بدون pagination
notifyListeners();
final result = await _homeRepository.getYourTenders();
switch (result) {
case Ok<TenderApprovalsResponse>():
data = result.value;
_errorMessage = null;
if (data?.data?.tenders!.isEmpty ?? true) {
// اگه YourTenders خالی بود → برو سمت Recommended
await getHomeRecommandTenders(reset: true);
} else {
_tenders.clear();
_tenders.addAll(
data!.data!.tenders!.map((e) => e.tender).whereType<TenderData>(),
);
}
case Error<TenderApprovalsResponse>():
_errorMessage = result.error.toString();
await getHomeRecommandTenders(reset: true);
break;
}
_isLoading = false;
notifyListeners();
Future<void> getYourTenders({bool reset = false}) async {
if (_isLoadingMore || (!_hasMore && !reset)) {
return;
}
if (reset) {
_currentPage = 0;
_hasMore = true;
_tenders.clear();
}
_isLoadingMore = true;
_errorMessage = null;
_isRecommendedMode = false;
notifyListeners();
final result = await _homeRepository.getYourTenders(
limit: _pageSize,
offset: _currentPage * _pageSize,
);
switch (result) {
case Ok<TenderApprovalsResponse>():
data = result.value;
final tendersList = data?.data?.tenders ?? [];
final metadata = data?.data?.metadata;
if (tendersList.isNotEmpty) {
_tenders.addAll(
tendersList.map((e) => e.tender).whereType<TenderData>(),
);
_currentPage++;
if (metadata != null && (_currentPage >= metadata.pages!)) {
_hasMore = false;
}
} else {
_hasMore = false;
}
break;
case Error<TenderApprovalsResponse>():
_errorMessage = result.error.toString();
break;
}
_isLoadingMore = false;
notifyListeners();
}
Future<void> getApprovedStates() async {
_isLoading = true;
_errorMessage = null;
@@ -166,7 +185,6 @@ class HomeViewModel with ChangeNotifier {
notifyListeners();
}
// Calculation methods for progress bars
double get partnershipCount {
return tenderApprovalsStateResponse?.data?.partnershipCount?.toDouble() ??
0.0;