delete likes in liked screen

This commit is contained in:
amirrezaghabeli
2025-09-03 15:15:37 +03:30
parent e8ed6ae42f
commit 777d9c3e70
8 changed files with 158 additions and 93 deletions
+103 -73
View File
@@ -1,14 +1,20 @@
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/repositories/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';
import '../data/services/model/feedback_response/feedback_response.dart';
class LikedTendersViewModel with ChangeNotifier {
final LikedTendersRepository likedTendersRepository;
LikedTendersViewModel({required this.likedTendersRepository}) {
getLikedTenders(reset: true);
}
final LikedTendersRepository _likedTendersRepository;
final TendersRepository _tendersRepository;
LikedTendersViewModel({
required LikedTendersRepository likedTendersRepository,
required TendersRepository tendersRepository,
}) : _likedTendersRepository = likedTendersRepository,
_tendersRepository = tendersRepository;
bool isLoading = false;
bool isLoadingMore = false;
@@ -21,71 +27,70 @@ class LikedTendersViewModel with ChangeNotifier {
int currentPage = 1;
Future<void> 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;
Future<void> 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<LikedTendersResponse>():
final incoming = result.value;
final incomingList = incoming.data?.feedback ?? [];
if (reset) {
data = incoming;
} else {
final existingList = data?.data?.feedback ?? [];
final combined = List<LikedTenderFeedback>.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<LikedTendersResponse>():
errorMessage = result.error.toString();
break;
}
isLoading = false;
isLoadingMore = false;
notifyListeners();
}
errorMessage = null;
final result = await likedTendersRepository.getLikedTenders(
offset: _offset,
limit: _limit,
);
switch (result) {
case Ok<LikedTendersResponse>():
final incoming = result.value;
final incomingList = incoming.data?.feedback ?? [];
if (reset) {
data = incoming;
} else {
final existingList = data?.data?.feedback ?? [];
final combined = List<LikedTenderFeedback>.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<LikedTendersResponse>():
errorMessage = result.error.toString();
break;
}
isLoading = false;
isLoadingMore = false;
notifyListeners();
}
Future<void> loadMoreIfNeeded() async {
if (isLoadingMore || !hasMore) {
return;
@@ -100,24 +105,49 @@ Future<void> getLikedTenders({bool reset = false}) async {
await getLikedTenders(reset: true);
}
void removeTenderById(String id) {
void removeTenderById(String id) async {
final current = data;
final list = current?.data?.feedback;
if (current == null || list == null) {
return;
}
// Store original list to restore if error occurs
final originalList = List<LikedTenderFeedback>.of(list);
final updatedList = List<LikedTenderFeedback>.of(list)
..removeWhere((e) => e.id == id);
final updatedMeta = current.data?.meta?.copyWith(total: updatedList.length);
..removeWhere((e) => e.tenderId == id);
// Temporarily update UI
data = current.copyWith(
data: current.data?.copyWith(
feedback: updatedList,
meta: updatedMeta,
),
data: current.data?.copyWith(feedback: updatedList),
);
notifyListeners();
final result = await _tendersRepository.toggleFeedback(
tenderId: id,
feedbackType: 'like',
);
switch (result) {
case Ok<FeedbackResponse>():
final updatedMeta = current.data?.meta?.copyWith(
total: updatedList.length,
);
data = current.copyWith(
data: current.data?.copyWith(
feedback: updatedList,
meta: updatedMeta,
),
);
break;
case Error<FeedbackResponse>():
// Restore original list if error occurs
data = current.copyWith(
data: current.data?.copyWith(feedback: originalList),
);
errorMessage = result.error.toString();
break;
}
notifyListeners();
}