toggle feedack better handle

This commit is contained in:
amirrezaghabeli
2025-08-30 12:27:14 +03:30
parent bf6fbea9a9
commit fd9457ee44
+65
View File
@@ -253,16 +253,62 @@ class TendersViewModel with ChangeNotifier {
required String feedbackType, required String feedbackType,
}) async { }) async {
_feedbackErrorMessage = null; _feedbackErrorMessage = null;
// Get current feedback for this tender
final existingFeedback = getFeedbackForTender(tenderId);
final existingFeedbackIndex = feedbacks.indexWhere(
(f) => f.tender == tenderId,
);
// Create optimistic feedback data
FeedbackData? optimisticFeedback;
if (existingFeedback == null) {
// No existing feedback - create new optimistic feedback
optimisticFeedback = FeedbackData(
companyId: null, // Will be filled by server
createdAt: DateTime.now().millisecondsSinceEpoch,
customerId: null, // Will be filled by server
feedbackType: feedbackType,
id: null, // Will be filled by server
tender: tenderId,
updatedAt: DateTime.now().millisecondsSinceEpoch,
);
feedbacks.add(optimisticFeedback);
} else {
// Existing feedback - update optimistically
if (existingFeedback.feedbackType == feedbackType) {
// Same feedback type - remove feedback (toggle off)
if (existingFeedbackIndex != -1) {
feedbacks.removeAt(existingFeedbackIndex);
}
optimisticFeedback = null;
} else {
// Different feedback type - update to new type
optimisticFeedback = existingFeedback.copyWith(
feedbackType: feedbackType,
updatedAt: DateTime.now().millisecondsSinceEpoch,
);
if (existingFeedbackIndex != -1) {
feedbacks[existingFeedbackIndex] = optimisticFeedback;
}
}
}
// Notify listeners immediately for optimistic update
notifyListeners(); notifyListeners();
// Call API
final result = await _tendersRepository.toggleFeedback( final result = await _tendersRepository.toggleFeedback(
tenderId: tenderId, tenderId: tenderId,
feedbackType: feedbackType, feedbackType: feedbackType,
); );
switch (result) { switch (result) {
case Ok<FeedbackResponse>(): case Ok<FeedbackResponse>():
_feedbackData = result.value.data; _feedbackData = result.value.data;
if (_feedbackData != null) { if (_feedbackData != null) {
// Update with complete data from server
final index = feedbacks.indexWhere( final index = feedbacks.indexWhere(
(f) => f.tender == _feedbackData!.tender, (f) => f.tender == _feedbackData!.tender,
); );
@@ -271,12 +317,31 @@ class TendersViewModel with ChangeNotifier {
} else { } else {
feedbacks.add(_feedbackData!); feedbacks.add(_feedbackData!);
} }
} else {
// Server returned null data - remove feedback
feedbacks.removeWhere((f) => f.tender == tenderId);
} }
break; break;
case Error<FeedbackResponse>(): case Error<FeedbackResponse>():
// Revert optimistic update on error
if (existingFeedback == null) {
// Remove the optimistic feedback we added
feedbacks.removeWhere((f) => f.tender == tenderId);
} else {
// Restore the original feedback - find current index and update, or add if not found
final currentIndex = feedbacks.indexWhere(
(f) => f.tender == tenderId,
);
if (currentIndex != -1) {
feedbacks[currentIndex] = existingFeedback;
} else {
feedbacks.add(existingFeedback);
}
}
_feedbackErrorMessage = result.error.toString(); _feedbackErrorMessage = result.error.toString();
break; break;
} }
notifyListeners(); notifyListeners();
_feedbackErrorMessage = null; _feedbackErrorMessage = null;
notifyListeners(); notifyListeners();