search logic added to desktop tenders

This commit is contained in:
amirrezaghabeli
2025-09-22 09:28:09 +03:30
parent 2e2718a92e
commit f70229ab30
9 changed files with 200 additions and 51 deletions
+100 -35
View File
@@ -1,6 +1,7 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:tm_app/core/utils/device_utils.dart';
import 'package:tm_app/data/repositories/tenders_repository.dart';
import 'package:tm_app/data/services/model/feedback_data/feedback_data.dart';
import 'package:tm_app/data/services/model/feedback_response/feedback_response.dart';
@@ -22,11 +23,7 @@ class TendersViewModel with ChangeNotifier {
required TendersRepository tendersRepository,
required HomeViewModel homeViewModel,
}) : _tendersRepository = tendersRepository,
_homeViewModel = homeViewModel {
WidgetsBinding.instance.addPostFrameCallback((_) {
getTenders();
});
}
_homeViewModel = homeViewModel;
bool _isLoading = false;
bool _isLoadingMore = false;
@@ -37,6 +34,7 @@ class TendersViewModel with ChangeNotifier {
FeedbackData? _feedbackData;
TenderApprovalsData? _tenderApprovalData;
TenderApprovalsToggleData? _tenderApprovalToggleData;
String? _searchQuery;
bool get isLoading => _isLoading;
bool get isLoadingMore => _isLoadingMore;
@@ -48,6 +46,7 @@ class TendersViewModel with ChangeNotifier {
TenderApprovalsData? get tenderApprovalData => _tenderApprovalData;
TenderApprovalsToggleData? get tenderApprovalToggleData =>
_tenderApprovalToggleData;
String? get searchQuery => _searchQuery;
List<FeedbackData> feedbacks = [];
List<TenderApprovalsData> tenderApprovals = [];
@@ -95,17 +94,27 @@ class TendersViewModel with ChangeNotifier {
return approval?.status;
}
Future<void> getTenders() async {
Future<void> getTenders({String? query, BuildContext? context}) async {
if (context != null && DeviceUtils.isDesktop(context)) {
await getTendersDesktop(query: query);
} else {
await getTendersMobile(query: query);
}
}
Future<void> getTendersMobile({String? query}) async {
_isLoading = true;
notifyListeners();
clearAll(); // Clear all data before fetching new tenders
_currentOffset = 0;
_hasMoreData = true;
_searchQuery = query;
final result = await _tendersRepository.getTenders(
limit: _pageSize,
offset: _currentOffset,
query: query,
);
switch (result) {
case Ok<TendersResponse>():
@@ -138,6 +147,52 @@ class TendersViewModel with ChangeNotifier {
notifyListeners();
}
Future<void> getTendersDesktop({String? query}) async {
_isLoading = true;
notifyListeners();
clearAll(); // Clear all data before fetching new tenders
_currentOffset = 0;
_hasMoreData = true;
_searchQuery = query;
final result = await _tendersRepository.getTenders(
limit: _pageSize,
offset: _currentOffset,
query: query,
);
switch (result) {
case Ok<TendersResponse>():
_tendersResponse = result.value;
// Check if we have more data
if (_tendersResponse?.data?.tenders != null) {
_hasMoreData = _tendersResponse!.data!.tenders!.length >= _pageSize;
}
if (_tendersResponse?.data?.tenders?.isNotEmpty == true) {
// Fetch feedback and approvals for the first tender only
// getTenderFeedback(_tendersResponse!.data!.tenders!.first.id!);
// getTenderApprovals(_tendersResponse!.data!.tenders!.first.id!);
for (var tender in _tendersResponse!.data!.tenders!) {
getTenderFeedback(tender.id!);
}
}
if (_tendersResponse?.meta?.pages != null) {
_totalPages = _tendersResponse!.meta!.pages!;
} else {
_totalPages = 1;
}
notifyListeners();
break;
case Error<TendersResponse>():
_errorMessage = result.error.toString();
break;
}
_isLoading = false;
notifyListeners();
_errorMessage = null;
notifyListeners();
}
Future<void> loadMoreTenders() async {
if (_isLoadingMore || !_hasMoreData) {
return;
@@ -151,6 +206,7 @@ class TendersViewModel with ChangeNotifier {
final result = await _tendersRepository.getTenders(
limit: _pageSize,
offset: _currentOffset,
query: _searchQuery,
);
switch (result) {
@@ -500,6 +556,15 @@ class TendersViewModel with ChangeNotifier {
notifyListeners();
}
/// Search tenders with query
Future<void> searchTenders(String query) async {
if (query.trim().isEmpty) {
await getTendersDesktop();
} else {
await getTendersDesktop(query: query.trim());
}
}
/// Clear all data (tenders, feedbacks, and approvals)
void clearAll() {
clearTenders();
@@ -508,37 +573,37 @@ class TendersViewModel with ChangeNotifier {
_tenderApprovalData = null;
_tenderApprovalToggleData = null;
_tenderApprovalErrorMessage = null;
_searchQuery = null;
notifyListeners();
}
void jumpToPage(int page) async {
final meta = tendersResponse?.meta;
if (meta?.pages == null) {
return;
void jumpToPage(int page) async {
final meta = tendersResponse?.meta;
if (meta?.pages == null) {
return;
}
if (page < 1 || page > meta!.pages!) {
return;
}
currentPage = page;
_currentOffset = (page - 1) * _pageSize;
final result = await _tendersRepository.getTenders(
limit: _pageSize,
offset: _currentOffset,
query: _searchQuery,
);
switch (result) {
case Ok<TendersResponse>():
_tendersResponse = result.value;
break;
case Error<TendersResponse>():
_errorMessage = result.error.toString();
break;
}
notifyListeners();
}
if (page < 1 || page > meta!.pages!) {
return;
}
currentPage = page;
_currentOffset = (page - 1) * _pageSize;
final result = await _tendersRepository.getTenders(
limit: _pageSize,
offset: _currentOffset,
);
switch (result) {
case Ok<TendersResponse>():
_tendersResponse = result.value;
break;
case Error<TendersResponse>():
_errorMessage = result.error.toString();
break;
}
notifyListeners();
}
}