129 lines
3.5 KiB
Dart
129 lines
3.5 KiB
Dart
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/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);
|
|
} on Exception {
|
|
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
|
|
_addOrUpdateFunction(_feedbackData!);
|
|
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) {
|
|
_addOrUpdateFunction(_feedbackData!);
|
|
}
|
|
|
|
break;
|
|
case Error<FeedbackResponse>():
|
|
_errorMessage = result.error.toString();
|
|
break;
|
|
}
|
|
notifyListeners();
|
|
_errorMessage = null;
|
|
notifyListeners();
|
|
}
|
|
|
|
void _addOrUpdateFunction(FeedbackData feedbackData) {
|
|
final index = feedbacks.indexWhere((f) => f.tender == feedbackData.tender);
|
|
if (index != -1) {
|
|
feedbacks[index] = feedbackData;
|
|
} else {
|
|
feedbacks.add(feedbackData);
|
|
}
|
|
}
|
|
}
|