search logic added to desktop tenders
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user