From 4b0dc4cedf3921c1de4a12a853eb79d876f435fa Mon Sep 17 00:00:00 2001 From: llsajjad Date: Tue, 19 Aug 2025 22:22:17 +0330 Subject: [PATCH] added approved api --- lib/core/config/dependencies.dart | 2 +- .../repositories/your_tenders_repository.dart | 9 +- .../tender_approvals_data.dart | 24 ++ .../tender_approvals_data.freezed.dart | 319 ++++++++++++++++++ .../tender_approvals_data.g.dart | 33 ++ .../tender_approvals_response.dart | 22 ++ .../tender_approvals_response.freezed.dart | 318 +++++++++++++++++ .../tender_approvals_response.g.dart | 31 ++ lib/data/services/your_tenders_service.dart | 37 +- lib/view_models/your_tenders_view_model.dart | 18 +- .../pages/your_tenders_desktop_page.dart | 7 +- .../pages/your_tenders_mobile_page.dart | 6 +- .../pages/your_tenders_tablet_page.dart | 8 +- .../widgets/approved_tenders.dart | 31 +- pubspec.lock | 40 ++- 15 files changed, 841 insertions(+), 64 deletions(-) create mode 100644 lib/data/services/model/tender_approvals_data/tender_approvals_data.dart create mode 100644 lib/data/services/model/tender_approvals_data/tender_approvals_data.freezed.dart create mode 100644 lib/data/services/model/tender_approvals_data/tender_approvals_data.g.dart create mode 100644 lib/data/services/model/tender_approvals_response/tender_approvals_response.dart create mode 100644 lib/data/services/model/tender_approvals_response/tender_approvals_response.freezed.dart create mode 100644 lib/data/services/model/tender_approvals_response/tender_approvals_response.g.dart diff --git a/lib/core/config/dependencies.dart b/lib/core/config/dependencies.dart index 78d84d3..53c57b9 100644 --- a/lib/core/config/dependencies.dart +++ b/lib/core/config/dependencies.dart @@ -41,7 +41,7 @@ List get apiClients { create: (context) => TenderDetailService(networkManager: context.read()), ), - Provider(create: (context) => YourTendersService()), + Provider(create: (context) => YourTendersService(networkManager: context.read())), Provider( create: (context) => TendersService(networkManager: context.read()), ), diff --git a/lib/data/repositories/your_tenders_repository.dart b/lib/data/repositories/your_tenders_repository.dart index 700aac1..007d5f7 100644 --- a/lib/data/repositories/your_tenders_repository.dart +++ b/lib/data/repositories/your_tenders_repository.dart @@ -1,15 +1,12 @@ import 'package:tm_app/core/utils/result.dart'; -import 'package:tm_app/data/services/model/your_tender_model_request/your_tenders_request_model.dart'; -import 'package:tm_app/data/services/model/your_tender_model_response/your_tender_model_response.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'; class YourTendersRepository { final YourTendersService yourTendersService; YourTendersRepository({required this.yourTendersService}); - Future> getYourTenders({ - required YourTendersRequestModel request, - }) { - return yourTendersService.getYourTenders(request: request); + Future> getApprovedTenders() { + return yourTendersService.getApprovedTenders(); } } diff --git a/lib/data/services/model/tender_approvals_data/tender_approvals_data.dart b/lib/data/services/model/tender_approvals_data/tender_approvals_data.dart new file mode 100644 index 0000000..a5141ba --- /dev/null +++ b/lib/data/services/model/tender_approvals_data/tender_approvals_data.dart @@ -0,0 +1,24 @@ +// ignore_for_file: invalid_annotation_target + +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../tender_data/tender_data.dart'; + +part 'tender_approvals_data.freezed.dart'; +part 'tender_approvals_data.g.dart'; + +@freezed +abstract class TenderApprovalsData with _$TenderApprovalsData { + const factory TenderApprovalsData({ + required String? id, + required String status, + @JsonKey(name: 'tender_id') required String? tenderId, + @JsonKey(name: 'company_id') required String? companyId, + @JsonKey(name: 'submission_mode') required String? submissionMode, + @JsonKey(name: 'created_at') required int? createdAt, + required TenderData? tender, + }) = _TenderApprovalsData; + + factory TenderApprovalsData.fromJson(Map json) => + _$TenderApprovalsDataFromJson(json); +} diff --git a/lib/data/services/model/tender_approvals_data/tender_approvals_data.freezed.dart b/lib/data/services/model/tender_approvals_data/tender_approvals_data.freezed.dart new file mode 100644 index 0000000..6cac457 --- /dev/null +++ b/lib/data/services/model/tender_approvals_data/tender_approvals_data.freezed.dart @@ -0,0 +1,319 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// 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_data.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$TenderApprovalsData { + + String? get id; String get status;@JsonKey(name: 'tender_id') String? get tenderId;@JsonKey(name: 'company_id') String? get companyId;@JsonKey(name: 'submission_mode') String? get submissionMode;@JsonKey(name: 'created_at') int? get createdAt; TenderData? get tender; +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$TenderApprovalsDataCopyWith get copyWith => _$TenderApprovalsDataCopyWithImpl(this as TenderApprovalsData, _$identity); + + /// Serializes this TenderApprovalsData to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsData&&(identical(other.id, id) || other.id == id)&&(identical(other.status, status) || other.status == status)&&(identical(other.tenderId, tenderId) || other.tenderId == tenderId)&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.submissionMode, submissionMode) || other.submissionMode == submissionMode)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.tender, tender) || other.tender == tender)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,status,tenderId,companyId,submissionMode,createdAt,tender); + +@override +String toString() { + return 'TenderApprovalsData(id: $id, status: $status, tenderId: $tenderId, companyId: $companyId, submissionMode: $submissionMode, createdAt: $createdAt, tender: $tender)'; +} + + +} + +/// @nodoc +abstract mixin class $TenderApprovalsDataCopyWith<$Res> { + factory $TenderApprovalsDataCopyWith(TenderApprovalsData value, $Res Function(TenderApprovalsData) _then) = _$TenderApprovalsDataCopyWithImpl; +@useResult +$Res call({ + String? id, String status,@JsonKey(name: 'tender_id') String? tenderId,@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'submission_mode') String? submissionMode,@JsonKey(name: 'created_at') int? createdAt, TenderData? tender +}); + + +$TenderDataCopyWith<$Res>? get tender; + +} +/// @nodoc +class _$TenderApprovalsDataCopyWithImpl<$Res> + implements $TenderApprovalsDataCopyWith<$Res> { + _$TenderApprovalsDataCopyWithImpl(this._self, this._then); + + final TenderApprovalsData _self; + final $Res Function(TenderApprovalsData) _then; + +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? status = null,Object? tenderId = freezed,Object? companyId = freezed,Object? submissionMode = freezed,Object? createdAt = freezed,Object? tender = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String?,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable +as String,tenderId: freezed == tenderId ? _self.tenderId : tenderId // ignore: cast_nullable_to_non_nullable +as String?,companyId: freezed == companyId ? _self.companyId : companyId // ignore: cast_nullable_to_non_nullable +as String?,submissionMode: freezed == submissionMode ? _self.submissionMode : submissionMode // ignore: cast_nullable_to_non_nullable +as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as int?,tender: freezed == tender ? _self.tender : tender // ignore: cast_nullable_to_non_nullable +as TenderData?, + )); +} +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$TenderDataCopyWith<$Res>? get tender { + if (_self.tender == null) { + return null; + } + + return $TenderDataCopyWith<$Res>(_self.tender!, (value) { + return _then(_self.copyWith(tender: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [TenderApprovalsData]. +extension TenderApprovalsDataPatterns on TenderApprovalsData { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _TenderApprovalsData value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _TenderApprovalsData() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _TenderApprovalsData value) $default,){ +final _that = this; +switch (_that) { +case _TenderApprovalsData(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _TenderApprovalsData value)? $default,){ +final _that = this; +switch (_that) { +case _TenderApprovalsData() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? id, String status, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'submission_mode') String? submissionMode, @JsonKey(name: 'created_at') int? createdAt, TenderData? tender)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _TenderApprovalsData() when $default != null: +return $default(_that.id,_that.status,_that.tenderId,_that.companyId,_that.submissionMode,_that.createdAt,_that.tender);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? id, String status, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'submission_mode') String? submissionMode, @JsonKey(name: 'created_at') int? createdAt, TenderData? tender) $default,) {final _that = this; +switch (_that) { +case _TenderApprovalsData(): +return $default(_that.id,_that.status,_that.tenderId,_that.companyId,_that.submissionMode,_that.createdAt,_that.tender);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? id, String status, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'submission_mode') String? submissionMode, @JsonKey(name: 'created_at') int? createdAt, TenderData? tender)? $default,) {final _that = this; +switch (_that) { +case _TenderApprovalsData() when $default != null: +return $default(_that.id,_that.status,_that.tenderId,_that.companyId,_that.submissionMode,_that.createdAt,_that.tender);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _TenderApprovalsData implements TenderApprovalsData { + const _TenderApprovalsData({required this.id, required this.status, @JsonKey(name: 'tender_id') required this.tenderId, @JsonKey(name: 'company_id') required this.companyId, @JsonKey(name: 'submission_mode') required this.submissionMode, @JsonKey(name: 'created_at') required this.createdAt, required this.tender}); + factory _TenderApprovalsData.fromJson(Map json) => _$TenderApprovalsDataFromJson(json); + +@override final String? id; +@override final String status; +@override@JsonKey(name: 'tender_id') final String? tenderId; +@override@JsonKey(name: 'company_id') final String? companyId; +@override@JsonKey(name: 'submission_mode') final String? submissionMode; +@override@JsonKey(name: 'created_at') final int? createdAt; +@override final TenderData? tender; + +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$TenderApprovalsDataCopyWith<_TenderApprovalsData> get copyWith => __$TenderApprovalsDataCopyWithImpl<_TenderApprovalsData>(this, _$identity); + +@override +Map toJson() { + return _$TenderApprovalsDataToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsData&&(identical(other.id, id) || other.id == id)&&(identical(other.status, status) || other.status == status)&&(identical(other.tenderId, tenderId) || other.tenderId == tenderId)&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.submissionMode, submissionMode) || other.submissionMode == submissionMode)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.tender, tender) || other.tender == tender)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,status,tenderId,companyId,submissionMode,createdAt,tender); + +@override +String toString() { + return 'TenderApprovalsData(id: $id, status: $status, tenderId: $tenderId, companyId: $companyId, submissionMode: $submissionMode, createdAt: $createdAt, tender: $tender)'; +} + + +} + +/// @nodoc +abstract mixin class _$TenderApprovalsDataCopyWith<$Res> implements $TenderApprovalsDataCopyWith<$Res> { + factory _$TenderApprovalsDataCopyWith(_TenderApprovalsData value, $Res Function(_TenderApprovalsData) _then) = __$TenderApprovalsDataCopyWithImpl; +@override @useResult +$Res call({ + String? id, String status,@JsonKey(name: 'tender_id') String? tenderId,@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'submission_mode') String? submissionMode,@JsonKey(name: 'created_at') int? createdAt, TenderData? tender +}); + + +@override $TenderDataCopyWith<$Res>? get tender; + +} +/// @nodoc +class __$TenderApprovalsDataCopyWithImpl<$Res> + implements _$TenderApprovalsDataCopyWith<$Res> { + __$TenderApprovalsDataCopyWithImpl(this._self, this._then); + + final _TenderApprovalsData _self; + final $Res Function(_TenderApprovalsData) _then; + +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? status = null,Object? tenderId = freezed,Object? companyId = freezed,Object? submissionMode = freezed,Object? createdAt = freezed,Object? tender = freezed,}) { + return _then(_TenderApprovalsData( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String?,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable +as String,tenderId: freezed == tenderId ? _self.tenderId : tenderId // ignore: cast_nullable_to_non_nullable +as String?,companyId: freezed == companyId ? _self.companyId : companyId // ignore: cast_nullable_to_non_nullable +as String?,submissionMode: freezed == submissionMode ? _self.submissionMode : submissionMode // ignore: cast_nullable_to_non_nullable +as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as int?,tender: freezed == tender ? _self.tender : tender // ignore: cast_nullable_to_non_nullable +as TenderData?, + )); +} + +/// Create a copy of TenderApprovalsData +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$TenderDataCopyWith<$Res>? get tender { + if (_self.tender == null) { + return null; + } + + return $TenderDataCopyWith<$Res>(_self.tender!, (value) { + return _then(_self.copyWith(tender: value)); + }); +} +} + +// dart format on diff --git a/lib/data/services/model/tender_approvals_data/tender_approvals_data.g.dart b/lib/data/services/model/tender_approvals_data/tender_approvals_data.g.dart new file mode 100644 index 0000000..6c0a135 --- /dev/null +++ b/lib/data/services/model/tender_approvals_data/tender_approvals_data.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tender_approvals_data.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_TenderApprovalsData _$TenderApprovalsDataFromJson(Map json) => + _TenderApprovalsData( + id: json['id'] as String?, + status: json['status'] as String, + tenderId: json['tender_id'] as String?, + companyId: json['company_id'] as String?, + submissionMode: json['submission_mode'] as String?, + createdAt: (json['created_at'] as num?)?.toInt(), + tender: + json['tender'] == null + ? null + : TenderData.fromJson(json['tender'] as Map), + ); + +Map _$TenderApprovalsDataToJson( + _TenderApprovalsData instance, +) => { + 'id': instance.id, + 'status': instance.status, + 'tender_id': instance.tenderId, + 'company_id': instance.companyId, + 'submission_mode': instance.submissionMode, + 'created_at': instance.createdAt, + 'tender': instance.tender, +}; diff --git a/lib/data/services/model/tender_approvals_response/tender_approvals_response.dart b/lib/data/services/model/tender_approvals_response/tender_approvals_response.dart new file mode 100644 index 0000000..b5355b6 --- /dev/null +++ b/lib/data/services/model/tender_approvals_response/tender_approvals_response.dart @@ -0,0 +1,22 @@ +// ignore_for_file: invalid_annotation_target + +import 'package:freezed_annotation/freezed_annotation.dart'; + +import '../error/error_model.dart'; +import '../tender_approvals_data/tender_approvals_data.dart'; + +part 'tender_approvals_response.freezed.dart'; +part 'tender_approvals_response.g.dart'; + +@freezed +abstract class TenderApprovalsResponse with _$TenderApprovalsResponse { + const factory TenderApprovalsResponse({ + required String? message, + required bool? success, + required ErrorModel? error, + required List? data, + }) = _TenderApprovalsResponse; + + factory TenderApprovalsResponse.fromJson(Map json) => + _$TenderApprovalsResponseFromJson(json); +} diff --git a/lib/data/services/model/tender_approvals_response/tender_approvals_response.freezed.dart b/lib/data/services/model/tender_approvals_response/tender_approvals_response.freezed.dart new file mode 100644 index 0000000..dba4615 --- /dev/null +++ b/lib/data/services/model/tender_approvals_response/tender_approvals_response.freezed.dart @@ -0,0 +1,318 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// 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_response.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$TenderApprovalsResponse { + + String? get message; bool? get success; ErrorModel? get error; List? get data; +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$TenderApprovalsResponseCopyWith get copyWith => _$TenderApprovalsResponseCopyWithImpl(this as TenderApprovalsResponse, _$identity); + + /// Serializes this TenderApprovalsResponse to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TenderApprovalsResponse&&(identical(other.message, message) || other.message == message)&&(identical(other.success, success) || other.success == success)&&(identical(other.error, error) || other.error == error)&&const DeepCollectionEquality().equals(other.data, data)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,message,success,error,const DeepCollectionEquality().hash(data)); + +@override +String toString() { + return 'TenderApprovalsResponse(message: $message, success: $success, error: $error, data: $data)'; +} + + +} + +/// @nodoc +abstract mixin class $TenderApprovalsResponseCopyWith<$Res> { + factory $TenderApprovalsResponseCopyWith(TenderApprovalsResponse value, $Res Function(TenderApprovalsResponse) _then) = _$TenderApprovalsResponseCopyWithImpl; +@useResult +$Res call({ + String? message, bool? success, ErrorModel? error, List? data +}); + + +$ErrorModelCopyWith<$Res>? get error; + +} +/// @nodoc +class _$TenderApprovalsResponseCopyWithImpl<$Res> + implements $TenderApprovalsResponseCopyWith<$Res> { + _$TenderApprovalsResponseCopyWithImpl(this._self, this._then); + + final TenderApprovalsResponse _self; + final $Res Function(TenderApprovalsResponse) _then; + +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? message = freezed,Object? success = freezed,Object? error = freezed,Object? data = freezed,}) { + return _then(_self.copyWith( +message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable +as String?,success: freezed == success ? _self.success : success // ignore: cast_nullable_to_non_nullable +as bool?,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 List?, + )); +} +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ErrorModelCopyWith<$Res>? get error { + if (_self.error == null) { + return null; + } + + return $ErrorModelCopyWith<$Res>(_self.error!, (value) { + return _then(_self.copyWith(error: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [TenderApprovalsResponse]. +extension TenderApprovalsResponsePatterns on TenderApprovalsResponse { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _TenderApprovalsResponse value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _TenderApprovalsResponse() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _TenderApprovalsResponse value) $default,){ +final _that = this; +switch (_that) { +case _TenderApprovalsResponse(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _TenderApprovalsResponse value)? $default,){ +final _that = this; +switch (_that) { +case _TenderApprovalsResponse() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? message, bool? success, ErrorModel? error, List? data)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _TenderApprovalsResponse() when $default != null: +return $default(_that.message,_that.success,_that.error,_that.data);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? message, bool? success, ErrorModel? error, List? data) $default,) {final _that = this; +switch (_that) { +case _TenderApprovalsResponse(): +return $default(_that.message,_that.success,_that.error,_that.data);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? message, bool? success, ErrorModel? error, List? data)? $default,) {final _that = this; +switch (_that) { +case _TenderApprovalsResponse() when $default != null: +return $default(_that.message,_that.success,_that.error,_that.data);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _TenderApprovalsResponse implements TenderApprovalsResponse { + const _TenderApprovalsResponse({required this.message, required this.success, required this.error, required final List? data}): _data = data; + factory _TenderApprovalsResponse.fromJson(Map json) => _$TenderApprovalsResponseFromJson(json); + +@override final String? message; +@override final bool? success; +@override final ErrorModel? error; + final List? _data; +@override List? get data { + final value = _data; + if (value == null) return null; + if (_data is EqualUnmodifiableListView) return _data; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$TenderApprovalsResponseCopyWith<_TenderApprovalsResponse> get copyWith => __$TenderApprovalsResponseCopyWithImpl<_TenderApprovalsResponse>(this, _$identity); + +@override +Map toJson() { + return _$TenderApprovalsResponseToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _TenderApprovalsResponse&&(identical(other.message, message) || other.message == message)&&(identical(other.success, success) || other.success == success)&&(identical(other.error, error) || other.error == error)&&const DeepCollectionEquality().equals(other._data, _data)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,message,success,error,const DeepCollectionEquality().hash(_data)); + +@override +String toString() { + return 'TenderApprovalsResponse(message: $message, success: $success, error: $error, data: $data)'; +} + + +} + +/// @nodoc +abstract mixin class _$TenderApprovalsResponseCopyWith<$Res> implements $TenderApprovalsResponseCopyWith<$Res> { + factory _$TenderApprovalsResponseCopyWith(_TenderApprovalsResponse value, $Res Function(_TenderApprovalsResponse) _then) = __$TenderApprovalsResponseCopyWithImpl; +@override @useResult +$Res call({ + String? message, bool? success, ErrorModel? error, List? data +}); + + +@override $ErrorModelCopyWith<$Res>? get error; + +} +/// @nodoc +class __$TenderApprovalsResponseCopyWithImpl<$Res> + implements _$TenderApprovalsResponseCopyWith<$Res> { + __$TenderApprovalsResponseCopyWithImpl(this._self, this._then); + + final _TenderApprovalsResponse _self; + final $Res Function(_TenderApprovalsResponse) _then; + +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? message = freezed,Object? success = freezed,Object? error = freezed,Object? data = freezed,}) { + return _then(_TenderApprovalsResponse( +message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable +as String?,success: freezed == success ? _self.success : success // ignore: cast_nullable_to_non_nullable +as bool?,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 List?, + )); +} + +/// Create a copy of TenderApprovalsResponse +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ErrorModelCopyWith<$Res>? get error { + if (_self.error == null) { + return null; + } + + return $ErrorModelCopyWith<$Res>(_self.error!, (value) { + return _then(_self.copyWith(error: value)); + }); +} +} + +// dart format on diff --git a/lib/data/services/model/tender_approvals_response/tender_approvals_response.g.dart b/lib/data/services/model/tender_approvals_response/tender_approvals_response.g.dart new file mode 100644 index 0000000..26d32fa --- /dev/null +++ b/lib/data/services/model/tender_approvals_response/tender_approvals_response.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tender_approvals_response.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_TenderApprovalsResponse _$TenderApprovalsResponseFromJson( + Map json, +) => _TenderApprovalsResponse( + message: json['message'] as String?, + success: json['success'] as bool?, + error: + json['error'] == null + ? null + : ErrorModel.fromJson(json['error'] as Map), + data: + (json['data'] as List?) + ?.map((e) => TenderApprovalsData.fromJson(e as Map)) + .toList(), +); + +Map _$TenderApprovalsResponseToJson( + _TenderApprovalsResponse instance, +) => { + 'message': instance.message, + 'success': instance.success, + 'error': instance.error, + 'data': instance.data, +}; diff --git a/lib/data/services/your_tenders_service.dart b/lib/data/services/your_tenders_service.dart index a4e4ac7..07e1d2b 100644 --- a/lib/data/services/your_tenders_service.dart +++ b/lib/data/services/your_tenders_service.dart @@ -1,16 +1,31 @@ -import 'dart:convert'; +import 'package:dio/dio.dart'; +import 'package:tm_app/core/utils/logger.dart'; import 'package:tm_app/core/utils/result.dart'; -import 'package:tm_app/data/services/mock_data/mock_your_tenders_data.dart'; -import 'package:tm_app/data/services/model/your_tender_model_request/your_tenders_request_model.dart'; -import 'package:tm_app/data/services/model/your_tender_model_response/your_tender_model_response.dart'; +import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart'; + +import '../../../core/network/network_manager.dart'; class YourTendersService { - Future> getYourTenders({ - required YourTendersRequestModel request, - }) async { - await Future.delayed(const Duration(seconds: 1)); - return Result.ok( - YourTendersResponseModel.fromJson(jsonDecode(mockYourTendersData)), - ); + YourTendersService({required NetworkManager networkManager}) + : _networkManager = networkManager; + + final NetworkManager _networkManager; + + Future> getApprovedTenders() async { + try { + final result = await _networkManager.makeRequest( + '/api/v1/tender-approvals?status=approved', + (json) => TenderApprovalsResponse.fromJson(json), + method: 'GET', + ); + + return result; + } on DioException catch (e) { + appLogger.error('get approved tenders failed: $e'); + return Result.error(e); + } on Exception catch (e, stackTrace) { + appLogger.error('get approved tenders failed: $e', stackTrace: stackTrace); + return Result.error(Exception(e)); + } } } diff --git a/lib/view_models/your_tenders_view_model.dart b/lib/view_models/your_tenders_view_model.dart index 2eaec79..f503129 100644 --- a/lib/view_models/your_tenders_view_model.dart +++ b/lib/view_models/your_tenders_view_model.dart @@ -1,32 +1,30 @@ import 'package:flutter/material.dart'; import 'package:tm_app/core/utils/result.dart'; import 'package:tm_app/data/repositories/your_tenders_repository.dart'; -import 'package:tm_app/data/services/model/your_tender_model_request/your_tenders_request_model.dart'; -import 'package:tm_app/data/services/model/your_tender_model_response/your_tender_model_response.dart'; +import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart'; class YourTendersViewModel with ChangeNotifier { final YourTendersRepository yourTendersRepository; YourTendersViewModel({required this.yourTendersRepository}) { - getTenders(); + getApprovedTenders(); } bool isLoading = false; String? errorMessage; - YourTendersResponseModel? data; + TenderApprovalsResponse? data; - Future getTenders() async { + Future getApprovedTenders() async { isLoading = true; notifyListeners(); - final result = await yourTendersRepository.getYourTenders( - request: const YourTendersRequestModel(id: '1'), - ); + final result = await yourTendersRepository.getApprovedTenders(); switch (result) { - case Ok(): + case Ok(): data = result.value; + errorMessage = null; break; - case Error(): + case Error(): errorMessage = result.error.toString(); break; } diff --git a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart index 81246b3..a0f8b68 100644 --- a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart @@ -25,7 +25,7 @@ class _YourTendersDesktopPageState extends State controller = TabController(length: 2, vsync: this); WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().getTenders(); + context.read().getApprovedTenders(); }); } @@ -72,12 +72,11 @@ class _YourTendersDesktopPageState extends State controller: controller, children: [ ApprovedTenders( - approvedTenders: - viewModel.data?.approvedTenders ?? [], + approvedTenders: viewModel.data!, ), TendersSubmitted( tendersSubmitted: - viewModel.data?.tendersSubmitted ?? [], + [], ), ], ); diff --git a/lib/views/your_tenders/pages/your_tenders_mobile_page.dart b/lib/views/your_tenders/pages/your_tenders_mobile_page.dart index 713a3a3..ac3630a 100644 --- a/lib/views/your_tenders/pages/your_tenders_mobile_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_mobile_page.dart @@ -25,7 +25,7 @@ class _YourTendersMobilePageState extends State controller = TabController(length: 2, vsync: this); WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().getTenders(); + context.read().getApprovedTenders(); }); } @@ -65,10 +65,10 @@ class _YourTendersMobilePageState extends State controller: controller, children: [ ApprovedTenders( - approvedTenders: viewModel.data?.approvedTenders ?? [], + approvedTenders: viewModel.data!, ), TendersSubmitted( - tendersSubmitted: viewModel.data?.tendersSubmitted ?? [], + tendersSubmitted: [], ), ], ); diff --git a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart index 441cfd0..6134175 100644 --- a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart @@ -25,7 +25,7 @@ class _YourTendersTabletPageState extends State controller = TabController(length: 2, vsync: this); WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().getTenders(); + context.read().getApprovedTenders(); }); } @@ -72,12 +72,10 @@ class _YourTendersTabletPageState extends State controller: controller, children: [ ApprovedTenders( - approvedTenders: - viewModel.data?.approvedTenders ?? [], + approvedTenders: viewModel.data!, ), TendersSubmitted( - tendersSubmitted: - viewModel.data?.tendersSubmitted ?? [], + tendersSubmitted: [], ), ], ); diff --git a/lib/views/your_tenders/widgets/approved_tenders.dart b/lib/views/your_tenders/widgets/approved_tenders.dart index 30ff7de..29defa3 100644 --- a/lib/views/your_tenders/widgets/approved_tenders.dart +++ b/lib/views/your_tenders/widgets/approved_tenders.dart @@ -1,58 +1,57 @@ import 'package:flutter/material.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; +import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart'; import 'package:tm_app/views/your_tenders/widgets/tender_card.dart'; -import '../../../data/services/model/your_tender_model/your_tender_model.dart'; - class ApprovedTenders extends StatelessWidget { const ApprovedTenders({required this.approvedTenders, super.key}); - final List approvedTenders; + final TenderApprovalsResponse approvedTenders; @override Widget build(BuildContext context) { return ListView.builder( padding: const EdgeInsets.only(top: 20), - itemCount: approvedTenders.length, + itemCount: approvedTenders.data!.length, itemBuilder: (context, index) { - final tender = approvedTenders[index]; + final tender = approvedTenders.data![index]; return TenderCard( - date: tender.date, - title: tender.title, - description: tender.description, - location: tender.location, - countryFlag: tender.countryFlag, + date: tender.createdAt!.toString(), + title: tender.tender!.title!, + description: tender.tender!.description!, + location: tender.tender!.countryCode!, + countryFlag: AssetsManager.seFlag, status: tender.status, - projectStatus: tender.projectStatus, + projectStatus: tender.tender!.status!, backgroundColor: tender.status == 'Won' ? AppColors.green0 - : tender.status == 'Completed' + : tender.status == 'approved' ? AppColors.grey0 : AppColors.red0.withValues(alpha: 0.2), borderColor: tender.status == 'Won' ? AppColors.green10 - : tender.status == 'Completed' + : tender.status == 'approved' ? AppColors.grey30 : AppColors.red0, statusIcon: tender.status == 'Won' ? AssetsManager.tickCircle - : tender.status == 'Completed' + : tender.status == 'approved' ? null : AssetsManager.closeCircle, statusCardColor: tender.status == 'Won' ? AppColors.green20 - : tender.status == 'Completed' + : tender.status == 'approved' ? AppColors.green20 : AppColors.red0, statusTextColor: tender.status == 'Won' ? AppColors.green30 - : tender.status == 'Completed' + : tender.status == 'approved' ? AppColors.green30 : AppColors.red10, ); diff --git a/pubspec.lock b/pubspec.lock index 4c6e4e0..a2774c6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.12.0" boolean_selector: dependency: transitive description: @@ -169,6 +169,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + country_flags: + dependency: "direct main" + description: + name: country_flags + sha256: "78a7bf8aabd7ae1a90087f0c517471ac9ebfe07addc652692f58da0f0f833196" + url: "https://pub.dev" + source: hosted + version: "3.3.0" crypto: dependency: transitive description: @@ -221,10 +229,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -416,6 +424,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + jovial_misc: + dependency: transitive + description: + name: jovial_misc + sha256: "4301011027d87b8b919cb862db84071a34448eadbb32cc8d40fe505424dfe69a" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + jovial_svg: + dependency: transitive + description: + name: jovial_svg + sha256: "6791b1435547bdc0793081a166d41a8a313ebc61e4e5136fb7a3218781fb9e50" + url: "https://pub.dev" + source: hosted + version: "1.1.27" js: dependency: transitive description: @@ -444,10 +468,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: @@ -849,10 +873,10 @@ packages: dependency: transitive description: name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "14.3.1" watcher: dependency: transitive description: