Merge pull request 'feedback_approval_enhance' (#79) from feedback_approval_enhance into main
Reviewed-on: https://repo.ravanertebat.com/TM/tm_app/pulls/79
This commit is contained in:
@@ -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();
|
||||||
@@ -288,12 +353,58 @@ class TendersViewModel with ChangeNotifier {
|
|||||||
required String status,
|
required String status,
|
||||||
}) async {
|
}) async {
|
||||||
_tenderApprovalErrorMessage = null;
|
_tenderApprovalErrorMessage = null;
|
||||||
|
|
||||||
|
// Get current approval for this tender
|
||||||
|
final existingApproval = getTenderApprovalForTender(tenderId);
|
||||||
|
final existingApprovalIndex = tenderApprovals.indexWhere(
|
||||||
|
(a) => a.tenderId == tenderId,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Create optimistic approval data
|
||||||
|
TenderApprovalsData? optimisticApproval;
|
||||||
|
|
||||||
|
if (existingApproval == null) {
|
||||||
|
// No existing approval - create new optimistic approval
|
||||||
|
optimisticApproval = TenderApprovalsData(
|
||||||
|
id: null, // Will be filled by server
|
||||||
|
status: status,
|
||||||
|
tenderId: tenderId,
|
||||||
|
companyId: null, // Will be filled by server
|
||||||
|
submissionMode: submissionMode,
|
||||||
|
createdAt: DateTime.now().millisecondsSinceEpoch,
|
||||||
|
tender: null,
|
||||||
|
);
|
||||||
|
tenderApprovals.add(optimisticApproval);
|
||||||
|
} else {
|
||||||
|
// Existing approval - update optimistically
|
||||||
|
if (existingApproval.status == status) {
|
||||||
|
// Same status - remove approval (toggle off)
|
||||||
|
if (existingApprovalIndex != -1) {
|
||||||
|
tenderApprovals.removeAt(existingApprovalIndex);
|
||||||
|
}
|
||||||
|
optimisticApproval = null;
|
||||||
|
} else {
|
||||||
|
// Different status - update to new status
|
||||||
|
optimisticApproval = existingApproval.copyWith(
|
||||||
|
status: status,
|
||||||
|
submissionMode: submissionMode,
|
||||||
|
);
|
||||||
|
if (existingApprovalIndex != -1) {
|
||||||
|
tenderApprovals[existingApprovalIndex] = optimisticApproval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify listeners immediately for optimistic update
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
|
// Call API
|
||||||
final result = await _tendersRepository.toggleApprovals(
|
final result = await _tendersRepository.toggleApprovals(
|
||||||
tenderId: tenderId,
|
tenderId: tenderId,
|
||||||
submissionMode: submissionMode,
|
submissionMode: submissionMode,
|
||||||
status: status,
|
status: status,
|
||||||
);
|
);
|
||||||
|
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case Ok<TenderApprovalsToggleResponse>():
|
case Ok<TenderApprovalsToggleResponse>():
|
||||||
_tenderApprovalToggleData = result.value.data;
|
_tenderApprovalToggleData = result.value.data;
|
||||||
@@ -317,12 +428,31 @@ class TendersViewModel with ChangeNotifier {
|
|||||||
} else {
|
} else {
|
||||||
tenderApprovals.add(approvalData);
|
tenderApprovals.add(approvalData);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Server returned null data - remove approval
|
||||||
|
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Error<TenderApprovalsToggleResponse>():
|
case Error<TenderApprovalsToggleResponse>():
|
||||||
|
// Revert optimistic update on error
|
||||||
|
if (existingApproval == null) {
|
||||||
|
// Remove the optimistic approval we added
|
||||||
|
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
|
||||||
|
} else {
|
||||||
|
// Restore the original approval - find current index and update, or add if not found
|
||||||
|
final currentIndex = tenderApprovals.indexWhere(
|
||||||
|
(a) => a.tenderId == tenderId,
|
||||||
|
);
|
||||||
|
if (currentIndex != -1) {
|
||||||
|
tenderApprovals[currentIndex] = existingApproval;
|
||||||
|
} else {
|
||||||
|
tenderApprovals.add(existingApproval);
|
||||||
|
}
|
||||||
|
}
|
||||||
_tenderApprovalErrorMessage = result.error.toString();
|
_tenderApprovalErrorMessage = result.error.toString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
_tenderApprovalErrorMessage = null;
|
_tenderApprovalErrorMessage = null;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
Reference in New Issue
Block a user