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 = 20; Future getLikedTenders({bool reset = false}) async { if (!reset && (isLoadingMore || !hasMore)) { return; } if (reset) { _offset = 0; hasMore = true; } if (_offset == 0) { isLoading = true; } else { isLoadingMore = true; } errorMessage = null; notifyListeners(); 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 == null) { data = incoming; } else { final existingList = data!.data!.feedback ?? []; final combined = List.of(existingList) ..addAll(incomingList); final newMeta = incoming.data?.meta ?? data!.data!.meta; data = data!.copyWith( data: data!.data!.copyWith(feedback: combined, meta: newMeta), ); } // چون offset بر اساس limit حرکت می‌کنه 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); } void removeTenderById(String id) { final current = data; final list = current?.data?.feedback; if (current == null || list == null) { return; } final List 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(); } }