added pagination in your tenders and some fixes
This commit is contained in:
@@ -14,7 +14,7 @@ class HomeViewModel with ChangeNotifier {
|
||||
final HomeRepository _homeRepository;
|
||||
|
||||
HomeViewModel({required HomeRepository homeRepository})
|
||||
: _homeRepository = homeRepository {
|
||||
: _homeRepository = homeRepository {
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class HomeViewModel with ChangeNotifier {
|
||||
TenderApprovalsStateResponse? tenderApprovalsStateResponse;
|
||||
FeedbackStats? feedbackStats;
|
||||
final List<TenderData> _tenders = [];
|
||||
final int _pageSize = 20;
|
||||
final int _pageSize = 10;
|
||||
int _currentPage = 0;
|
||||
bool _isLoadingMore = false;
|
||||
bool _hasMore = true;
|
||||
@@ -44,9 +44,15 @@ class HomeViewModel with ChangeNotifier {
|
||||
bool get isRecommendedMode => _isRecommendedMode;
|
||||
|
||||
void init() async {
|
||||
_isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
await getApprovedStates();
|
||||
await getYourTenders(reset: true);
|
||||
await getFeedbackStats();
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getHomeRecommendTenders({bool reset = false}) async {
|
||||
@@ -93,62 +99,59 @@ class HomeViewModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getYourTenders({bool reset = false}) async {
|
||||
if (_isLoadingMore || (!_hasMore && !reset)) {
|
||||
return;
|
||||
}
|
||||
Future<void> getYourTenders({bool reset = false}) async {
|
||||
if (_isLoadingMore || (!_hasMore && !reset)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (reset) {
|
||||
_currentPage = 0;
|
||||
_hasMore = true;
|
||||
_tenders.clear();
|
||||
}
|
||||
if (reset) {
|
||||
_currentPage = 0;
|
||||
_hasMore = true;
|
||||
_tenders.clear();
|
||||
}
|
||||
|
||||
_isLoadingMore = true;
|
||||
_errorMessage = null;
|
||||
_isRecommendedMode = false;
|
||||
notifyListeners();
|
||||
_isLoadingMore = true;
|
||||
_errorMessage = null;
|
||||
_isRecommendedMode = false;
|
||||
notifyListeners();
|
||||
|
||||
final result = await _homeRepository.getYourTenders(
|
||||
limit: _pageSize,
|
||||
offset: _currentPage * _pageSize,
|
||||
);
|
||||
final result = await _homeRepository.getYourTenders(
|
||||
limit: _pageSize,
|
||||
offset: _currentPage * _pageSize,
|
||||
);
|
||||
|
||||
switch (result) {
|
||||
case Ok<TenderApprovalsResponse>():
|
||||
data = result.value;
|
||||
switch (result) {
|
||||
case Ok<TenderApprovalsResponse>():
|
||||
data = result.value;
|
||||
|
||||
final tendersList = data?.data?.tenders ?? [];
|
||||
final metadata = data?.data?.metadata;
|
||||
final tendersList = data?.data?.tenders ?? [];
|
||||
final metadata = data?.data?.metadata;
|
||||
|
||||
if (tendersList.isNotEmpty) {
|
||||
_tenders.addAll(
|
||||
tendersList.map((e) => e.tender).whereType<TenderData>(),
|
||||
);
|
||||
_currentPage++;
|
||||
if (tendersList.isNotEmpty) {
|
||||
_tenders.addAll(
|
||||
tendersList.map((e) => e.tender).whereType<TenderData>(),
|
||||
);
|
||||
_currentPage++;
|
||||
|
||||
if (metadata != null && (_currentPage >= metadata.pages!)) {
|
||||
if (metadata != null && (_currentPage >= metadata.pages!)) {
|
||||
_hasMore = false;
|
||||
}
|
||||
} else {
|
||||
_hasMore = false;
|
||||
}
|
||||
} else {
|
||||
_hasMore = false;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case Error<TenderApprovalsResponse>():
|
||||
_errorMessage = result.error.toString();
|
||||
break;
|
||||
case Error<TenderApprovalsResponse>():
|
||||
_errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
_isLoadingMore = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
_isLoadingMore = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
||||
Future<void> getApprovedStates() async {
|
||||
_isLoading = true;
|
||||
_errorMessage = null;
|
||||
notifyListeners();
|
||||
|
||||
final result = await _homeRepository.getTendersApprovalsState();
|
||||
|
||||
@@ -160,15 +163,10 @@ Future<void> getYourTenders({bool reset = false}) async {
|
||||
_errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getFeedbackStats() async {
|
||||
_isLoading = true;
|
||||
_errorMessage = null;
|
||||
notifyListeners();
|
||||
|
||||
final result = await _homeRepository.getFeedbackStats();
|
||||
|
||||
@@ -180,9 +178,6 @@ Future<void> getYourTenders({bool reset = false}) async {
|
||||
_errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
double get partnershipCount {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user