filters in your tenders fixed
This commit is contained in:
@@ -2,7 +2,9 @@ import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:tm_app/core/utils/result.dart';
|
||||
import 'package:tm_app/data/repositories/your_tenders_repository.dart';
|
||||
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
|
||||
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
|
||||
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
|
||||
|
||||
class YourTendersViewModel with ChangeNotifier {
|
||||
final YourTendersRepository yourTendersRepository;
|
||||
@@ -11,7 +13,13 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
bool isLoading = false;
|
||||
String? errorMessage;
|
||||
TenderApprovalsResponse? data;
|
||||
|
||||
LikedTendersResponse? likedTendersData;
|
||||
// Pagination state for feedback lists
|
||||
bool isLoadingMore = false;
|
||||
bool hasMore = true;
|
||||
int _offset = 0;
|
||||
final int _limit = 10;
|
||||
String? _currentFeedbackType;
|
||||
// Filter States
|
||||
DateTimeRange? selectedDateRange;
|
||||
String selectedStatus = 'All';
|
||||
@@ -27,21 +35,29 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
? _fmt.format(selectedDateRange!.end)
|
||||
: 'YYYY/MM/DD';
|
||||
|
||||
int get startDateUnix =>
|
||||
String get startDateUnix =>
|
||||
selectedDateRange?.start != null
|
||||
? selectedDateRange!.start.millisecondsSinceEpoch ~/ 1000
|
||||
: 0;
|
||||
? (selectedDateRange!.start.millisecondsSinceEpoch ~/ 1000).toString()
|
||||
: '';
|
||||
|
||||
int get endDateUnix =>
|
||||
String get endDateUnix =>
|
||||
selectedDateRange?.end != null
|
||||
? selectedDateRange!.end.millisecondsSinceEpoch ~/ 1000
|
||||
: 0;
|
||||
? (selectedDateRange!.end.millisecondsSinceEpoch ~/ 1000).toString()
|
||||
: '';
|
||||
|
||||
Future<void> getApprovedTenders() async {
|
||||
Future<void> getApprovedTenders({
|
||||
required int limit,
|
||||
required int offset,
|
||||
}) async {
|
||||
isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
final result = await yourTendersRepository.getApprovedTenders();
|
||||
final result = await yourTendersRepository.getApprovedTenders(
|
||||
limit: limit,
|
||||
offset: offset,
|
||||
createdFrom: startDateUnix,
|
||||
createdTo: endDateUnix,
|
||||
);
|
||||
|
||||
switch (result) {
|
||||
case Ok<TenderApprovalsResponse>():
|
||||
@@ -86,6 +102,75 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getTendersFeedback({
|
||||
required String feedbackType,
|
||||
bool reset = false,
|
||||
}) async {
|
||||
if (reset) {
|
||||
_offset = 0;
|
||||
hasMore = true;
|
||||
_currentFeedbackType = feedbackType;
|
||||
}
|
||||
|
||||
if (!reset && (isLoadingMore || !hasMore)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_offset == 0) {
|
||||
isLoading = true;
|
||||
} else {
|
||||
isLoadingMore = true;
|
||||
}
|
||||
notifyListeners();
|
||||
|
||||
final result = await yourTendersRepository.getTendersFeedback(
|
||||
limit: _limit,
|
||||
offset: _offset,
|
||||
feedbackType: _currentFeedbackType ?? feedbackType,
|
||||
dateFrom: startDateUnix,
|
||||
dateTo: endDateUnix,
|
||||
);
|
||||
|
||||
switch (result) {
|
||||
case Ok<LikedTendersResponse>():
|
||||
final incoming = result.value;
|
||||
final incomingList = incoming.data?.feedback ?? [];
|
||||
|
||||
if (reset || likedTendersData == null) {
|
||||
likedTendersData = incoming;
|
||||
} else {
|
||||
final existingList = likedTendersData!.data?.feedback ?? [];
|
||||
final combined = List.of(existingList)..addAll(incomingList);
|
||||
final newMeta = incoming.data?.meta ?? likedTendersData!.data?.meta;
|
||||
likedTendersData = likedTendersData!.copyWith(
|
||||
data: likedTendersData!.data!.copyWith(
|
||||
feedback: combined,
|
||||
meta: newMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
hasMore = incomingList.length == _limit;
|
||||
_offset += _limit;
|
||||
errorMessage = null;
|
||||
break;
|
||||
case Error<LikedTendersResponse>():
|
||||
errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
isLoading = false;
|
||||
isLoadingMore = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> loadMoreFeedback() async {
|
||||
if (_currentFeedbackType == null) {
|
||||
return;
|
||||
}
|
||||
await getTendersFeedback(feedbackType: _currentFeedbackType!, reset: false);
|
||||
}
|
||||
|
||||
// --- Filter Actions ---
|
||||
void setDateRange(DateTimeRange? range) {
|
||||
selectedDateRange = range;
|
||||
@@ -99,20 +184,24 @@ class YourTendersViewModel with ChangeNotifier {
|
||||
|
||||
void clearFilter() {
|
||||
selectedDateRange = null;
|
||||
selectedStatus = 'All';
|
||||
selectedStatus = YourTendersStrings.all;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> callWithFilter() async {
|
||||
if (selectedStatus == 'All') {
|
||||
if (selectedStatus == YourTendersStrings.all) {
|
||||
await getTenders(
|
||||
limit: 10,
|
||||
offset: 0,
|
||||
createdFrom: startDateUnix.toString(),
|
||||
createdTo: endDateUnix.toString(),
|
||||
createdFrom: startDateUnix,
|
||||
createdTo: endDateUnix,
|
||||
);
|
||||
} else if (selectedStatus == 'Tenders submitted') {
|
||||
await getApprovedTenders();
|
||||
} else if (selectedStatus == YourTendersStrings.tendersSubmitted) {
|
||||
await getApprovedTenders(limit: 10, offset: 0);
|
||||
} else if (selectedStatus == YourTendersStrings.likeTenders) {
|
||||
await getTendersFeedback(feedbackType: 'like', reset: true);
|
||||
} else if (selectedStatus == YourTendersStrings.dislikeTenders) {
|
||||
await getTendersFeedback(feedbackType: 'dislike', reset: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user