import 'package:flutter/material.dart'; import 'package:tm_app/core/utils/result.dart'; import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart'; import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_response.dart'; import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart'; import 'package:tm_app/data/services/model/tender_data/tender_data.dart'; import '../data/repositories/home_repository.dart'; import '../data/services/model/home/home_response/home_response_model.dart'; class HomeViewModel with ChangeNotifier { final HomeRepository _homeRepository; HomeViewModel({required HomeRepository homeRepository}) : _homeRepository = homeRepository { getHome(homeRequestModel: HomeRequestModel(id: '1')); getYourTenders(); } bool _isLoading = false; String? _errorMessage; HomeResponseModel? _homeResponse; TenderApprovalsResponse? data; bool get isLoading => _isLoading; String? get errorMessage => _errorMessage; HomeResponseModel? get homeResponse => _homeResponse; RecommendedTendersResponse? _recommendedTendersResponse; final List _tenders = []; final int _pageSize = 20; int _currentPage = 0; bool _isLoadingMore = false; bool _hasMore = true; List get tenders => _tenders; bool get isLoadingMore => _isLoadingMore; bool get hasMore => _hasMore; Future getHome({HomeRequestModel? homeRequestModel}) async { _isLoading = true; _errorMessage = null; notifyListeners(); final result = await _homeRepository.getHome( homeRequestModel: homeRequestModel, ); switch (result) { case Ok(): _homeResponse = result.value; break; case Error(): _errorMessage = result.error.toString(); break; } _isLoading = false; notifyListeners(); } Future getHomeRecommandTenders({bool reset = false}) async { if (_isLoadingMore || (!_hasMore && !reset)) { return; } if (reset) { _currentPage = 0; _hasMore = true; _tenders.clear(); } _isLoadingMore = true; _errorMessage = null; notifyListeners(); final result = await _homeRepository.getHomeRecommendedTenders( limit: _pageSize, offset: _currentPage * _pageSize, ); switch (result) { case Ok(): _recommendedTendersResponse = result.value; if (_recommendedTendersResponse?.data?.tenders.isNotEmpty ?? false) { _tenders.addAll( _recommendedTendersResponse!.data!.tenders.whereType(), ); _currentPage++; } else { _hasMore = false; } break; case Error(): _errorMessage = result.error.toString(); break; } _isLoadingMore = false; notifyListeners(); } Future getYourTenders() async { _isLoading = true; notifyListeners(); final result = await _homeRepository.getYourTenders(); switch (result) { case Ok(): data = result.value; _errorMessage = null; if (data?.data?.isEmpty ?? true) { await getHomeRecommandTenders(reset: true); } else { _tenders.clear(); _tenders.addAll( data!.data! .map((e) => e.tender) .whereType(), ); } case Error(): _errorMessage = result.error.toString(); await getHomeRecommandTenders(reset: true); break; } _isLoading = false; notifyListeners(); } }