Files
tm_app/lib/view_models/tenders_view_model.dart
T
amirrezaghabeli 1135fdd2ba fixed view model
2025-08-18 15:48:33 +03:30

304 lines
8.4 KiB
Dart

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:tm_app/data/repositories/tenders_repository.dart';
import 'package:tm_app/data/services/model/feedback_data/feedback_data.dart';
import 'package:tm_app/data/services/model/feedback_response/feedback_response.dart';
import 'package:tm_app/data/services/model/tender/tender_model.dart';
import 'package:tm_app/data/services/model/tenders/tenders_response/tenders_response.dart';
import '../core/utils/result.dart';
class TendersViewModel with ChangeNotifier {
final TendersRepository _tendersRepository;
TendersViewModel({required TendersRepository tendersRepository})
: _tendersRepository = tendersRepository {
WidgetsBinding.instance.addPostFrameCallback((_) {
getTenders();
});
}
bool _isLoading = false;
String? _errorMessage;
TendersResponse? _tendersResponse;
FeedbackData? _feedbackData;
bool get isLoading => _isLoading;
String? get errorMessage => _errorMessage;
TendersResponse? get tendersResponse => _tendersResponse;
FeedbackData? get feedbackData => _feedbackData;
List<FeedbackData> feedbacks = [];
int currentPage = 1;
/// Get feedback for a specific tender
FeedbackData? getFeedbackForTender(String tenderId) {
try {
return feedbacks.firstWhere((f) => f.tender == tenderId);
} catch (e) {
return null;
}
}
/// Check if feedback exists for a specific tender
bool hasFeedbackForTender(String tenderId) {
return feedbacks.any((f) => f.tender == tenderId);
}
Future<void> getTenders() async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
final result = await _tendersRepository.getTenders();
switch (result) {
case Ok<TendersResponse>():
_tendersResponse = result.value;
getTenderFeedback(_tendersResponse!.data!.tenders!.first.id!);
break;
case Error<TendersResponse>():
_errorMessage = result.error.toString();
break;
}
_isLoading = false;
notifyListeners();
_errorMessage = null;
notifyListeners();
}
Future<void> getTenderFeedback(String tenderId) async {
// _isLoading = true;
_errorMessage = null;
notifyListeners();
final result = await _tendersRepository.getTenderFeedback(
tenderId: tenderId,
);
switch (result) {
case Ok<FeedbackResponse>():
_feedbackData = result.value.data;
// Add or update _feedbackData in feedbacks list by tender id
if (_feedbackData != null) {
final index = feedbacks.indexWhere(
(f) => f.tender == _feedbackData!.tender,
);
if (index != -1) {
feedbacks[index] = _feedbackData!;
log('Updated feedback for tender: ${_feedbackData!.tender}');
} else {
feedbacks.add(_feedbackData!);
log('Added new feedback for tender: ${_feedbackData!.tender}');
}
log('Total feedbacks: ${feedbacks.length}');
}
break;
case Error<FeedbackResponse>():
_errorMessage = result.error.toString();
break;
}
// _isLoading = false;
notifyListeners();
_errorMessage = null;
notifyListeners();
}
Future<void> feedback({
required String tenderId,
required String feedbackType,
}) async {
_errorMessage = null;
notifyListeners();
final result = await _tendersRepository.feedback(
tenderId: tenderId,
feedbackType: feedbackType,
);
switch (result) {
case Ok<FeedbackResponse>():
_feedbackData = result.value.data;
if (_feedbackData != null) {
final index = feedbacks.indexWhere(
(f) => f.tender == _feedbackData!.tender,
);
if (index != -1) {
feedbacks[index] = _feedbackData!;
} else {
feedbacks.add(_feedbackData!);
}
}
break;
case Error<FeedbackResponse>():
_errorMessage = result.error.toString();
break;
}
notifyListeners();
_errorMessage = null;
notifyListeners();
}
/// Updates a tender's state in the list
void _updateTenderState(
String tenderId, {
bool? liked,
bool? disliked,
bool? rejected,
bool? submitted,
}) {
// if (_tendersResponse?.tendersData?.tenders != null) {
// final updatedTenders =
// _tendersResponse!.tendersData!.tenders!.map((element) {
// if (element.tenderId == tenderId) {
// return element.copyWith(
// liked: liked,
// disliked: disliked,
// rejected: rejected,
// submitted: submitted,
// );
// }
// return element;
// }).toList();
// _tendersResponse = _tendersResponse!.copyWith(
// tendersData: _tendersResponse!.tendersData!.copyWith(
// tenders: updatedTenders,
// ),
// );
// }
}
/// Sets a tender as liked
Future<void> markLiked(TenderModel tender) async {
// _updateTenderState(
// tender.id!,
// liked: true,
// disliked: false,
// rejected: false,
// submitted: tender.submitted,
// );
// notifyListeners();
// final result = await _tendersRepository.likeTender();
// switch (result) {
// case Ok<TenderLikeResponse>():
// break;
// case Error<TenderLikeResponse>():
// break;
// }
}
/// Sets a tender as disliked
Future<void> markDisliked(TenderModel tender) async {
// _updateTenderState(
// tender.tenderId!,
// disliked: true,
// liked: false,
// rejected: tender.rejected,
// submitted: false,
// );
// notifyListeners();
// final result = await _tendersRepository.dislikeTender();
// switch (result) {
// case Ok<TenderDislikeResponse>():
// break;
// case Error<TenderDislikeResponse>():
// break;
// }
}
/// Sets a tender as rejected
Future<void> markRejected(TenderModel tender) async {
// _updateTenderState(
// tender.tenderId!,
// rejected: true,
// liked: false,
// disliked: tender.disliked,
// submitted: false,
// );
// notifyListeners();
// final result = await _tendersRepository.rejectTender();
// switch (result) {
// case Ok<TenderRejectResponse>():
// break;
// case Error<TenderRejectResponse>():
// break;
// }
}
/// Sets a tender as submitted
Future<void> markSubmitted(TenderModel tender) async {
// _updateTenderState(
// tender.tenderId!,
// submitted: true,
// liked: tender.liked,
// disliked: false,
// rejected: false,
// );
// notifyListeners();
// final result = await _tendersRepository.submitTender();
// switch (result) {
// case Ok<TenderSubmitResponse>():
// break;
// case Error<TenderSubmitResponse>():
// break;
// }
}
/// Clears a specific state for a tender
void clearTenderState(
TenderModel tenderModel, {
bool? isLiked,
bool? isDisliked,
bool? isRejected,
bool? isSubmitted,
}) {
// _updateTenderState(
// tenderModel.tenderId!,
// liked: isLiked ?? tenderModel.liked,
// disliked: isDisliked ?? tenderModel.disliked,
// rejected: isRejected ?? tenderModel.rejected,
// submitted: isSubmitted ?? tenderModel.submitted,
// );
}
/// Toggles like state for a tender
void toggleLike(TenderModel tender) {
// if (tender.liked == true) {
// clearTenderState(tender, isLiked: false);
// } else {
// markLiked(tender);
// }
// notifyListeners();
}
/// Toggles dislike state for a tender
void toggleDislike(TenderModel tender) {
// if (tender.disliked == true) {
// clearTenderState(tender, isDisliked: false);
// } else {
// markDisliked(tender);
// }
// notifyListeners();
}
/// Toggles reject state for a tender
void toggleReject(TenderModel tender) {
// if (tender.rejected == true) {
// clearTenderState(tender, isRejected: false);
// } else {
// markRejected(tender);
// }
// notifyListeners();
}
/// Toggles submit state for a tender
void toggleSubmit(TenderModel tender) {
// if (tender.submitted == true) {
// clearTenderState(tender, isSubmitted: false);
// } else {
// markSubmitted(tender);
// }
// notifyListeners();
}
}