added submit and reject for liked tenders
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user