Added pagination to recommand in home
This commit is contained in:
@@ -2,6 +2,7 @@ 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_data/tender_data.dart';
|
||||
|
||||
import '../data/repositories/home_repository.dart';
|
||||
import '../data/services/model/home/home_response/home_response_model.dart';
|
||||
@@ -10,9 +11,9 @@ class HomeViewModel with ChangeNotifier {
|
||||
final HomeRepository _homeRepository;
|
||||
|
||||
HomeViewModel({required HomeRepository homeRepository})
|
||||
: _homeRepository = homeRepository {
|
||||
: _homeRepository = homeRepository {
|
||||
getHome(homeRequestModel: HomeRequestModel(id: '1'));
|
||||
getHomeRecommandTenders();
|
||||
getHomeRecommandTenders(reset: true);
|
||||
}
|
||||
|
||||
bool _isLoading = false;
|
||||
@@ -24,8 +25,14 @@ class HomeViewModel with ChangeNotifier {
|
||||
HomeResponseModel? get homeResponse => _homeResponse;
|
||||
|
||||
RecommendedTendersResponse? _recommendedTendersResponse;
|
||||
RecommendedTendersResponse? get recommendedTendersResponse =>
|
||||
_recommendedTendersResponse;
|
||||
final List<TenderData> _tenders = [];
|
||||
final int _pageSize = 20;
|
||||
int _currentPage = 0;
|
||||
bool _isLoadingMore = false;
|
||||
bool _hasMore = true;
|
||||
List<TenderData> get tenders => _tenders;
|
||||
bool get isLoadingMore => _isLoadingMore;
|
||||
bool get hasMore => _hasMore;
|
||||
|
||||
Future<void> getHome({HomeRequestModel? homeRequestModel}) async {
|
||||
_isLoading = true;
|
||||
@@ -49,23 +56,45 @@ class HomeViewModel with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getHomeRecommandTenders() async {
|
||||
_isLoading = true;
|
||||
Future<void> 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();
|
||||
final result = await _homeRepository.getHomeRecommendedTenders(
|
||||
limit: _pageSize,
|
||||
offset: _currentPage * _pageSize,
|
||||
);
|
||||
|
||||
switch (result) {
|
||||
case Ok<RecommendedTendersResponse>():
|
||||
_recommendedTendersResponse = result.value;
|
||||
|
||||
if (_recommendedTendersResponse?.data?.tenders.isNotEmpty ?? false) {
|
||||
_tenders.addAll(
|
||||
_recommendedTendersResponse!.data!.tenders.whereType<TenderData>(),
|
||||
);
|
||||
_currentPage++;
|
||||
} else {
|
||||
_hasMore = false;
|
||||
}
|
||||
break;
|
||||
case Error<RecommendedTendersResponse>():
|
||||
_errorMessage = result.error.toString();
|
||||
break;
|
||||
}
|
||||
|
||||
_isLoading = false;
|
||||
_isLoadingMore = false;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user