From 1135fdd2ba0672b18aca4a9386ec6bab54b396c6 Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Mon, 18 Aug 2025 15:48:33 +0330 Subject: [PATCH] fixed view model --- lib/view_models/tenders_view_model.dart | 197 ++++++++++++++++++++++-- 1 file changed, 186 insertions(+), 11 deletions(-) diff --git a/lib/view_models/tenders_view_model.dart b/lib/view_models/tenders_view_model.dart index 1c3d324..07b1f16 100644 --- a/lib/view_models/tenders_view_model.dart +++ b/lib/view_models/tenders_view_model.dart @@ -1,7 +1,10 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:tm_app/data/repositories/tenders_repository.dart'; import 'package:tm_app/data/services/model/feedback_data/feedback_data.dart'; import 'package:tm_app/data/services/model/feedback_response/feedback_response.dart'; +import 'package:tm_app/data/services/model/tender/tender_model.dart'; import 'package:tm_app/data/services/model/tenders/tenders_response/tenders_response.dart'; import '../core/utils/result.dart'; @@ -34,7 +37,7 @@ class TendersViewModel with ChangeNotifier { FeedbackData? getFeedbackForTender(String tenderId) { try { return feedbacks.firstWhere((f) => f.tender == tenderId); - } on Exception { + } catch (e) { return null; } } @@ -77,7 +80,19 @@ class TendersViewModel with ChangeNotifier { case Ok(): _feedbackData = result.value.data; // Add or update _feedbackData in feedbacks list by tender id - _addOrUpdateFunction(_feedbackData!); + if (_feedbackData != null) { + final index = feedbacks.indexWhere( + (f) => f.tender == _feedbackData!.tender, + ); + if (index != -1) { + feedbacks[index] = _feedbackData!; + log('Updated feedback for tender: ${_feedbackData!.tender}'); + } else { + feedbacks.add(_feedbackData!); + log('Added new feedback for tender: ${_feedbackData!.tender}'); + } + log('Total feedbacks: ${feedbacks.length}'); + } break; case Error(): _errorMessage = result.error.toString(); @@ -104,9 +119,15 @@ class TendersViewModel with ChangeNotifier { case Ok(): _feedbackData = result.value.data; if (_feedbackData != null) { - _addOrUpdateFunction(_feedbackData!); + final index = feedbacks.indexWhere( + (f) => f.tender == _feedbackData!.tender, + ); + if (index != -1) { + feedbacks[index] = _feedbackData!; + } else { + feedbacks.add(_feedbackData!); + } } - break; case Error(): _errorMessage = result.error.toString(); @@ -117,12 +138,166 @@ class TendersViewModel with ChangeNotifier { notifyListeners(); } - void _addOrUpdateFunction(FeedbackData feedbackData) { - final index = feedbacks.indexWhere((f) => f.tender == feedbackData.tender); - if (index != -1) { - feedbacks[index] = feedbackData; - } else { - feedbacks.add(feedbackData); - } + /// Updates a tender's state in the list + void _updateTenderState( + String tenderId, { + bool? liked, + bool? disliked, + bool? rejected, + bool? submitted, + }) { + // if (_tendersResponse?.tendersData?.tenders != null) { + // final updatedTenders = + // _tendersResponse!.tendersData!.tenders!.map((element) { + // if (element.tenderId == tenderId) { + // return element.copyWith( + // liked: liked, + // disliked: disliked, + // rejected: rejected, + // submitted: submitted, + // ); + // } + // return element; + // }).toList(); + + // _tendersResponse = _tendersResponse!.copyWith( + // tendersData: _tendersResponse!.tendersData!.copyWith( + // tenders: updatedTenders, + // ), + // ); + // } + } + + /// Sets a tender as liked + Future markLiked(TenderModel tender) async { + // _updateTenderState( + // tender.id!, + // liked: true, + // disliked: false, + // rejected: false, + // submitted: tender.submitted, + // ); + // notifyListeners(); + // final result = await _tendersRepository.likeTender(); + // switch (result) { + // case Ok(): + // break; + // case Error(): + // break; + // } + } + + /// Sets a tender as disliked + Future markDisliked(TenderModel tender) async { + // _updateTenderState( + // tender.tenderId!, + // disliked: true, + // liked: false, + // rejected: tender.rejected, + // submitted: false, + // ); + // notifyListeners(); + // final result = await _tendersRepository.dislikeTender(); + // switch (result) { + // case Ok(): + // break; + // case Error(): + // break; + // } + } + + /// Sets a tender as rejected + Future markRejected(TenderModel tender) async { + // _updateTenderState( + // tender.tenderId!, + // rejected: true, + // liked: false, + // disliked: tender.disliked, + // submitted: false, + // ); + // notifyListeners(); + // final result = await _tendersRepository.rejectTender(); + // switch (result) { + // case Ok(): + // break; + // case Error(): + // break; + // } + } + + /// Sets a tender as submitted + Future markSubmitted(TenderModel tender) async { + // _updateTenderState( + // tender.tenderId!, + // submitted: true, + // liked: tender.liked, + // disliked: false, + // rejected: false, + // ); + // notifyListeners(); + // final result = await _tendersRepository.submitTender(); + // switch (result) { + // case Ok(): + // break; + // case Error(): + // break; + // } + } + + /// Clears a specific state for a tender + void clearTenderState( + TenderModel tenderModel, { + bool? isLiked, + bool? isDisliked, + bool? isRejected, + bool? isSubmitted, + }) { + // _updateTenderState( + // tenderModel.tenderId!, + // liked: isLiked ?? tenderModel.liked, + // disliked: isDisliked ?? tenderModel.disliked, + // rejected: isRejected ?? tenderModel.rejected, + // submitted: isSubmitted ?? tenderModel.submitted, + // ); + } + + /// Toggles like state for a tender + void toggleLike(TenderModel tender) { + // if (tender.liked == true) { + // clearTenderState(tender, isLiked: false); + // } else { + // markLiked(tender); + // } + // notifyListeners(); + } + + /// Toggles dislike state for a tender + void toggleDislike(TenderModel tender) { + // if (tender.disliked == true) { + // clearTenderState(tender, isDisliked: false); + // } else { + // markDisliked(tender); + // } + // notifyListeners(); + } + + /// Toggles reject state for a tender + void toggleReject(TenderModel tender) { + // if (tender.rejected == true) { + // clearTenderState(tender, isRejected: false); + // } else { + // markRejected(tender); + // } + // notifyListeners(); + } + + /// Toggles submit state for a tender + void toggleSubmit(TenderModel tender) { + // if (tender.submitted == true) { + // clearTenderState(tender, isSubmitted: false); + // } else { + // markSubmitted(tender); + // } + // notifyListeners(); } }