toggle feedack better handle
This commit is contained in:
@@ -253,16 +253,62 @@ class TendersViewModel with ChangeNotifier {
|
||||
required String feedbackType,
|
||||
}) async {
|
||||
_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();
|
||||
|
||||
// Call API
|
||||
final result = await _tendersRepository.toggleFeedback(
|
||||
tenderId: tenderId,
|
||||
feedbackType: feedbackType,
|
||||
);
|
||||
|
||||
switch (result) {
|
||||
case Ok<FeedbackResponse>():
|
||||
_feedbackData = result.value.data;
|
||||
if (_feedbackData != null) {
|
||||
// Update with complete data from server
|
||||
final index = feedbacks.indexWhere(
|
||||
(f) => f.tender == _feedbackData!.tender,
|
||||
);
|
||||
@@ -271,12 +317,31 @@ class TendersViewModel with ChangeNotifier {
|
||||
} else {
|
||||
feedbacks.add(_feedbackData!);
|
||||
}
|
||||
} else {
|
||||
// Server returned null data - remove feedback
|
||||
feedbacks.removeWhere((f) => f.tender == tenderId);
|
||||
}
|
||||
break;
|
||||
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();
|
||||
break;
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
_feedbackErrorMessage = null;
|
||||
notifyListeners();
|
||||
|
||||
Reference in New Issue
Block a user