added submit and reject for liked tenders

This commit is contained in:
amirrezaghabeli
2025-09-06 10:31:28 +03:30
parent 142c53f7aa
commit 185df3f40a
4 changed files with 252 additions and 93 deletions
+164 -55
View File
@@ -4,6 +4,7 @@ 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 'package:tm_app/data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart';
import '../data/services/model/feedback_response/feedback_response.dart';
import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart';
@@ -34,6 +35,18 @@ class LikedTendersViewModel with ChangeNotifier {
int currentPage = 1;
// Approval status properties
bool approvalStatus = false;
String _status = '';
String? _errorMessage;
bool _isSubmitApprovalLoading = false;
bool _isRejectApprovalLoading = false;
String get status => _status;
String? get approvalErrorMessage => _errorMessage;
bool get isSubmitApprovalLoading => _isSubmitApprovalLoading;
bool get isRejectApprovalLoading => _isRejectApprovalLoading;
Future<void> getLikedTenders({bool reset = false}) async {
if (!reset && (isLoadingMore || !hasMore)) {
return;
@@ -199,61 +212,157 @@ class LikedTendersViewModel with ChangeNotifier {
return tenderApprovals.any((a) => a.tenderId == tenderId);
}
// Future<void> submitTenderApproval({
// required String tenderId,
// required String submissionMode,
// }) async {
/// Get approval status for a tender safely
String? getApprovalStatusForTenderId(String tenderId) {
try {
final approval = tenderApprovals.firstWhere(
(a) => a.tenderId == tenderId,
);
return approval.status;
} catch (e) {
return null;
}
}
// errorMessage = null;
// notifyListeners();
// final result = await _tendersRepository.toggleApprovals(
// tenderId: tenderId,
// status: 'submitted',
// submissionMode: submissionMode,
// );
// switch (result) {
// case Ok<TenderApprovalsToggleResponse>():
// approvalStatus = true;
// _status = result.value.data?.status ?? '';
// break;
// case Error<TenderApprovalsToggleResponse>():
// _errorMessage = result.error.toString();
// approvalStatus = false;
// break;
// }
// _isSubmitApprovalLoading = false;
// notifyListeners();
// _errorMessage = null;
// approvalStatus = false;
// notifyListeners();
// }
/// Check if tender is submitted
bool isTenderSubmitted(String tenderId) {
return getApprovalStatusForTenderId(tenderId) == 'submitted';
}
// Future<void> rejectTenderApproval({
// required String tenderId,
// required String submissionMode,
// }) async {
// _isRejectApprovalLoading = true;
// _errorMessage = null;
// notifyListeners();
// final result = await _tendersRepository.toggleApprovals(
// tenderId: tenderId,
// status: 'rejected',
// submissionMode: submissionMode,
// );
// switch (result) {
// case Ok<TenderApprovalsToggleResponse>():
// approvalStatus = true;
// _status = result.value.data?.status ?? '';
// break;
// case Error<TenderApprovalsToggleResponse>():
// _errorMessage = result.error.toString();
// approvalStatus = false;
// break;
// }
// _isRejectApprovalLoading = false;
// notifyListeners();
// _errorMessage = null;
// approvalStatus = false;
// notifyListeners();
// }
/// Check if tender is rejected
bool isTenderRejected(String tenderId) {
return getApprovalStatusForTenderId(tenderId) == 'rejected';
}
Future<void> submitTenderApproval({
required String tenderId,
required String submissionMode,
}) async {
_isSubmitApprovalLoading = true;
_errorMessage = null;
notifyListeners();
// Store original state for rollback
final originalApprovals = List<TenderApprovalsData>.of(tenderApprovals);
// Check current approval status and update optimistically
final existingApproval = getApprovalStatusForTender(tenderId);
if (existingApproval != null) {
if (existingApproval.status == 'submitted') {
// Remove from list if already submitted
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
} else if (existingApproval.status == 'rejected') {
// Change rejected to submitted
final updatedApproval = existingApproval.copyWith(status: 'submitted');
final index = tenderApprovals.indexWhere((a) => a.tenderId == tenderId);
if (index != -1) {
tenderApprovals[index] = updatedApproval;
}
}
} else {
// Add new approval with submitted status
final newApproval = TenderApprovalsData(
id: null,
status: 'submitted',
tenderId: tenderId,
companyId: null,
submissionMode: submissionMode,
createdAt: null,
tender: null,
);
tenderApprovals.add(newApproval);
}
notifyListeners();
// Make server request
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'submitted',
submissionMode: submissionMode,
);
switch (result) {
case Ok<TenderApprovalsToggleResponse>():
approvalStatus = true;
_status = result.value.data?.status ?? '';
break;
case Error<TenderApprovalsToggleResponse>():
// Rollback changes on error
tenderApprovals = originalApprovals;
_errorMessage = result.error.toString();
approvalStatus = false;
break;
}
_isSubmitApprovalLoading = false;
notifyListeners();
}
Future<void> rejectTenderApproval({
required String tenderId,
required String submissionMode,
}) async {
_isRejectApprovalLoading = true;
_errorMessage = null;
notifyListeners();
// Store original state for rollback
final originalApprovals = List<TenderApprovalsData>.of(tenderApprovals);
// Check current approval status and update optimistically
final existingApproval = getApprovalStatusForTender(tenderId);
if (existingApproval != null) {
if (existingApproval.status == 'rejected') {
// Remove from list if already rejected
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
} else if (existingApproval.status == 'submitted') {
// Change submitted to rejected
final updatedApproval = existingApproval.copyWith(status: 'rejected');
final index = tenderApprovals.indexWhere((a) => a.tenderId == tenderId);
if (index != -1) {
tenderApprovals[index] = updatedApproval;
}
}
} else {
// Add new approval with rejected status
final newApproval = TenderApprovalsData(
id: null,
status: 'rejected',
tenderId: tenderId,
companyId: null,
submissionMode: submissionMode,
createdAt: null,
tender: null,
);
tenderApprovals.add(newApproval);
}
notifyListeners();
// Make server request
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'rejected',
submissionMode: submissionMode,
);
switch (result) {
case Ok<TenderApprovalsToggleResponse>():
approvalStatus = true;
_status = result.value.data?.status ?? '';
break;
case Error<TenderApprovalsToggleResponse>():
// Rollback changes on error
tenderApprovals = originalApprovals;
_errorMessage = result.error.toString();
approvalStatus = false;
break;
}
_isRejectApprovalLoading = false;
notifyListeners();
}
}