Merge pull request 'refactors' (#114) from refactors into main

Reviewed-on: https://repo.ravanertebat.com/TM/tm_app/pulls/114
This commit is contained in:
a.ghabeli
2025-09-08 15:16:12 +03:30
55 changed files with 520 additions and 475 deletions
+2 -2
View File
@@ -8,13 +8,13 @@ class AppConfig {
// این متد بر اساس محیط فعال، URL مناسب را برمی‌گرداند.
static String get apiBaseUrl {
// return 'http://10.0.2.2:8081';
return 'http://10.0.2.2:8081';
// return '192.168.1.103:8081';
// if (isDevelopment) {
// // Handle different platforms for local development
// if (kIsWeb) {
// For web, use localhost
return 'https://app.opplens.com';
// return 'https://app.opplens.com';
// return 'http://localhost:8081';
// } else {
// For Android emulator, use 10.0.2.2 (special IP for host machine)
+4 -2
View File
@@ -64,8 +64,10 @@ List<SingleChildWidget> get repositories {
Provider(create: (context) => AuthRepository(authService: context.read())),
Provider(
create:
(context) =>
YourTendersRepository(yourTendersService: context.read()),
(context) => YourTendersRepository(
yourTendersService: context.read(),
likedTendersService: context.read(),
),
),
Provider(
create:
+3 -6
View File
@@ -3,11 +3,8 @@ class CommonStrings {
// Truly shared strings across multiple features
static const String noData = 'No data';
static const String selectSubmission = 'Select Submission';
static const String selfApply = 'Self-apply';
static const String partnership = 'Partnership';
static const String confirm = 'Confirm';
static const String submit = 'Submit';
static const String cancel = 'Cancel';
static const String loading = 'Loading...';
static const String error = 'Error';
static const String success = 'Success';
static const String retry = 'Retry';
}
+7
View File
@@ -0,0 +1,7 @@
/// Barrel export for all status enums
library;
export 'tender_approval_status.dart';
export 'tender_approval_status_extension.dart';
export 'tender_feedback.dart';
export 'tender_feedback_extension.dart';
@@ -0,0 +1,21 @@
/// Enum for tender approval statuses
enum TenderApprovalStatus {
submitted,
rejected,
unsubmitted,
unrejected;
/// Convert enum to string value for API
String get value {
switch (this) {
case TenderApprovalStatus.submitted:
return 'submitted';
case TenderApprovalStatus.rejected:
return 'rejected';
case TenderApprovalStatus.unsubmitted:
return 'unsubmitted';
case TenderApprovalStatus.unrejected:
return 'unrejected';
}
}
}
@@ -0,0 +1,20 @@
import 'tender_approval_status.dart';
/// Extension for parsing string to TenderApprovalStatus
extension TenderApprovalStatusExtension on String {
/// Parse string to TenderApprovalStatus
TenderApprovalStatus? toTenderApprovalStatus() {
switch (toLowerCase()) {
case 'submitted':
return TenderApprovalStatus.submitted;
case 'rejected':
return TenderApprovalStatus.rejected;
case 'unsubmitted':
return TenderApprovalStatus.unsubmitted;
case 'unrejected':
return TenderApprovalStatus.unrejected;
default:
return null;
}
}
}
+21
View File
@@ -0,0 +1,21 @@
/// Enum for tender feedback
enum TenderFeedback {
liked,
disliked,
unliked,
undisliked;
/// Convert enum to string value for API
String get value {
switch (this) {
case TenderFeedback.liked:
return 'like';
case TenderFeedback.disliked:
return 'dislike';
case TenderFeedback.unliked:
return 'unlike';
case TenderFeedback.undisliked:
return 'undislike';
}
}
}
@@ -0,0 +1,20 @@
import 'tender_feedback.dart';
/// Extension for parsing string to TenderFeedback
extension TenderFeedbackExtension on String {
/// Parse string to TenderFeedback
TenderFeedback? toTenderFeedback() {
switch (this) {
case 'like':
return TenderFeedback.liked;
case 'dislike':
return TenderFeedback.disliked;
case 'unlike':
return TenderFeedback.unliked;
case 'undislike':
return TenderFeedback.undisliked;
default:
return null;
}
}
}
@@ -0,0 +1,15 @@
/// Enum for tender submission mode
enum TenderSubmissionMode {
selfApply,
partnership;
/// Convert enum to string value for API
String get value {
switch (this) {
case TenderSubmissionMode.selfApply:
return 'self-apply';
case TenderSubmissionMode.partnership:
return 'partnership';
}
}
}
@@ -0,0 +1,17 @@
import 'tender_submision_mode.dart';
/// Extension for parsing string to TenderSubmissionMode
extension TenderSubmissionModeExtension on String {
/// Parse string to TenderSubmissionMode
TenderSubmissionMode? toTenderSubmissionMode() {
switch (this) {
case 'self-apply':
return TenderSubmissionMode.selfApply;
case 'partnership':
return TenderSubmissionMode.partnership;
default:
return null;
}
}
}
+2 -2
View File
@@ -2,7 +2,7 @@ import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/home_service.dart';
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_response/tender_approvals_stats_response.dart';
import '../services/model/feedback_stats_response/feedback_stat_response.dart';
import '../services/model/request_models/get_tenders_request_model/get_tenders_request_model.dart';
@@ -30,7 +30,7 @@ class HomeRepository {
return _yourTendersService.getTenders(requestModel: requestModel);
}
Future<Result<TenderApprovalsStateResponse>> getTendersApprovalsStats() {
Future<Result<TenderApprovalsStatsResponse>> getTendersApprovalsStats() {
return _homeService.getTendersApprovalsStats();
}
@@ -1,6 +1,7 @@
import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/liked_tenders_service.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/data/services/model/request_models/tender_feedback_request_model/tender_feedback_request_model.dart';
class LikedTendersRepository {
final LikedTendersService _likedTendersService;
@@ -8,9 +9,8 @@ class LikedTendersRepository {
: _likedTendersService = likedTendersService;
Future<Result<LikedTendersResponse>> getLikedTenders({
int offset = 0,
int limit = 20,
required TenderFeedbackRequestModel requestModel,
}) {
return _likedTendersService.getLikedTenders(offset: offset, limit: limit);
return _likedTendersService.getLikedTenders(requestModel: requestModel);
}
}
@@ -1,27 +1,20 @@
import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/liked_tenders_service.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/data/services/model/request_models/get_tenders_request_model/get_tenders_request_model.dart';
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
import 'package:tm_app/data/services/your_tenders_service.dart';
import '../services/model/request_models/tender_feedback_request_model/tender_feedback_request_model.dart';
class YourTendersRepository {
final YourTendersService _yourTendersService;
YourTendersRepository({required YourTendersService yourTendersService})
: _yourTendersService = yourTendersService;
Future<Result<TenderApprovalsResponse>> getApprovedTenders({
required int limit,
required int offset,
required String createdFrom,
required String createdTo,
}) {
return _yourTendersService.getApprovedTenders(
limit: limit,
offset: offset,
createdFrom: createdFrom,
createdTo: createdTo,
);
}
final LikedTendersService _likedTendersService;
YourTendersRepository({
required YourTendersService yourTendersService,
required LikedTendersService likedTendersService,
}) : _yourTendersService = yourTendersService,
_likedTendersService = likedTendersService;
Future<Result<TenderApprovalsResponse>> getTenders({
required GetTendersRequestModel requestModel,
@@ -30,18 +23,8 @@ class YourTendersRepository {
}
Future<Result<LikedTendersResponse>> getTendersFeedback({
required int limit,
required int offset,
required String feedbackType,
required String dateFrom,
required String dateTo,
required TenderFeedbackRequestModel requestModel,
}) {
return _yourTendersService.getTendersFeedback(
limit: limit,
offset: offset,
feedbackType: feedbackType,
dateFrom: dateFrom,
dateTo: dateTo,
);
return _likedTendersService.getLikedTenders(requestModel: requestModel);
}
}
+14 -2
View File
@@ -1,4 +1,16 @@
class LikedTendersApi {
static const String likedTenders =
'/api/v1/feedback?feedback_type=like';
static const String tendersFeedback = '/api/v1/feedback';
static String getTendersFeedback({
required int limit,
required int offset,
required String feedbackType,
required String dateFrom,
required String dateTo,
}) {
if (dateFrom.isNotEmpty && dateTo.isNotEmpty) {
return '$tendersFeedback?feedback_type=$feedbackType&limit=$limit&offset=$offset&date_from=$dateFrom&date_to=$dateTo';
}
return '$tendersFeedback?feedback_type=$feedbackType&limit=$limit&offset=$offset';
}
}
@@ -1,20 +1,4 @@
class YourTendersApi {
static const String tenderApprovalsStatus =
'/api/v1/tender-approvals?status=submitted';
static String getTenderApprovalsStatus({
required int limit,
required int offset,
required String createdFrom,
required String createdTo,
}) {
if (createdFrom.isNotEmpty && createdTo.isNotEmpty) {
return '$tenderApprovalsStatus&created_from=$createdFrom&created_to=$createdTo';
}
return tenderApprovalsStatus;
}
// return '$tenderApprovalsStatus?limit=$limit&offset=$offset';
static const String tenderApproval = '/api/v1/tender-approvals';
static String getTenders({
@@ -36,19 +20,4 @@ class YourTendersApi {
return url;
}
static const String tendersFeedback = '/api/v1/feedback';
static String getTendersFeedback({
required int limit,
required int offset,
required String feedbackType,
required String dateFrom,
required String dateTo,
}) {
if (dateFrom.isNotEmpty && dateTo.isNotEmpty) {
return '$tendersFeedback?feedback_type=$feedbackType&limit=$limit&offset=$offset&date_from=$dateFrom&date_to=$dateTo';
}
return '$tendersFeedback?feedback_type=$feedbackType&limit=$limit&offset=$offset';
}
}
+3 -3
View File
@@ -2,7 +2,7 @@ import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/api/home_api.dart';
import 'package:tm_app/data/services/model/feedback_stats_response/feedback_stat_response.dart';
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_response/tender_approvals_stats_response.dart';
import '../../core/network/network_manager.dart';
@@ -23,11 +23,11 @@ class HomeService {
return result;
}
Future<Result<TenderApprovalsStateResponse>>
Future<Result<TenderApprovalsStatsResponse>>
getTendersApprovalsStats() async {
final result = await _networkManager.makeRequest(
HomeApi.tenderApprovalStats,
(json) => TenderApprovalsStateResponse.fromJson(json),
(json) => TenderApprovalsStatsResponse.fromJson(json),
method: 'GET',
);
return result;
+9 -3
View File
@@ -3,6 +3,7 @@ import 'package:tm_app/data/services/api/liked_tenders_api.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import '../../../core/network/network_manager.dart';
import 'model/request_models/tender_feedback_request_model/tender_feedback_request_model.dart';
class LikedTendersService {
LikedTendersService({required NetworkManager networkManager})
@@ -11,10 +12,15 @@ class LikedTendersService {
final NetworkManager _networkManager;
Future<Result<LikedTendersResponse>> getLikedTenders({
int offset = 0,
int limit = 20,
required TenderFeedbackRequestModel requestModel,
}) async {
final uri = '${LikedTendersApi.likedTenders}&limit=$limit&offset=$offset';
final uri = LikedTendersApi.getTendersFeedback(
limit: requestModel.limit,
offset: requestModel.offset,
feedbackType: requestModel.feedbackType,
dateFrom: requestModel.dateFrom,
dateTo: requestModel.dateTo,
);
final result = await _networkManager.makeRequest(
uri,
@@ -0,0 +1,15 @@
class TenderFeedbackRequestModel {
final String feedbackType;
final String dateFrom;
final String dateTo;
final int limit;
final int offset;
TenderFeedbackRequestModel({
required this.feedbackType,
this.dateFrom = '',
this.dateTo = '',
this.limit = 10,
this.offset = 0,
});
}
@@ -1,22 +0,0 @@
// ignore_for_file: invalid_annotation_target
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:tm_app/data/services/model/error/error_model.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_data/tender_approvals_state_data.dart';
part 'tender_approvals_state_response.freezed.dart';
part 'tender_approvals_state_response.g.dart';
@freezed
abstract class TenderApprovalsStateResponse with _$TenderApprovalsStateResponse {
@JsonSerializable(explicitToJson: true)
const factory TenderApprovalsStateResponse({
@JsonKey(name: 'success') required bool? success,
@JsonKey(name: 'message') required String? message,
@JsonKey(name: 'error') ErrorModel? error,
@JsonKey(name: 'data') TenderApprovalsStateData? data,
}) = _TenderApprovalsStateResponse;
factory TenderApprovalsStateResponse.fromJson(Map<String, dynamic> json) =>
_$TenderApprovalsStateResponseFromJson(json);
}
@@ -2,13 +2,13 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'tender_approvals_state_data.freezed.dart';
part 'tender_approvals_state_data.g.dart';
part 'tender_approvals_stats_data.freezed.dart';
part 'tender_approvals_stats_data.g.dart';
@freezed
abstract class TenderApprovalsStateData with _$TenderApprovalsStateData {
abstract class TenderApprovalsStatsData with _$TenderApprovalsStatsData {
@JsonSerializable(explicitToJson: true)
const factory TenderApprovalsStateData({
const factory TenderApprovalsStatsData({
@JsonKey(name: 'company_id') required String? companyId,
@JsonKey(name: 'total_approvals') required int? totalApprovals,
@JsonKey(name: 'submitted_tenders') required int? submittedTenders,
@@ -20,10 +20,10 @@ abstract class TenderApprovalsStateData with _$TenderApprovalsStateData {
@JsonKey(name: 'approvals_by_submission')
required ApprovalsBySubmission? approvalsBySubmission,
@JsonKey(name: 'last_updated') required int? lastUpdated,
}) = _TenderApprovalsStateData;
}) = _TenderApprovalsStatsData;
factory TenderApprovalsStateData.fromJson(Map<String, dynamic> json) =>
_$TenderApprovalsStateDataFromJson(json);
factory TenderApprovalsStatsData.fromJson(Map<String, dynamic> json) =>
_$TenderApprovalsStatsDataFromJson(json);
}
@freezed
@@ -3,7 +3,7 @@
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'tender_approvals_state_data.dart';
part of 'tender_approvals_stats_data.dart';
// **************************************************************************
// FreezedGenerator
@@ -13,22 +13,22 @@ part of 'tender_approvals_state_data.dart';
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$TenderApprovalsStateData {
mixin _$TenderApprovalsStatsData {
@JsonKey(name: 'company_id') String? get companyId;@JsonKey(name: 'total_approvals') int? get totalApprovals;@JsonKey(name: 'submitted_tenders') int? get submittedTenders;@JsonKey(name: 'rejected_tenders') int? get rejectedTenders;@JsonKey(name: 'self_apply_count') int? get selfApplyCount;@JsonKey(name: 'partnership_count') int? get partnershipCount;@JsonKey(name: 'approvals_by_status') ApprovalsByStatus? get approvalsByStatus;@JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? get approvalsBySubmission;@JsonKey(name: 'last_updated') int? get lastUpdated;
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TenderApprovalsStateDataCopyWith<TenderApprovalsStateData> get copyWith => _$TenderApprovalsStateDataCopyWithImpl<TenderApprovalsStateData>(this as TenderApprovalsStateData, _$identity);
$TenderApprovalsStatsDataCopyWith<TenderApprovalsStatsData> get copyWith => _$TenderApprovalsStatsDataCopyWithImpl<TenderApprovalsStatsData>(this as TenderApprovalsStatsData, _$identity);
/// Serializes this TenderApprovalsStateData to a JSON map.
/// Serializes this TenderApprovalsStatsData to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsStateData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.totalApprovals, totalApprovals) || other.totalApprovals == totalApprovals)&&(identical(other.submittedTenders, submittedTenders) || other.submittedTenders == submittedTenders)&&(identical(other.rejectedTenders, rejectedTenders) || other.rejectedTenders == rejectedTenders)&&(identical(other.selfApplyCount, selfApplyCount) || other.selfApplyCount == selfApplyCount)&&(identical(other.partnershipCount, partnershipCount) || other.partnershipCount == partnershipCount)&&(identical(other.approvalsByStatus, approvalsByStatus) || other.approvalsByStatus == approvalsByStatus)&&(identical(other.approvalsBySubmission, approvalsBySubmission) || other.approvalsBySubmission == approvalsBySubmission)&&(identical(other.lastUpdated, lastUpdated) || other.lastUpdated == lastUpdated));
return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsStatsData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.totalApprovals, totalApprovals) || other.totalApprovals == totalApprovals)&&(identical(other.submittedTenders, submittedTenders) || other.submittedTenders == submittedTenders)&&(identical(other.rejectedTenders, rejectedTenders) || other.rejectedTenders == rejectedTenders)&&(identical(other.selfApplyCount, selfApplyCount) || other.selfApplyCount == selfApplyCount)&&(identical(other.partnershipCount, partnershipCount) || other.partnershipCount == partnershipCount)&&(identical(other.approvalsByStatus, approvalsByStatus) || other.approvalsByStatus == approvalsByStatus)&&(identical(other.approvalsBySubmission, approvalsBySubmission) || other.approvalsBySubmission == approvalsBySubmission)&&(identical(other.lastUpdated, lastUpdated) || other.lastUpdated == lastUpdated));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -37,15 +37,15 @@ int get hashCode => Object.hash(runtimeType,companyId,totalApprovals,submittedTe
@override
String toString() {
return 'TenderApprovalsStateData(companyId: $companyId, totalApprovals: $totalApprovals, submittedTenders: $submittedTenders, rejectedTenders: $rejectedTenders, selfApplyCount: $selfApplyCount, partnershipCount: $partnershipCount, approvalsByStatus: $approvalsByStatus, approvalsBySubmission: $approvalsBySubmission, lastUpdated: $lastUpdated)';
return 'TenderApprovalsStatsData(companyId: $companyId, totalApprovals: $totalApprovals, submittedTenders: $submittedTenders, rejectedTenders: $rejectedTenders, selfApplyCount: $selfApplyCount, partnershipCount: $partnershipCount, approvalsByStatus: $approvalsByStatus, approvalsBySubmission: $approvalsBySubmission, lastUpdated: $lastUpdated)';
}
}
/// @nodoc
abstract mixin class $TenderApprovalsStateDataCopyWith<$Res> {
factory $TenderApprovalsStateDataCopyWith(TenderApprovalsStateData value, $Res Function(TenderApprovalsStateData) _then) = _$TenderApprovalsStateDataCopyWithImpl;
abstract mixin class $TenderApprovalsStatsDataCopyWith<$Res> {
factory $TenderApprovalsStatsDataCopyWith(TenderApprovalsStatsData value, $Res Function(TenderApprovalsStatsData) _then) = _$TenderApprovalsStatsDataCopyWithImpl;
@useResult
$Res call({
@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'total_approvals') int? totalApprovals,@JsonKey(name: 'submitted_tenders') int? submittedTenders,@JsonKey(name: 'rejected_tenders') int? rejectedTenders,@JsonKey(name: 'self_apply_count') int? selfApplyCount,@JsonKey(name: 'partnership_count') int? partnershipCount,@JsonKey(name: 'approvals_by_status') ApprovalsByStatus? approvalsByStatus,@JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? approvalsBySubmission,@JsonKey(name: 'last_updated') int? lastUpdated
@@ -56,14 +56,14 @@ $ApprovalsByStatusCopyWith<$Res>? get approvalsByStatus;$ApprovalsBySubmissionCo
}
/// @nodoc
class _$TenderApprovalsStateDataCopyWithImpl<$Res>
implements $TenderApprovalsStateDataCopyWith<$Res> {
_$TenderApprovalsStateDataCopyWithImpl(this._self, this._then);
class _$TenderApprovalsStatsDataCopyWithImpl<$Res>
implements $TenderApprovalsStatsDataCopyWith<$Res> {
_$TenderApprovalsStatsDataCopyWithImpl(this._self, this._then);
final TenderApprovalsStateData _self;
final $Res Function(TenderApprovalsStateData) _then;
final TenderApprovalsStatsData _self;
final $Res Function(TenderApprovalsStatsData) _then;
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? companyId = freezed,Object? totalApprovals = freezed,Object? submittedTenders = freezed,Object? rejectedTenders = freezed,Object? selfApplyCount = freezed,Object? partnershipCount = freezed,Object? approvalsByStatus = freezed,Object? approvalsBySubmission = freezed,Object? lastUpdated = freezed,}) {
return _then(_self.copyWith(
@@ -79,7 +79,7 @@ as ApprovalsBySubmission?,lastUpdated: freezed == lastUpdated ? _self.lastUpdate
as int?,
));
}
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -91,7 +91,7 @@ $ApprovalsByStatusCopyWith<$Res>? get approvalsByStatus {
return $ApprovalsByStatusCopyWith<$Res>(_self.approvalsByStatus!, (value) {
return _then(_self.copyWith(approvalsByStatus: value));
});
}/// Create a copy of TenderApprovalsStateData
}/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -107,8 +107,8 @@ $ApprovalsBySubmissionCopyWith<$Res>? get approvalsBySubmission {
}
/// Adds pattern-matching-related methods to [TenderApprovalsStateData].
extension TenderApprovalsStateDataPatterns on TenderApprovalsStateData {
/// Adds pattern-matching-related methods to [TenderApprovalsStatsData].
extension TenderApprovalsStatsDataPatterns on TenderApprovalsStatsData {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
@@ -121,10 +121,10 @@ extension TenderApprovalsStateDataPatterns on TenderApprovalsStateData {
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TenderApprovalsStateData value)? $default,{required TResult orElse(),}){
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TenderApprovalsStatsData value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TenderApprovalsStateData() when $default != null:
case _TenderApprovalsStatsData() when $default != null:
return $default(_that);case _:
return orElse();
@@ -143,10 +143,10 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TenderApprovalsStateData value) $default,){
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TenderApprovalsStatsData value) $default,){
final _that = this;
switch (_that) {
case _TenderApprovalsStateData():
case _TenderApprovalsStatsData():
return $default(_that);case _:
throw StateError('Unexpected subclass');
@@ -164,10 +164,10 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TenderApprovalsStateData value)? $default,){
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TenderApprovalsStatsData value)? $default,){
final _that = this;
switch (_that) {
case _TenderApprovalsStateData() when $default != null:
case _TenderApprovalsStatsData() when $default != null:
return $default(_that);case _:
return null;
@@ -187,7 +187,7 @@ return $default(_that);case _:
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'total_approvals') int? totalApprovals, @JsonKey(name: 'submitted_tenders') int? submittedTenders, @JsonKey(name: 'rejected_tenders') int? rejectedTenders, @JsonKey(name: 'self_apply_count') int? selfApplyCount, @JsonKey(name: 'partnership_count') int? partnershipCount, @JsonKey(name: 'approvals_by_status') ApprovalsByStatus? approvalsByStatus, @JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? approvalsBySubmission, @JsonKey(name: 'last_updated') int? lastUpdated)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TenderApprovalsStateData() when $default != null:
case _TenderApprovalsStatsData() when $default != null:
return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_that.rejectedTenders,_that.selfApplyCount,_that.partnershipCount,_that.approvalsByStatus,_that.approvalsBySubmission,_that.lastUpdated);case _:
return orElse();
@@ -208,7 +208,7 @@ return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_tha
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'total_approvals') int? totalApprovals, @JsonKey(name: 'submitted_tenders') int? submittedTenders, @JsonKey(name: 'rejected_tenders') int? rejectedTenders, @JsonKey(name: 'self_apply_count') int? selfApplyCount, @JsonKey(name: 'partnership_count') int? partnershipCount, @JsonKey(name: 'approvals_by_status') ApprovalsByStatus? approvalsByStatus, @JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? approvalsBySubmission, @JsonKey(name: 'last_updated') int? lastUpdated) $default,) {final _that = this;
switch (_that) {
case _TenderApprovalsStateData():
case _TenderApprovalsStatsData():
return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_that.rejectedTenders,_that.selfApplyCount,_that.partnershipCount,_that.approvalsByStatus,_that.approvalsBySubmission,_that.lastUpdated);case _:
throw StateError('Unexpected subclass');
@@ -228,7 +228,7 @@ return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_tha
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'total_approvals') int? totalApprovals, @JsonKey(name: 'submitted_tenders') int? submittedTenders, @JsonKey(name: 'rejected_tenders') int? rejectedTenders, @JsonKey(name: 'self_apply_count') int? selfApplyCount, @JsonKey(name: 'partnership_count') int? partnershipCount, @JsonKey(name: 'approvals_by_status') ApprovalsByStatus? approvalsByStatus, @JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? approvalsBySubmission, @JsonKey(name: 'last_updated') int? lastUpdated)? $default,) {final _that = this;
switch (_that) {
case _TenderApprovalsStateData() when $default != null:
case _TenderApprovalsStatsData() when $default != null:
return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_that.rejectedTenders,_that.selfApplyCount,_that.partnershipCount,_that.approvalsByStatus,_that.approvalsBySubmission,_that.lastUpdated);case _:
return null;
@@ -240,9 +240,9 @@ return $default(_that.companyId,_that.totalApprovals,_that.submittedTenders,_tha
/// @nodoc
@JsonSerializable(explicitToJson: true)
class _TenderApprovalsStateData implements TenderApprovalsStateData {
const _TenderApprovalsStateData({@JsonKey(name: 'company_id') required this.companyId, @JsonKey(name: 'total_approvals') required this.totalApprovals, @JsonKey(name: 'submitted_tenders') required this.submittedTenders, @JsonKey(name: 'rejected_tenders') required this.rejectedTenders, @JsonKey(name: 'self_apply_count') required this.selfApplyCount, @JsonKey(name: 'partnership_count') required this.partnershipCount, @JsonKey(name: 'approvals_by_status') required this.approvalsByStatus, @JsonKey(name: 'approvals_by_submission') required this.approvalsBySubmission, @JsonKey(name: 'last_updated') required this.lastUpdated});
factory _TenderApprovalsStateData.fromJson(Map<String, dynamic> json) => _$TenderApprovalsStateDataFromJson(json);
class _TenderApprovalsStatsData implements TenderApprovalsStatsData {
const _TenderApprovalsStatsData({@JsonKey(name: 'company_id') required this.companyId, @JsonKey(name: 'total_approvals') required this.totalApprovals, @JsonKey(name: 'submitted_tenders') required this.submittedTenders, @JsonKey(name: 'rejected_tenders') required this.rejectedTenders, @JsonKey(name: 'self_apply_count') required this.selfApplyCount, @JsonKey(name: 'partnership_count') required this.partnershipCount, @JsonKey(name: 'approvals_by_status') required this.approvalsByStatus, @JsonKey(name: 'approvals_by_submission') required this.approvalsBySubmission, @JsonKey(name: 'last_updated') required this.lastUpdated});
factory _TenderApprovalsStatsData.fromJson(Map<String, dynamic> json) => _$TenderApprovalsStatsDataFromJson(json);
@override@JsonKey(name: 'company_id') final String? companyId;
@override@JsonKey(name: 'total_approvals') final int? totalApprovals;
@@ -254,20 +254,20 @@ class _TenderApprovalsStateData implements TenderApprovalsStateData {
@override@JsonKey(name: 'approvals_by_submission') final ApprovalsBySubmission? approvalsBySubmission;
@override@JsonKey(name: 'last_updated') final int? lastUpdated;
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TenderApprovalsStateDataCopyWith<_TenderApprovalsStateData> get copyWith => __$TenderApprovalsStateDataCopyWithImpl<_TenderApprovalsStateData>(this, _$identity);
_$TenderApprovalsStatsDataCopyWith<_TenderApprovalsStatsData> get copyWith => __$TenderApprovalsStatsDataCopyWithImpl<_TenderApprovalsStatsData>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$TenderApprovalsStateDataToJson(this, );
return _$TenderApprovalsStatsDataToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsStateData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.totalApprovals, totalApprovals) || other.totalApprovals == totalApprovals)&&(identical(other.submittedTenders, submittedTenders) || other.submittedTenders == submittedTenders)&&(identical(other.rejectedTenders, rejectedTenders) || other.rejectedTenders == rejectedTenders)&&(identical(other.selfApplyCount, selfApplyCount) || other.selfApplyCount == selfApplyCount)&&(identical(other.partnershipCount, partnershipCount) || other.partnershipCount == partnershipCount)&&(identical(other.approvalsByStatus, approvalsByStatus) || other.approvalsByStatus == approvalsByStatus)&&(identical(other.approvalsBySubmission, approvalsBySubmission) || other.approvalsBySubmission == approvalsBySubmission)&&(identical(other.lastUpdated, lastUpdated) || other.lastUpdated == lastUpdated));
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsStatsData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.totalApprovals, totalApprovals) || other.totalApprovals == totalApprovals)&&(identical(other.submittedTenders, submittedTenders) || other.submittedTenders == submittedTenders)&&(identical(other.rejectedTenders, rejectedTenders) || other.rejectedTenders == rejectedTenders)&&(identical(other.selfApplyCount, selfApplyCount) || other.selfApplyCount == selfApplyCount)&&(identical(other.partnershipCount, partnershipCount) || other.partnershipCount == partnershipCount)&&(identical(other.approvalsByStatus, approvalsByStatus) || other.approvalsByStatus == approvalsByStatus)&&(identical(other.approvalsBySubmission, approvalsBySubmission) || other.approvalsBySubmission == approvalsBySubmission)&&(identical(other.lastUpdated, lastUpdated) || other.lastUpdated == lastUpdated));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -276,15 +276,15 @@ int get hashCode => Object.hash(runtimeType,companyId,totalApprovals,submittedTe
@override
String toString() {
return 'TenderApprovalsStateData(companyId: $companyId, totalApprovals: $totalApprovals, submittedTenders: $submittedTenders, rejectedTenders: $rejectedTenders, selfApplyCount: $selfApplyCount, partnershipCount: $partnershipCount, approvalsByStatus: $approvalsByStatus, approvalsBySubmission: $approvalsBySubmission, lastUpdated: $lastUpdated)';
return 'TenderApprovalsStatsData(companyId: $companyId, totalApprovals: $totalApprovals, submittedTenders: $submittedTenders, rejectedTenders: $rejectedTenders, selfApplyCount: $selfApplyCount, partnershipCount: $partnershipCount, approvalsByStatus: $approvalsByStatus, approvalsBySubmission: $approvalsBySubmission, lastUpdated: $lastUpdated)';
}
}
/// @nodoc
abstract mixin class _$TenderApprovalsStateDataCopyWith<$Res> implements $TenderApprovalsStateDataCopyWith<$Res> {
factory _$TenderApprovalsStateDataCopyWith(_TenderApprovalsStateData value, $Res Function(_TenderApprovalsStateData) _then) = __$TenderApprovalsStateDataCopyWithImpl;
abstract mixin class _$TenderApprovalsStatsDataCopyWith<$Res> implements $TenderApprovalsStatsDataCopyWith<$Res> {
factory _$TenderApprovalsStatsDataCopyWith(_TenderApprovalsStatsData value, $Res Function(_TenderApprovalsStatsData) _then) = __$TenderApprovalsStatsDataCopyWithImpl;
@override @useResult
$Res call({
@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'total_approvals') int? totalApprovals,@JsonKey(name: 'submitted_tenders') int? submittedTenders,@JsonKey(name: 'rejected_tenders') int? rejectedTenders,@JsonKey(name: 'self_apply_count') int? selfApplyCount,@JsonKey(name: 'partnership_count') int? partnershipCount,@JsonKey(name: 'approvals_by_status') ApprovalsByStatus? approvalsByStatus,@JsonKey(name: 'approvals_by_submission') ApprovalsBySubmission? approvalsBySubmission,@JsonKey(name: 'last_updated') int? lastUpdated
@@ -295,17 +295,17 @@ $Res call({
}
/// @nodoc
class __$TenderApprovalsStateDataCopyWithImpl<$Res>
implements _$TenderApprovalsStateDataCopyWith<$Res> {
__$TenderApprovalsStateDataCopyWithImpl(this._self, this._then);
class __$TenderApprovalsStatsDataCopyWithImpl<$Res>
implements _$TenderApprovalsStatsDataCopyWith<$Res> {
__$TenderApprovalsStatsDataCopyWithImpl(this._self, this._then);
final _TenderApprovalsStateData _self;
final $Res Function(_TenderApprovalsStateData) _then;
final _TenderApprovalsStatsData _self;
final $Res Function(_TenderApprovalsStatsData) _then;
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? companyId = freezed,Object? totalApprovals = freezed,Object? submittedTenders = freezed,Object? rejectedTenders = freezed,Object? selfApplyCount = freezed,Object? partnershipCount = freezed,Object? approvalsByStatus = freezed,Object? approvalsBySubmission = freezed,Object? lastUpdated = freezed,}) {
return _then(_TenderApprovalsStateData(
return _then(_TenderApprovalsStatsData(
companyId: freezed == companyId ? _self.companyId : companyId // ignore: cast_nullable_to_non_nullable
as String?,totalApprovals: freezed == totalApprovals ? _self.totalApprovals : totalApprovals // ignore: cast_nullable_to_non_nullable
as int?,submittedTenders: freezed == submittedTenders ? _self.submittedTenders : submittedTenders // ignore: cast_nullable_to_non_nullable
@@ -319,7 +319,7 @@ as int?,
));
}
/// Create a copy of TenderApprovalsStateData
/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -331,7 +331,7 @@ $ApprovalsByStatusCopyWith<$Res>? get approvalsByStatus {
return $ApprovalsByStatusCopyWith<$Res>(_self.approvalsByStatus!, (value) {
return _then(_self.copyWith(approvalsByStatus: value));
});
}/// Create a copy of TenderApprovalsStateData
}/// Create a copy of TenderApprovalsStatsData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -1,14 +1,14 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'tender_approvals_state_data.dart';
part of 'tender_approvals_stats_data.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_TenderApprovalsStateData _$TenderApprovalsStateDataFromJson(
_TenderApprovalsStatsData _$TenderApprovalsStatsDataFromJson(
Map<String, dynamic> json,
) => _TenderApprovalsStateData(
) => _TenderApprovalsStatsData(
companyId: json['company_id'] as String?,
totalApprovals: (json['total_approvals'] as num?)?.toInt(),
submittedTenders: (json['submitted_tenders'] as num?)?.toInt(),
@@ -30,8 +30,8 @@ _TenderApprovalsStateData _$TenderApprovalsStateDataFromJson(
lastUpdated: (json['last_updated'] as num?)?.toInt(),
);
Map<String, dynamic> _$TenderApprovalsStateDataToJson(
_TenderApprovalsStateData instance,
Map<String, dynamic> _$TenderApprovalsStatsDataToJson(
_TenderApprovalsStatsData instance,
) => <String, dynamic>{
'company_id': instance.companyId,
'total_approvals': instance.totalApprovals,
@@ -0,0 +1,23 @@
// ignore_for_file: invalid_annotation_target
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:tm_app/data/services/model/error/error_model.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_data/tender_approvals_stats_data.dart';
part 'tender_approvals_stats_response.freezed.dart';
part 'tender_approvals_stats_response.g.dart';
@freezed
abstract class TenderApprovalsStatsResponse
with _$TenderApprovalsStatsResponse {
@JsonSerializable(explicitToJson: true)
const factory TenderApprovalsStatsResponse({
@JsonKey(name: 'success') required bool? success,
@JsonKey(name: 'message') required String? message,
@JsonKey(name: 'error') ErrorModel? error,
@JsonKey(name: 'data') TenderApprovalsStatsData? data,
}) = _TenderApprovalsStatsResponse;
factory TenderApprovalsStatsResponse.fromJson(Map<String, dynamic> json) =>
_$TenderApprovalsStatsResponseFromJson(json);
}
@@ -3,7 +3,7 @@
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'tender_approvals_state_response.dart';
part of 'tender_approvals_stats_response.dart';
// **************************************************************************
// FreezedGenerator
@@ -13,22 +13,22 @@ part of 'tender_approvals_state_response.dart';
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$TenderApprovalsStateResponse {
mixin _$TenderApprovalsStatsResponse {
@JsonKey(name: 'success') bool? get success;@JsonKey(name: 'message') String? get message;@JsonKey(name: 'error') ErrorModel? get error;@JsonKey(name: 'data') TenderApprovalsStateData? get data;
/// Create a copy of TenderApprovalsStateResponse
@JsonKey(name: 'success') bool? get success;@JsonKey(name: 'message') String? get message;@JsonKey(name: 'error') ErrorModel? get error;@JsonKey(name: 'data') TenderApprovalsStatsData? get data;
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TenderApprovalsStateResponseCopyWith<TenderApprovalsStateResponse> get copyWith => _$TenderApprovalsStateResponseCopyWithImpl<TenderApprovalsStateResponse>(this as TenderApprovalsStateResponse, _$identity);
$TenderApprovalsStatsResponseCopyWith<TenderApprovalsStatsResponse> get copyWith => _$TenderApprovalsStatsResponseCopyWithImpl<TenderApprovalsStatsResponse>(this as TenderApprovalsStatsResponse, _$identity);
/// Serializes this TenderApprovalsStateResponse to a JSON map.
/// Serializes this TenderApprovalsStatsResponse to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsStateResponse&&(identical(other.success, success) || other.success == success)&&(identical(other.message, message) || other.message == message)&&(identical(other.error, error) || other.error == error)&&(identical(other.data, data) || other.data == data));
return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsStatsResponse&&(identical(other.success, success) || other.success == success)&&(identical(other.message, message) || other.message == message)&&(identical(other.error, error) || other.error == error)&&(identical(other.data, data) || other.data == data));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -37,33 +37,33 @@ int get hashCode => Object.hash(runtimeType,success,message,error,data);
@override
String toString() {
return 'TenderApprovalsStateResponse(success: $success, message: $message, error: $error, data: $data)';
return 'TenderApprovalsStatsResponse(success: $success, message: $message, error: $error, data: $data)';
}
}
/// @nodoc
abstract mixin class $TenderApprovalsStateResponseCopyWith<$Res> {
factory $TenderApprovalsStateResponseCopyWith(TenderApprovalsStateResponse value, $Res Function(TenderApprovalsStateResponse) _then) = _$TenderApprovalsStateResponseCopyWithImpl;
abstract mixin class $TenderApprovalsStatsResponseCopyWith<$Res> {
factory $TenderApprovalsStatsResponseCopyWith(TenderApprovalsStatsResponse value, $Res Function(TenderApprovalsStatsResponse) _then) = _$TenderApprovalsStatsResponseCopyWithImpl;
@useResult
$Res call({
@JsonKey(name: 'success') bool? success,@JsonKey(name: 'message') String? message,@JsonKey(name: 'error') ErrorModel? error,@JsonKey(name: 'data') TenderApprovalsStateData? data
@JsonKey(name: 'success') bool? success,@JsonKey(name: 'message') String? message,@JsonKey(name: 'error') ErrorModel? error,@JsonKey(name: 'data') TenderApprovalsStatsData? data
});
$ErrorModelCopyWith<$Res>? get error;$TenderApprovalsStateDataCopyWith<$Res>? get data;
$ErrorModelCopyWith<$Res>? get error;$TenderApprovalsStatsDataCopyWith<$Res>? get data;
}
/// @nodoc
class _$TenderApprovalsStateResponseCopyWithImpl<$Res>
implements $TenderApprovalsStateResponseCopyWith<$Res> {
_$TenderApprovalsStateResponseCopyWithImpl(this._self, this._then);
class _$TenderApprovalsStatsResponseCopyWithImpl<$Res>
implements $TenderApprovalsStatsResponseCopyWith<$Res> {
_$TenderApprovalsStatsResponseCopyWithImpl(this._self, this._then);
final TenderApprovalsStateResponse _self;
final $Res Function(TenderApprovalsStateResponse) _then;
final TenderApprovalsStatsResponse _self;
final $Res Function(TenderApprovalsStatsResponse) _then;
/// Create a copy of TenderApprovalsStateResponse
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? success = freezed,Object? message = freezed,Object? error = freezed,Object? data = freezed,}) {
return _then(_self.copyWith(
@@ -71,10 +71,10 @@ success: freezed == success ? _self.success : success // ignore: cast_nullable_t
as bool?,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable
as String?,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable
as ErrorModel?,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable
as TenderApprovalsStateData?,
as TenderApprovalsStatsData?,
));
}
/// Create a copy of TenderApprovalsStateResponse
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -86,24 +86,24 @@ $ErrorModelCopyWith<$Res>? get error {
return $ErrorModelCopyWith<$Res>(_self.error!, (value) {
return _then(_self.copyWith(error: value));
});
}/// Create a copy of TenderApprovalsStateResponse
}/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TenderApprovalsStateDataCopyWith<$Res>? get data {
$TenderApprovalsStatsDataCopyWith<$Res>? get data {
if (_self.data == null) {
return null;
}
return $TenderApprovalsStateDataCopyWith<$Res>(_self.data!, (value) {
return $TenderApprovalsStatsDataCopyWith<$Res>(_self.data!, (value) {
return _then(_self.copyWith(data: value));
});
}
}
/// Adds pattern-matching-related methods to [TenderApprovalsStateResponse].
extension TenderApprovalsStateResponsePatterns on TenderApprovalsStateResponse {
/// Adds pattern-matching-related methods to [TenderApprovalsStatsResponse].
extension TenderApprovalsStatsResponsePatterns on TenderApprovalsStatsResponse {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
@@ -116,10 +116,10 @@ extension TenderApprovalsStateResponsePatterns on TenderApprovalsStateResponse {
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TenderApprovalsStateResponse value)? $default,{required TResult orElse(),}){
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TenderApprovalsStatsResponse value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse() when $default != null:
case _TenderApprovalsStatsResponse() when $default != null:
return $default(_that);case _:
return orElse();
@@ -138,10 +138,10 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TenderApprovalsStateResponse value) $default,){
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TenderApprovalsStatsResponse value) $default,){
final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse():
case _TenderApprovalsStatsResponse():
return $default(_that);case _:
throw StateError('Unexpected subclass');
@@ -159,10 +159,10 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TenderApprovalsStateResponse value)? $default,){
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TenderApprovalsStatsResponse value)? $default,){
final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse() when $default != null:
case _TenderApprovalsStatsResponse() when $default != null:
return $default(_that);case _:
return null;
@@ -180,9 +180,9 @@ return $default(_that);case _:
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStateData? data)? $default,{required TResult orElse(),}) {final _that = this;
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStatsData? data)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse() when $default != null:
case _TenderApprovalsStatsResponse() when $default != null:
return $default(_that.success,_that.message,_that.error,_that.data);case _:
return orElse();
@@ -201,9 +201,9 @@ return $default(_that.success,_that.message,_that.error,_that.data);case _:
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStateData? data) $default,) {final _that = this;
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStatsData? data) $default,) {final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse():
case _TenderApprovalsStatsResponse():
return $default(_that.success,_that.message,_that.error,_that.data);case _:
throw StateError('Unexpected subclass');
@@ -221,9 +221,9 @@ return $default(_that.success,_that.message,_that.error,_that.data);case _:
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStateData? data)? $default,) {final _that = this;
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(name: 'success') bool? success, @JsonKey(name: 'message') String? message, @JsonKey(name: 'error') ErrorModel? error, @JsonKey(name: 'data') TenderApprovalsStatsData? data)? $default,) {final _that = this;
switch (_that) {
case _TenderApprovalsStateResponse() when $default != null:
case _TenderApprovalsStatsResponse() when $default != null:
return $default(_that.success,_that.message,_that.error,_that.data);case _:
return null;
@@ -235,29 +235,29 @@ return $default(_that.success,_that.message,_that.error,_that.data);case _:
/// @nodoc
@JsonSerializable(explicitToJson: true)
class _TenderApprovalsStateResponse implements TenderApprovalsStateResponse {
const _TenderApprovalsStateResponse({@JsonKey(name: 'success') required this.success, @JsonKey(name: 'message') required this.message, @JsonKey(name: 'error') this.error, @JsonKey(name: 'data') this.data});
factory _TenderApprovalsStateResponse.fromJson(Map<String, dynamic> json) => _$TenderApprovalsStateResponseFromJson(json);
class _TenderApprovalsStatsResponse implements TenderApprovalsStatsResponse {
const _TenderApprovalsStatsResponse({@JsonKey(name: 'success') required this.success, @JsonKey(name: 'message') required this.message, @JsonKey(name: 'error') this.error, @JsonKey(name: 'data') this.data});
factory _TenderApprovalsStatsResponse.fromJson(Map<String, dynamic> json) => _$TenderApprovalsStatsResponseFromJson(json);
@override@JsonKey(name: 'success') final bool? success;
@override@JsonKey(name: 'message') final String? message;
@override@JsonKey(name: 'error') final ErrorModel? error;
@override@JsonKey(name: 'data') final TenderApprovalsStateData? data;
@override@JsonKey(name: 'data') final TenderApprovalsStatsData? data;
/// Create a copy of TenderApprovalsStateResponse
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TenderApprovalsStateResponseCopyWith<_TenderApprovalsStateResponse> get copyWith => __$TenderApprovalsStateResponseCopyWithImpl<_TenderApprovalsStateResponse>(this, _$identity);
_$TenderApprovalsStatsResponseCopyWith<_TenderApprovalsStatsResponse> get copyWith => __$TenderApprovalsStatsResponseCopyWithImpl<_TenderApprovalsStatsResponse>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$TenderApprovalsStateResponseToJson(this, );
return _$TenderApprovalsStatsResponseToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsStateResponse&&(identical(other.success, success) || other.success == success)&&(identical(other.message, message) || other.message == message)&&(identical(other.error, error) || other.error == error)&&(identical(other.data, data) || other.data == data));
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsStatsResponse&&(identical(other.success, success) || other.success == success)&&(identical(other.message, message) || other.message == message)&&(identical(other.error, error) || other.error == error)&&(identical(other.data, data) || other.data == data));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@@ -266,45 +266,45 @@ int get hashCode => Object.hash(runtimeType,success,message,error,data);
@override
String toString() {
return 'TenderApprovalsStateResponse(success: $success, message: $message, error: $error, data: $data)';
return 'TenderApprovalsStatsResponse(success: $success, message: $message, error: $error, data: $data)';
}
}
/// @nodoc
abstract mixin class _$TenderApprovalsStateResponseCopyWith<$Res> implements $TenderApprovalsStateResponseCopyWith<$Res> {
factory _$TenderApprovalsStateResponseCopyWith(_TenderApprovalsStateResponse value, $Res Function(_TenderApprovalsStateResponse) _then) = __$TenderApprovalsStateResponseCopyWithImpl;
abstract mixin class _$TenderApprovalsStatsResponseCopyWith<$Res> implements $TenderApprovalsStatsResponseCopyWith<$Res> {
factory _$TenderApprovalsStatsResponseCopyWith(_TenderApprovalsStatsResponse value, $Res Function(_TenderApprovalsStatsResponse) _then) = __$TenderApprovalsStatsResponseCopyWithImpl;
@override @useResult
$Res call({
@JsonKey(name: 'success') bool? success,@JsonKey(name: 'message') String? message,@JsonKey(name: 'error') ErrorModel? error,@JsonKey(name: 'data') TenderApprovalsStateData? data
@JsonKey(name: 'success') bool? success,@JsonKey(name: 'message') String? message,@JsonKey(name: 'error') ErrorModel? error,@JsonKey(name: 'data') TenderApprovalsStatsData? data
});
@override $ErrorModelCopyWith<$Res>? get error;@override $TenderApprovalsStateDataCopyWith<$Res>? get data;
@override $ErrorModelCopyWith<$Res>? get error;@override $TenderApprovalsStatsDataCopyWith<$Res>? get data;
}
/// @nodoc
class __$TenderApprovalsStateResponseCopyWithImpl<$Res>
implements _$TenderApprovalsStateResponseCopyWith<$Res> {
__$TenderApprovalsStateResponseCopyWithImpl(this._self, this._then);
class __$TenderApprovalsStatsResponseCopyWithImpl<$Res>
implements _$TenderApprovalsStatsResponseCopyWith<$Res> {
__$TenderApprovalsStatsResponseCopyWithImpl(this._self, this._then);
final _TenderApprovalsStateResponse _self;
final $Res Function(_TenderApprovalsStateResponse) _then;
final _TenderApprovalsStatsResponse _self;
final $Res Function(_TenderApprovalsStatsResponse) _then;
/// Create a copy of TenderApprovalsStateResponse
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? success = freezed,Object? message = freezed,Object? error = freezed,Object? data = freezed,}) {
return _then(_TenderApprovalsStateResponse(
return _then(_TenderApprovalsStatsResponse(
success: freezed == success ? _self.success : success // ignore: cast_nullable_to_non_nullable
as bool?,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable
as String?,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable
as ErrorModel?,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable
as TenderApprovalsStateData?,
as TenderApprovalsStatsData?,
));
}
/// Create a copy of TenderApprovalsStateResponse
/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
@@ -316,16 +316,16 @@ $ErrorModelCopyWith<$Res>? get error {
return $ErrorModelCopyWith<$Res>(_self.error!, (value) {
return _then(_self.copyWith(error: value));
});
}/// Create a copy of TenderApprovalsStateResponse
}/// Create a copy of TenderApprovalsStatsResponse
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TenderApprovalsStateDataCopyWith<$Res>? get data {
$TenderApprovalsStatsDataCopyWith<$Res>? get data {
if (_self.data == null) {
return null;
}
return $TenderApprovalsStateDataCopyWith<$Res>(_self.data!, (value) {
return $TenderApprovalsStatsDataCopyWith<$Res>(_self.data!, (value) {
return _then(_self.copyWith(data: value));
});
}
@@ -1,14 +1,14 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'tender_approvals_state_response.dart';
part of 'tender_approvals_stats_response.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_TenderApprovalsStateResponse _$TenderApprovalsStateResponseFromJson(
_TenderApprovalsStatsResponse _$TenderApprovalsStatsResponseFromJson(
Map<String, dynamic> json,
) => _TenderApprovalsStateResponse(
) => _TenderApprovalsStatsResponse(
success: json['success'] as bool?,
message: json['message'] as String?,
error:
@@ -18,13 +18,13 @@ _TenderApprovalsStateResponse _$TenderApprovalsStateResponseFromJson(
data:
json['data'] == null
? null
: TenderApprovalsStateData.fromJson(
: TenderApprovalsStatsData.fromJson(
json['data'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$TenderApprovalsStateResponseToJson(
_TenderApprovalsStateResponse instance,
Map<String, dynamic> _$TenderApprovalsStatsResponseToJson(
_TenderApprovalsStatsResponse instance,
) => <String, dynamic>{
'success': instance.success,
'message': instance.message,
@@ -1,6 +1,5 @@
import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/api/your_tenders_api.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
import '../../../core/network/network_manager.dart';
@@ -12,26 +11,6 @@ class YourTendersService {
final NetworkManager _networkManager;
Future<Result<TenderApprovalsResponse>> getApprovedTenders({
required int limit,
required int offset,
required String createdFrom,
required String createdTo,
}) async {
final result = await _networkManager.makeRequest(
YourTendersApi.getTenderApprovalsStatus(
limit: limit,
offset: offset,
createdFrom: createdFrom,
createdTo: createdTo,
),
(json) => TenderApprovalsResponse.fromJson(json),
method: 'GET',
);
return result;
}
Future<Result<TenderApprovalsResponse>> getTenders({
required GetTendersRequestModel requestModel,
}) async {
@@ -48,25 +27,4 @@ class YourTendersService {
);
return result;
}
Future<Result<LikedTendersResponse>> getTendersFeedback({
required int limit,
required int offset,
required String feedbackType,
required String dateFrom,
required String dateTo,
}) async {
final result = await _networkManager.makeRequest(
YourTendersApi.getTendersFeedback(
limit: limit,
offset: offset,
feedbackType: feedbackType,
dateFrom: dateFrom,
dateTo: dateTo,
),
(json) => LikedTendersResponse.fromJson(json),
method: 'GET',
);
return result;
}
}
+4 -4
View File
@@ -3,7 +3,7 @@ import 'package:tm_app/core/utils/result.dart';
import 'package:tm_app/data/services/model/feedback_stats/feedback_stats.dart';
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_response/tender_approvals_stats_response.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import '../data/repositories/home_repository.dart';
@@ -29,7 +29,7 @@ class HomeViewModel with ChangeNotifier {
HomeResponseModel? get homeResponse => _homeResponse;
RecommendedTendersResponse? _recommendedTendersResponse;
TenderApprovalsStateResponse? tenderApprovalsStateResponse;
TenderApprovalsStatsResponse? tenderApprovalsStateResponse;
FeedbackStats? feedbackStats;
final List<TenderData> _tenders = [];
final int _pageSize = 10;
@@ -161,10 +161,10 @@ class HomeViewModel with ChangeNotifier {
final result = await _homeRepository.getTendersApprovalsStats();
switch (result) {
case Ok<TenderApprovalsStateResponse>():
case Ok<TenderApprovalsStatsResponse>():
tenderApprovalsStateResponse = result.value;
break;
case Error<TenderApprovalsStateResponse>():
case Error<TenderApprovalsStatsResponse>():
_errorMessage = result.error.toString();
break;
}
+28 -13
View File
@@ -7,7 +7,9 @@ import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_
import 'package:tm_app/data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart';
import 'package:tm_app/view_models/home_view_model.dart';
import '../core/constants/tender_approval_status.dart';
import '../data/services/model/feedback_response/feedback_response.dart';
import '../data/services/model/request_models/tender_feedback_request_model/tender_feedback_request_model.dart';
import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart';
import '../data/services/model/tender_approvals_data/tender_approvals_data.dart';
@@ -83,9 +85,14 @@ class LikedTendersViewModel with ChangeNotifier {
errorMessage = null;
final result = await _likedTendersRepository.getLikedTenders(
final requestModel = TenderFeedbackRequestModel(
offset: _offset,
limit: _limit,
feedbackType: 'like',
);
final result = await _likedTendersRepository.getLikedTenders(
requestModel: requestModel,
);
switch (result) {
@@ -239,12 +246,14 @@ class LikedTendersViewModel with ChangeNotifier {
/// Check if tender is submitted
bool isTenderSubmitted(String tenderId) {
return getApprovalStatusForTenderId(tenderId) == 'submitted';
return getApprovalStatusForTenderId(tenderId) ==
TenderApprovalStatus.submitted.value;
}
/// Check if tender is rejected
bool isTenderRejected(String tenderId) {
return getApprovalStatusForTenderId(tenderId) == 'rejected';
return getApprovalStatusForTenderId(tenderId) ==
TenderApprovalStatus.rejected.value;
}
Future<void> submitTenderApproval({
@@ -262,12 +271,15 @@ class LikedTendersViewModel with ChangeNotifier {
final existingApproval = getApprovalStatusForTender(tenderId);
if (existingApproval != null) {
if (existingApproval.status == 'submitted') {
if (existingApproval.status == TenderApprovalStatus.submitted.value) {
// Remove from list if already submitted
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
} else if (existingApproval.status == 'rejected') {
} else if (existingApproval.status ==
TenderApprovalStatus.rejected.value) {
// Change rejected to submitted
final updatedApproval = existingApproval.copyWith(status: 'submitted');
final updatedApproval = existingApproval.copyWith(
status: TenderApprovalStatus.submitted.value,
);
final index = tenderApprovals.indexWhere((a) => a.tenderId == tenderId);
if (index != -1) {
tenderApprovals[index] = updatedApproval;
@@ -277,7 +289,7 @@ class LikedTendersViewModel with ChangeNotifier {
// Add new approval with submitted status
final newApproval = TenderApprovalsData(
id: null,
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
tenderId: tenderId,
companyId: null,
submissionMode: submissionMode,
@@ -292,7 +304,7 @@ class LikedTendersViewModel with ChangeNotifier {
// Make server request
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
submissionMode: submissionMode,
);
@@ -328,12 +340,15 @@ class LikedTendersViewModel with ChangeNotifier {
final existingApproval = getApprovalStatusForTender(tenderId);
if (existingApproval != null) {
if (existingApproval.status == 'rejected') {
if (existingApproval.status == TenderApprovalStatus.rejected.value) {
// Remove from list if already rejected
tenderApprovals.removeWhere((a) => a.tenderId == tenderId);
} else if (existingApproval.status == 'submitted') {
} else if (existingApproval.status ==
TenderApprovalStatus.submitted.value) {
// Change submitted to rejected
final updatedApproval = existingApproval.copyWith(status: 'rejected');
final updatedApproval = existingApproval.copyWith(
status: TenderApprovalStatus.rejected.value,
);
final index = tenderApprovals.indexWhere((a) => a.tenderId == tenderId);
if (index != -1) {
tenderApprovals[index] = updatedApproval;
@@ -343,7 +358,7 @@ class LikedTendersViewModel with ChangeNotifier {
// Add new approval with rejected status
final newApproval = TenderApprovalsData(
id: null,
status: 'rejected',
status: TenderApprovalStatus.rejected.value,
tenderId: tenderId,
companyId: null,
submissionMode: submissionMode,
@@ -358,7 +373,7 @@ class LikedTendersViewModel with ChangeNotifier {
// Make server request
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'rejected',
status: TenderApprovalStatus.rejected.value,
submissionMode: submissionMode,
);
@@ -5,6 +5,7 @@ import 'package:tm_app/data/repositories/tenders_repository.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_response_model.dart';
import '../core/constants/tender_approval_status.dart';
import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart';
import '../data/services/model/tender_approvals_data/tender_approvals_data.dart';
import '../data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart';
@@ -73,7 +74,7 @@ class TenderDetailViewModel with ChangeNotifier {
notifyListeners();
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
submissionMode: submissionMode,
);
switch (result) {
@@ -102,7 +103,7 @@ class TenderDetailViewModel with ChangeNotifier {
notifyListeners();
final result = await _tendersRepository.toggleApprovals(
tenderId: tenderId,
status: 'rejected',
status: TenderApprovalStatus.rejected.value,
submissionMode: submissionMode,
);
switch (result) {
+5 -1
View File
@@ -8,6 +8,7 @@ import 'package:tm_app/data/services/model/tender_approvals_toggle_data/tender_a
import 'package:tm_app/data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart';
import 'package:tm_app/data/services/model/tenders/tenders_response/tenders_response.dart';
import '../core/constants/tender_submision_mode.dart';
import '../core/utils/result.dart';
import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart';
import '../data/services/model/tender_approvals_data/tender_approvals_data.dart';
@@ -420,7 +421,10 @@ class TendersViewModel with ChangeNotifier {
status: _tenderApprovalToggleData!.status!,
tenderId: _tenderApprovalToggleData!.tenderId,
companyId: _tenderApprovalToggleData!.companyId,
submissionMode: _tenderApprovalToggleData!.submissionMode,
submissionMode:
(_tenderApprovalToggleData!.submissionMode?.isNotEmpty == true)
? _tenderApprovalToggleData!.submissionMode
: TenderSubmissionMode.selfApply.value,
createdAt: _tenderApprovalToggleData!.createdAt,
tender: null, // Tender data is not included in toggle response
);
+19 -6
View File
@@ -6,7 +6,10 @@ import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import '../core/constants/tender_approval_status.dart';
import '../core/constants/tender_feedback.dart';
import '../data/services/model/request_models/get_tenders_request_model/get_tenders_request_model.dart';
import '../data/services/model/request_models/tender_feedback_request_model/tender_feedback_request_model.dart';
class YourTendersViewModel with ChangeNotifier {
final YourTendersRepository yourTendersRepository;
@@ -132,14 +135,18 @@ class YourTendersViewModel with ChangeNotifier {
}
notifyListeners();
final result = await yourTendersRepository.getTendersFeedback(
limit: _limit,
final requestModel = TenderFeedbackRequestModel(
offset: _offset,
limit: _limit,
feedbackType: _currentFeedbackType ?? feedbackType,
dateFrom: startDateUnix,
dateTo: endDateUnix,
);
final result = await yourTendersRepository.getTendersFeedback(
requestModel: requestModel,
);
switch (result) {
case Ok<LikedTendersResponse>():
final incoming = result.value;
@@ -196,7 +203,7 @@ class YourTendersViewModel with ChangeNotifier {
await getTenders(requestModel: requestModel);
} else if (selectedStatus == YourTendersStrings.tendersSubmitted) {
final requestModel = GetTendersRequestModel(
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
createdFrom: startDateUnix,
createdTo: endDateUnix,
limit: _tendersLimit,
@@ -267,7 +274,7 @@ class YourTendersViewModel with ChangeNotifier {
await getTenders(requestModel: requestModel, reset: true);
} else if (selectedStatus == YourTendersStrings.tendersSubmitted) {
final requestModel = GetTendersRequestModel(
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
createdFrom: startDateUnix,
createdTo: endDateUnix,
limit: _tendersLimit,
@@ -275,9 +282,15 @@ class YourTendersViewModel with ChangeNotifier {
);
await getTenders(requestModel: requestModel, reset: true);
} else if (selectedStatus == YourTendersStrings.likeTenders) {
await getTendersFeedback(feedbackType: 'like', reset: true);
await getTendersFeedback(
feedbackType: TenderFeedback.liked.value,
reset: true,
);
} else if (selectedStatus == YourTendersStrings.dislikeTenders) {
await getTendersFeedback(feedbackType: 'dislike', reset: true);
await getTendersFeedback(
feedbackType: TenderFeedback.disliked.value,
reset: true,
);
}
}
}
@@ -7,6 +7,7 @@ import 'package:tm_app/views/detail/widgets/tender_detail_action.dart';
import 'package:tm_app/views/detail/widgets/tender_detail_card.dart';
import 'package:tm_app/views/detail/widgets/tender_detail_header.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/utils/app_toast.dart';
import '../../shared/desktop_navigation_widget.dart';
import '../strings/tender_details_strings.dart';
@@ -31,7 +32,7 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
void _viewModelListener() {
if (viewModel.status.isNotEmpty &&
viewModel.status == 'submitted' &&
viewModel.status == TenderApprovalStatus.submitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -39,7 +40,7 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unsubmitted' &&
viewModel.status == TenderApprovalStatus.unsubmitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -47,7 +48,7 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'rejected' &&
viewModel.status == TenderApprovalStatus.rejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -55,7 +56,7 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unrejected' &&
viewModel.status == TenderApprovalStatus.unrejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -10,6 +10,7 @@ import 'package:tm_app/views/detail/widgets/tender_detail_card.dart';
import 'package:tm_app/views/detail/widgets/tender_detail_header.dart';
import 'package:tm_app/views/shared/tender_app_bar.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/utils/app_toast.dart';
class TenderDetailMobilePage extends StatefulWidget {
@@ -31,7 +32,7 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
void _viewModelListener() {
if (viewModel.status.isNotEmpty &&
viewModel.status == 'submitted' &&
viewModel.status == TenderApprovalStatus.submitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -39,7 +40,7 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unsubmitted' &&
viewModel.status == TenderApprovalStatus.unsubmitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -47,7 +48,7 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'rejected' &&
viewModel.status == TenderApprovalStatus.rejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -55,7 +56,7 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unrejected' &&
viewModel.status == TenderApprovalStatus.unrejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -9,6 +9,7 @@ import 'package:tm_app/views/detail/widgets/tender_detail_card.dart';
import 'package:tm_app/views/detail/widgets/tender_detail_header.dart';
import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/utils/app_toast.dart';
import '../../shared/tender_app_bar.dart';
import '../strings/tender_details_strings.dart';
@@ -32,7 +33,7 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
void _viewModelListener() {
if (viewModel.status.isNotEmpty &&
viewModel.status == 'submitted' &&
viewModel.status == TenderApprovalStatus.submitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -40,7 +41,7 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unsubmitted' &&
viewModel.status == TenderApprovalStatus.unsubmitted.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -48,7 +49,7 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'rejected' &&
viewModel.status == TenderApprovalStatus.rejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -56,7 +57,7 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
);
}
if (viewModel.status.isNotEmpty &&
viewModel.status == 'unrejected' &&
viewModel.status == TenderApprovalStatus.unrejected.value &&
viewModel.approvalStatus == true) {
AppToast.success(
context,
@@ -6,6 +6,8 @@ import 'package:tm_app/view_models/tender_detail_view_model.dart';
import 'package:tm_app/views/shared/base_button.dart';
import 'package:tm_app/views/shared/select_submission_bottom_sheet.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../data/services/model/tender_data/tender_data.dart';
import '../../shared/select_submission_dialog.dart';
import '../strings/tender_details_strings.dart';
@@ -47,10 +49,12 @@ class TenderDetailActions extends StatelessWidget {
backgroundColor: AppColors.primary30,
textColor: AppColors.mainBlue,
onPressed: () {
if (viewModel.status == 'submitted') {
if (viewModel.status ==
TenderApprovalStatus.submitted.value) {
viewModel.submitTenderApproval(
tenderId: detail.id!,
submissionMode: 'self-apply',
submissionMode:
TenderSubmissionMode.selfApply.value,
);
} else {
showModalBottomSheet(
@@ -95,7 +99,7 @@ class TenderDetailActions extends StatelessWidget {
onPressed: () {
viewModel.rejectTenderApproval(
tenderId: detail.id!,
submissionMode: 'self-apply',
submissionMode: TenderSubmissionMode.selfApply.value,
);
},
);
@@ -131,7 +135,7 @@ class TenderDetailActions extends StatelessWidget {
onPressed: () {
viewModel.rejectTenderApproval(
tenderId: detail.id!,
submissionMode: 'self-apply',
submissionMode: TenderSubmissionMode.selfApply.value,
);
},
width: 120.0.w(),
@@ -156,10 +160,11 @@ class TenderDetailActions extends StatelessWidget {
backgroundColor: AppColors.lightBlue,
textColor: AppColors.mainBlue,
onPressed: () {
if (viewModel.status == 'submitted') {
if (viewModel.status ==
TenderApprovalStatus.submitted.value) {
viewModel.submitTenderApproval(
tenderId: detail.id!,
submissionMode: 'self-apply',
submissionMode: TenderSubmissionMode.selfApply.value,
);
} else {
(MediaQuery.sizeOf(context).width > 600)
+2 -2
View File
@@ -4,7 +4,7 @@ import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_response/tender_approvals_stats_response.dart';
import 'package:tm_app/view_models/home_view_model.dart';
import 'package:tm_app/views/shared/tender_app_bar.dart';
@@ -90,7 +90,7 @@ class MobileHomePage extends StatelessWidget {
Widget _firstTenderCardsRow(
BuildContext context,
TenderApprovalsStateResponse tenderApprovalsStateResponse,
TenderApprovalsStatsResponse tenderApprovalsStateResponse,
) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
+2 -2
View File
@@ -3,7 +3,7 @@ import 'package:provider/provider.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
import 'package:tm_app/data/services/model/tender_approvals_stats_response/tender_approvals_stats_response.dart';
import 'package:tm_app/view_models/home_view_model.dart';
import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
@@ -110,7 +110,7 @@ class TabletHomePage extends StatelessWidget {
Widget _firstTenderCardsRow(
BuildContext context,
TenderApprovalsStateResponse tenderApprovalsStateResponse,
TenderApprovalsStatsResponse tenderApprovalsStateResponse,
) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -150,7 +150,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
children: [
const Spacer(),
Text(
'Page',
LikedTendersStrings.page,
style: TextStyle(
fontSize: 13.0.sp(),
fontWeight: FontWeight.w300,
@@ -165,7 +165,9 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Select Page'),
title: const Text(
LikedTendersStrings.selectPage,
),
content: SizedBox(
width: 200,
height: 300,
@@ -174,7 +176,9 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
itemBuilder: (context, index) {
final pageNumber = index + 1;
return ListTile(
title: Text('Page $pageNumber'),
title: Text(
'${LikedTendersStrings.page} $pageNumber',
),
onTap:
() => Navigator.pop(
context,
@@ -223,7 +227,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
SizedBox(width: 5.0.w()),
Text(
'Of',
LikedTendersStrings.of,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w400,
@@ -160,7 +160,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
children: [
const Spacer(),
Text(
'Page',
LikedTendersStrings.page,
style: TextStyle(
fontSize: 13.0.sp(),
fontWeight: FontWeight.w300,
@@ -175,7 +175,9 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Select Page'),
title: const Text(
LikedTendersStrings.selectPage,
),
content: SizedBox(
width: 200,
height: 300,
@@ -184,7 +186,9 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
itemBuilder: (context, index) {
final pageNumber = index + 1;
return ListTile(
title: Text('Page $pageNumber'),
title: Text(
'${LikedTendersStrings.page} $pageNumber',
),
onTap:
() => Navigator.pop(
context,
@@ -233,7 +237,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
SizedBox(width: 5.0.w()),
Text(
'Of',
LikedTendersStrings.of,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w400,
@@ -12,5 +12,8 @@ class LikedTendersStrings {
static const startDate = 'YYYY/MM/DD';
static const endDate = 'YYYY/MM/DD';
static const approvedTenders = 'Approved tenders';
static const noLikedTenders = 'You havent liked any tenders yet.';
static const noLikedTenders = 'You havent liked any tenders yet!';
static const page = 'Page';
static const selectPage = 'Select Page';
static const of = 'Of';
}
@@ -10,6 +10,7 @@ import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/view_models/liked_tenders_view_model.dart';
import 'package:tm_app/views/home/strings/home_strings.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../data/services/model/tender_approvals_data/tender_approvals_data.dart';
import '../../shared/select_submission_bottom_sheet.dart';
import '../../shared/select_submission_dialog.dart';
@@ -178,7 +179,7 @@ class LikedListItem extends StatelessWidget {
onTap: () {
viewModel.rejectTenderApproval(
tenderId: tender.id!,
submissionMode: 'self-apply',
submissionMode: TenderSubmissionMode.selfApply.value,
);
},
child: Container(
@@ -211,7 +212,7 @@ class LikedListItem extends StatelessWidget {
if (viewModel.isTenderSubmitted(tender.id!)) {
viewModel.submitTenderApproval(
tenderId: tender.id!,
submissionMode: 'self-apply',
submissionMode: TenderSubmissionMode.selfApply.value,
);
} else {
(kIsWeb && MediaQuery.sizeOf(context).width > 600)
@@ -1,11 +1,11 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart';
@@ -31,7 +31,7 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
void _viewModelListener() {
if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home'));
Router.neglect(context, () => HomeRouteData().go(context));
} else if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!);
}
+2 -2
View File
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart';
@@ -29,7 +29,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
void _viewModelListener() {
if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home'));
Router.neglect(context, () => HomeRouteData().go(context));
}
if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!);
+2 -2
View File
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart';
@@ -29,7 +29,7 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
void _viewModelListener() {
if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home'));
Router.neglect(context, () => HomeRouteData().go(context));
}
if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!);
-98
View File
@@ -1,98 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/constants/assets.dart';
import '../../core/utils/size_config.dart';
class TenderBottomNavigation extends StatefulWidget {
const TenderBottomNavigation({super.key});
@override
State<TenderBottomNavigation> createState() => _TenderBottomNavigationState();
}
class _TenderBottomNavigationState extends State<TenderBottomNavigation> {
int activeTab = 0;
@override
Widget build(BuildContext context) {
return Container(
height: 72.0.h(),
decoration: BoxDecoration(
color: Color(0xFFE3E3E3),
border: Border.fromBorderSide(BorderSide(color: Color(0xFFE3E3E3))),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_bottomNavigationItem(
text: 'Home',
isActive: activeTab == 0,
onTap: () {
setState(() {
activeTab = 0;
});
},
iconPath: 'assets/icons/home.svg',
activeIconPath: AssetsManager.homeActive,
),
_bottomNavigationItem(
text: 'Tenders',
isActive: activeTab == 1,
onTap: () {
setState(() {
activeTab = 1;
});
},
iconPath: 'assets/icons/task_square.svg',
activeIconPath: 'assets/icons/task-square_active.svg',
),
_bottomNavigationItem(
text: 'Profile',
isActive: activeTab == 2,
onTap: () {
setState(() {
activeTab = 2;
});
},
iconPath: 'assets/icons/profile-circle.svg',
activeIconPath: 'assets/icons/profile-circle_active.svg',
),
],
),
);
}
Widget _bottomNavigationItem({
required String text,
required bool isActive,
required VoidCallback onTap,
required String iconPath,
required String activeIconPath,
}) {
return InkWell(
onTap: onTap,
child: SizedBox(
width: 64.0.w(),
height: 72.0.h(),
child: Padding(
padding: EdgeInsets.only(top: 12.0.h(), bottom: 14.0.h()),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(isActive ? activeIconPath : iconPath),
Text(
text,
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: isActive ? Color(0xFF0164FF) : Color(0xFF777777),
),
),
],
),
),
),
);
}
}
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:tm_app/core/utils/size_config.dart';
import '../../core/constants/common_strings.dart';
import '../../core/constants/tender_submision_mode.dart';
import '../../core/theme/colors.dart';
class SelectSubmissionBottomSheet extends StatefulWidget {
@@ -16,7 +18,7 @@ class SelectSubmissionBottomSheet extends StatefulWidget {
class _SelectSubmissionBottomSheetState
extends State<SelectSubmissionBottomSheet> {
int selectedType = 0;
String type = 'self-apply';
String type = TenderSubmissionMode.selfApply.value;
@override
Widget build(BuildContext context) {
@@ -36,7 +38,7 @@ class _SelectSubmissionBottomSheetState
child: Column(
children: [
Text(
'Select Submission',
CommonStrings.selectSubmission,
style: TextStyle(
fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
@@ -45,21 +47,21 @@ class _SelectSubmissionBottomSheetState
),
SizedBox(height: 8.0.h()),
_submissionType(
title: 'self-apply',
isSelected: type == 'self-apply',
title: CommonStrings.selfApply,
isSelected: type == TenderSubmissionMode.selfApply.value,
onTap: () {
selectedType = 0;
type = 'self-apply';
type = TenderSubmissionMode.selfApply.value;
setState(() {});
},
),
SizedBox(height: 8.0.h()),
_submissionType(
title: 'Partnership',
isSelected: type == 'partnership',
title: CommonStrings.partnership,
isSelected: type == TenderSubmissionMode.partnership.value,
onTap: () {
selectedType = 1;
type = 'partnership';
type = TenderSubmissionMode.partnership.value;
setState(() {});
},
),
@@ -78,7 +80,7 @@ class _SelectSubmissionBottomSheetState
),
alignment: Alignment.center,
child: Text(
'Confirm',
CommonStrings.confirm,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
+11 -9
View File
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:tm_app/core/utils/size_config.dart';
import '../../core/constants/common_strings.dart';
import '../../core/constants/tender_submision_mode.dart';
import '../../core/theme/colors.dart';
class SelectSubmissionDialog extends StatefulWidget {
@@ -14,7 +16,7 @@ class SelectSubmissionDialog extends StatefulWidget {
class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
int selectedType = 0;
String type = 'self-apply';
String type = TenderSubmissionMode.selfApply.value;
@override
Widget build(BuildContext context) {
return Dialog(
@@ -33,7 +35,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
child: Column(
children: [
Text(
'Select Submission',
CommonStrings.selectSubmission,
style: TextStyle(
fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
@@ -42,21 +44,21 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
),
SizedBox(height: 8.0.h()),
_submissionType(
title: 'self-apply',
isSelected: type == 'self-apply',
title: CommonStrings.selfApply,
isSelected: type == TenderSubmissionMode.selfApply.value,
onTap: () {
selectedType = 0;
type = 'self-apply';
type = TenderSubmissionMode.selfApply.value;
setState(() {});
},
),
SizedBox(height: 8.0.h()),
_submissionType(
title: 'Partnership',
isSelected: type == 'partnership',
title: CommonStrings.partnership,
isSelected: type == TenderSubmissionMode.partnership.value,
onTap: () {
selectedType = 1;
type = 'partnership';
type = TenderSubmissionMode.partnership.value;
setState(() {});
},
),
@@ -77,7 +79,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
),
alignment: Alignment.center,
child: Text(
'Confirm',
CommonStrings.confirm,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
@@ -5,6 +5,9 @@ import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/view_models/tenders_view_model.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/constants/tender_feedback.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
import '../../shared/select_submission_bottom_sheet.dart';
@@ -54,7 +57,7 @@ class TenderActionButtonsRow extends StatelessWidget {
}
final approval = viewModel.getTenderApprovalForTender(tender.id!);
final isRejected = approval?.status == 'rejected';
final isRejected = approval?.status == TenderApprovalStatus.rejected.value;
return Tooltip(
message: TendersStrings.reject,
@@ -63,8 +66,8 @@ class TenderActionButtonsRow extends StatelessWidget {
onTap: () {
viewModel.toggleApprovals(
tenderId: tender.id!,
submissionMode: 'self-apply',
status: 'rejected',
submissionMode: TenderSubmissionMode.selfApply.value,
status: TenderApprovalStatus.rejected.value,
);
},
child: Column(
@@ -109,7 +112,7 @@ class TenderActionButtonsRow extends StatelessWidget {
}
final approval = viewModel.getTenderApprovalForTender(tender.id!);
final isApproved = approval?.status == 'submitted';
final isApproved = approval?.status == TenderApprovalStatus.submitted.value;
return Tooltip(
message: TendersStrings.submit,
@@ -119,8 +122,11 @@ class TenderActionButtonsRow extends StatelessWidget {
if (isApproved) {
viewModel.toggleApprovals(
tenderId: tender.id!,
submissionMode: approval?.submissionMode ?? 'self-apply',
status: 'submitted',
submissionMode:
(approval?.submissionMode?.isNotEmpty == true)
? approval!.submissionMode!
: TenderSubmissionMode.selfApply.value,
status: TenderApprovalStatus.submitted.value,
);
} else {
final isMobile = MediaQuery.sizeOf(context).width < 600;
@@ -134,7 +140,7 @@ class TenderActionButtonsRow extends StatelessWidget {
viewModel.toggleApprovals(
tenderId: tender.id!,
submissionMode: value,
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
);
},
);
@@ -149,7 +155,7 @@ class TenderActionButtonsRow extends StatelessWidget {
viewModel.toggleApprovals(
tenderId: tender.id!,
submissionMode: value,
status: 'submitted',
status: TenderApprovalStatus.submitted.value,
);
},
);
@@ -200,7 +206,7 @@ class TenderActionButtonsRow extends StatelessWidget {
}
final feedback = viewModel.getFeedbackForTender(tender.id!);
final isDisliked = feedback?.feedbackType == 'dislike';
final isDisliked = feedback?.feedbackType == TenderFeedback.disliked.value;
return Tooltip(
message: TendersStrings.dislike,
@@ -209,7 +215,7 @@ class TenderActionButtonsRow extends StatelessWidget {
onTap: () {
viewModel.toogleFeedback(
tenderId: tender.id!,
feedbackType: 'dislike',
feedbackType: TenderFeedback.disliked.value,
);
},
child: Column(
@@ -247,14 +253,17 @@ class TenderActionButtonsRow extends StatelessWidget {
}
final feedback = viewModel.getFeedbackForTender(tender.id!);
final isLiked = feedback?.feedbackType == 'like';
final isLiked = feedback?.feedbackType == TenderFeedback.liked.value;
return Tooltip(
message: TendersStrings.like,
child: InkWell(
splashColor: Colors.transparent,
onTap: () {
viewModel.toogleFeedback(tenderId: tender.id!, feedbackType: 'like');
viewModel.toogleFeedback(
tenderId: tender.id!,
feedbackType: TenderFeedback.liked.value,
);
},
child: Column(
children: [
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/constants/tender_feedback.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
@@ -73,7 +74,7 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked',
status: TenderFeedback.liked.value,
isDesctop: true,
);
} else if (viewModel.selectedStatus ==
@@ -81,7 +82,7 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
status: TenderFeedback.disliked.value,
isDesctop: true,
);
} else if (viewModel.data != null) {
@@ -8,6 +8,8 @@ import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
import '../../../core/constants/tender_feedback.dart';
class YourTendersMobilePage extends StatefulWidget {
const YourTendersMobilePage({super.key});
@@ -65,7 +67,7 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage> {
Expanded(
child: LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked tenders',
status: TenderFeedback.liked.value,
isDesctop: false,
),
)
@@ -75,7 +77,7 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage> {
Expanded(
child: LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
status: TenderFeedback.disliked.value,
isDesctop: false,
),
)
@@ -24,7 +24,7 @@ class _YourTendersScreenState extends State<YourTendersScreen> {
viewModel = context.read<YourTendersViewModel>();
WidgetsBinding.instance.addPostFrameCallback((_) {
final requestModel = GetTendersRequestModel();
viewModel.getTenders(requestModel: requestModel);
viewModel.getTenders(requestModel: requestModel, reset: true);
});
}
@@ -8,6 +8,7 @@ import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.da
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
import '../../../core/constants/tender_feedback.dart';
import '../../shared/tablet_navigation_widget.dart';
import '../../shared/tender_app_bar.dart';
import '../strings/your_tenders_strings.dart';
@@ -85,7 +86,7 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked',
status: TenderFeedback.liked.value,
isDesctop: false,
);
} else if (viewModel.selectedStatus ==
@@ -93,7 +94,7 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
status: TenderFeedback.disliked.value,
isDesctop: false,
);
} else if (viewModel.data != null) {
@@ -15,4 +15,7 @@ class YourTendersStrings {
static const approvedTenders = 'Approved tenders';
static const noTenders = 'No data available';
static const selectPublicationRangeDate = 'Select publication date range';
static const noLikedTenders = 'You havent liked any tenders yet !';
static const noDislikedTenders = 'You havent disliked any tenders yet !';
static const noTendersSubmitted = 'You havent submitted any tenders yet !';
}
@@ -4,8 +4,11 @@ import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
import '../../../core/constants/tender_feedback.dart';
class LikedDislikedTendersList extends StatefulWidget {
final LikedTendersResponse data;
final String status;
@@ -54,7 +57,9 @@ class _LikedDislikedTendersListState extends State<LikedDislikedTendersList> {
if (data.data?.feedback == null || data.data!.feedback!.isEmpty) {
return Center(
child: Text(
'No ${widget.status} found',
widget.status == TenderFeedback.liked.value
? YourTendersStrings.noLikedTenders
: YourTendersStrings.noDislikedTenders,
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey70),
),
);
@@ -5,6 +5,7 @@ import 'package:tm_app/core/utils/date_utils.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import '../../../core/constants/assets.dart';
import '../../../core/constants/tender_approval_status.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
@@ -29,7 +30,7 @@ class TenderCard extends StatelessWidget {
statusIcon = AssetsManager.tickCircle;
statusCardColor = AppColors.green20;
statusTextColor = AppColors.green30;
} else if (tender.status == 'submitted') {
} else if (tender.status == TenderApprovalStatus.submitted.value) {
backgroundColor = AppColors.grey0;
borderColor = AppColors.grey30;
statusIcon = null;