import 'package:flutter/material.dart'; import 'package:tm_app/core/utils/result.dart'; import 'package:tm_app/data/repositories/liked_tenders_repository.dart'; import 'package:tm_app/data/services/model/liked_tender_feedback/liked_tender_feedback.dart'; import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart'; class LikedTendersViewModel with ChangeNotifier { final LikedTendersRepository likedTendersRepository; LikedTendersViewModel({required this.likedTendersRepository}) { getLikedTenders(reset: true); } bool isLoading = false; bool isLoadingMore = false; bool hasMore = true; String? errorMessage; LikedTendersResponse? data; int _offset = 0; final int _limit = 7; int currentPage = 1; Future getLikedTenders({bool reset = false}) async { if (!reset && (isLoadingMore || !hasMore)) { return; } if (reset) { _offset = (currentPage - 1) * _limit; hasMore = true; data = null; isLoading = true; notifyListeners(); } else { if (_offset == 0) { isLoading = true; } else { isLoadingMore = true; } notifyListeners(); } errorMessage = null; final result = await likedTendersRepository.getLikedTenders( offset: _offset, limit: _limit, ); switch (result) { case Ok(): final incoming = result.value; final incomingList = incoming.data?.feedback ?? []; if (reset) { data = incoming; } else { final existingList = data?.data?.feedback ?? []; final combined = List.of(existingList) ..addAll(incomingList); data = data?.copyWith( data: data?.data?.copyWith( feedback: combined, meta: incoming.data?.meta ?? data!.data!.meta, ), ); } hasMore = incomingList.length == _limit; _offset += _limit; errorMessage = null; break; case Error(): errorMessage = result.error.toString(); break; } isLoading = false; isLoadingMore = false; notifyListeners(); } Future loadMoreIfNeeded() async { if (isLoadingMore || !hasMore) { return; } await getLikedTenders(reset: false); } Future jumpToPage(int page) async { currentPage = page; _offset = (page - 1) * _limit; hasMore = true; await getLikedTenders(reset: true); } void removeTenderById(String id) { final current = data; final list = current?.data?.feedback; if (current == null || list == null) { return; } final updatedList = List.of(list) ..removeWhere((e) => e.id == id); final updatedMeta = current.data?.meta?.copyWith(total: updatedList.length); data = current.copyWith( data: current.data?.copyWith( feedback: updatedList, meta: updatedMeta, ), ); notifyListeners(); } }