Merge pull request 'filters in your tenders fixed' (#93) from your_tenders_filters into main

Reviewed-on: https://repo.ravanertebat.com/TM/tm_app/pulls/93
This commit is contained in:
a.ghabeli
2025-09-03 13:26:06 +03:30
12 changed files with 363 additions and 252 deletions
+104 -15
View File
@@ -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);
}
}
}