Merge pull request 'approved' (#53) from approved into main
Reviewed-on: https://repo.ravanertebat.com/TM/tm_app/pulls/53
This commit is contained in:
@@ -41,7 +41,7 @@ List<SingleChildWidget> get apiClients {
|
|||||||
create: (context) => TenderDetailService(networkManager: context.read()),
|
create: (context) => TenderDetailService(networkManager: context.read()),
|
||||||
),
|
),
|
||||||
|
|
||||||
Provider(create: (context) => YourTendersService()),
|
Provider(create: (context) => YourTendersService(networkManager: context.read())),
|
||||||
Provider(
|
Provider(
|
||||||
create: (context) => TendersService(networkManager: context.read()),
|
create: (context) => TendersService(networkManager: context.read()),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class AppStrings {
|
|||||||
static const String recommendation = 'Recommendation';
|
static const String recommendation = 'Recommendation';
|
||||||
static const String welcome = 'Welcome';
|
static const String welcome = 'Welcome';
|
||||||
static const String tenderDeadline = 'Deadline';
|
static const String tenderDeadline = 'Deadline';
|
||||||
|
static const String recommendedTenders = 'Recommended Tenders';
|
||||||
|
|
||||||
//Tenders
|
//Tenders
|
||||||
static const String tendersTitle = 'Tenders';
|
static const String tendersTitle = 'Tenders';
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:tm_app/data/services/home_service.dart';
|
|||||||
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
||||||
import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart';
|
import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart';
|
||||||
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_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_response/tender_approvals_response.dart';
|
||||||
|
|
||||||
class HomeRepository {
|
class HomeRepository {
|
||||||
HomeRepository({required HomeService homeService})
|
HomeRepository({required HomeService homeService})
|
||||||
@@ -21,4 +22,7 @@ class HomeRepository {
|
|||||||
}) async {
|
}) async {
|
||||||
return _homeService.getRecommendedTenders(limit: limit, offset: offset);
|
return _homeService.getRecommendedTenders(limit: limit, offset: offset);
|
||||||
}
|
}
|
||||||
|
Future<Result<TenderApprovalsResponse>> getYourTenders() {
|
||||||
|
return _homeService.getYourTenders();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
import 'package:tm_app/core/utils/result.dart';
|
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/tender_approvals_response/tender_approvals_response.dart';
|
||||||
import 'package:tm_app/data/services/model/your_tender_model_response/your_tender_model_response.dart';
|
|
||||||
import 'package:tm_app/data/services/your_tenders_service.dart';
|
import 'package:tm_app/data/services/your_tenders_service.dart';
|
||||||
|
|
||||||
class YourTendersRepository {
|
class YourTendersRepository {
|
||||||
final YourTendersService yourTendersService;
|
final YourTendersService yourTendersService;
|
||||||
YourTendersRepository({required this.yourTendersService});
|
YourTendersRepository({required this.yourTendersService});
|
||||||
|
|
||||||
Future<Result<YourTendersResponseModel>> getYourTenders({
|
Future<Result<TenderApprovalsResponse>> getApprovedTenders() {
|
||||||
required YourTendersRequestModel request,
|
return yourTendersService.getApprovedTenders();
|
||||||
}) {
|
|
||||||
return yourTendersService.getYourTenders(request: request);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'package:tm_app/data/services/mock_data/home_mock_data.dart';
|
|||||||
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
||||||
import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart';
|
import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart';
|
||||||
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_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_response/tender_approvals_response.dart';
|
||||||
|
|
||||||
import '../../core/network/network_manager.dart';
|
import '../../core/network/network_manager.dart';
|
||||||
|
|
||||||
@@ -50,4 +51,21 @@ class HomeService {
|
|||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Future<Result<TenderApprovalsResponse>> getYourTenders() async {
|
||||||
|
try {
|
||||||
|
final result = await _networkManager.makeRequest(
|
||||||
|
'/api/v1/tender-approvals',
|
||||||
|
(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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<String, Object?> json) =>
|
||||||
|
_$TenderApprovalsDataFromJson(json);
|
||||||
|
}
|
||||||
@@ -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>(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<TenderApprovalsData> get copyWith => _$TenderApprovalsDataCopyWithImpl<TenderApprovalsData>(this as TenderApprovalsData, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this TenderApprovalsData to a JSON map.
|
||||||
|
Map<String, dynamic> 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 extends Object?>(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 extends Object?>(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 extends Object?>(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 extends Object?>(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 extends Object?>(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 extends Object?>(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<String, dynamic> 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<String, dynamic> 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
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'tender_approvals_data.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
_TenderApprovalsData _$TenderApprovalsDataFromJson(Map<String, dynamic> 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<String, dynamic>),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$TenderApprovalsDataToJson(
|
||||||
|
_TenderApprovalsData instance,
|
||||||
|
) => <String, dynamic>{
|
||||||
|
'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,
|
||||||
|
};
|
||||||
@@ -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<TenderApprovalsData>? data,
|
||||||
|
}) = _TenderApprovalsResponse;
|
||||||
|
|
||||||
|
factory TenderApprovalsResponse.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$TenderApprovalsResponseFromJson(json);
|
||||||
|
}
|
||||||
+318
@@ -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>(T value) => value;
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$TenderApprovalsResponse {
|
||||||
|
|
||||||
|
String? get message; bool? get success; ErrorModel? get error; List<TenderApprovalsData>? 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<TenderApprovalsResponse> get copyWith => _$TenderApprovalsResponseCopyWithImpl<TenderApprovalsResponse>(this as TenderApprovalsResponse, _$identity);
|
||||||
|
|
||||||
|
/// Serializes this TenderApprovalsResponse to a JSON map.
|
||||||
|
Map<String, dynamic> 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<TenderApprovalsData>? 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<TenderApprovalsData>?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
/// 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 extends Object?>(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 extends Object?>(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 extends Object?>(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 extends Object?>(TResult Function( String? message, bool? success, ErrorModel? error, List<TenderApprovalsData>? 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 extends Object?>(TResult Function( String? message, bool? success, ErrorModel? error, List<TenderApprovalsData>? 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 extends Object?>(TResult? Function( String? message, bool? success, ErrorModel? error, List<TenderApprovalsData>? 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<TenderApprovalsData>? data}): _data = data;
|
||||||
|
factory _TenderApprovalsResponse.fromJson(Map<String, dynamic> json) => _$TenderApprovalsResponseFromJson(json);
|
||||||
|
|
||||||
|
@override final String? message;
|
||||||
|
@override final bool? success;
|
||||||
|
@override final ErrorModel? error;
|
||||||
|
final List<TenderApprovalsData>? _data;
|
||||||
|
@override List<TenderApprovalsData>? 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<String, dynamic> 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<TenderApprovalsData>? 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<TenderApprovalsData>?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'tender_approvals_response.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
_TenderApprovalsResponse _$TenderApprovalsResponseFromJson(
|
||||||
|
Map<String, dynamic> json,
|
||||||
|
) => _TenderApprovalsResponse(
|
||||||
|
message: json['message'] as String?,
|
||||||
|
success: json['success'] as bool?,
|
||||||
|
error:
|
||||||
|
json['error'] == null
|
||||||
|
? null
|
||||||
|
: ErrorModel.fromJson(json['error'] as Map<String, dynamic>),
|
||||||
|
data:
|
||||||
|
(json['data'] as List<dynamic>?)
|
||||||
|
?.map((e) => TenderApprovalsData.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$TenderApprovalsResponseToJson(
|
||||||
|
_TenderApprovalsResponse instance,
|
||||||
|
) => <String, dynamic>{
|
||||||
|
'message': instance.message,
|
||||||
|
'success': instance.success,
|
||||||
|
'error': instance.error,
|
||||||
|
'data': instance.data,
|
||||||
|
};
|
||||||
@@ -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/core/utils/result.dart';
|
||||||
import 'package:tm_app/data/services/mock_data/mock_your_tenders_data.dart';
|
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.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 '../../../core/network/network_manager.dart';
|
||||||
|
|
||||||
class YourTendersService {
|
class YourTendersService {
|
||||||
Future<Result<YourTendersResponseModel>> getYourTenders({
|
YourTendersService({required NetworkManager networkManager})
|
||||||
required YourTendersRequestModel request,
|
: _networkManager = networkManager;
|
||||||
}) async {
|
|
||||||
await Future.delayed(const Duration(seconds: 1));
|
final NetworkManager _networkManager;
|
||||||
return Result.ok(
|
|
||||||
YourTendersResponseModel.fromJson(jsonDecode(mockYourTendersData)),
|
Future<Result<TenderApprovalsResponse>> 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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:tm_app/core/utils/result.dart';
|
import 'package:tm_app/core/utils/result.dart';
|
||||||
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
import 'package:tm_app/data/services/model/home/home_request/home_request_model.dart';
|
||||||
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_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_response/tender_approvals_response.dart';
|
||||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||||
|
|
||||||
import '../data/repositories/home_repository.dart';
|
import '../data/repositories/home_repository.dart';
|
||||||
@@ -11,14 +12,15 @@ class HomeViewModel with ChangeNotifier {
|
|||||||
final HomeRepository _homeRepository;
|
final HomeRepository _homeRepository;
|
||||||
|
|
||||||
HomeViewModel({required HomeRepository homeRepository})
|
HomeViewModel({required HomeRepository homeRepository})
|
||||||
: _homeRepository = homeRepository {
|
: _homeRepository = homeRepository {
|
||||||
getHome(homeRequestModel: HomeRequestModel(id: '1'));
|
getHome(homeRequestModel: HomeRequestModel(id: '1'));
|
||||||
getHomeRecommandTenders(reset: true);
|
getYourTenders();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
String? _errorMessage;
|
String? _errorMessage;
|
||||||
HomeResponseModel? _homeResponse;
|
HomeResponseModel? _homeResponse;
|
||||||
|
TenderApprovalsResponse? data;
|
||||||
|
|
||||||
bool get isLoading => _isLoading;
|
bool get isLoading => _isLoading;
|
||||||
String? get errorMessage => _errorMessage;
|
String? get errorMessage => _errorMessage;
|
||||||
@@ -97,4 +99,36 @@ class HomeViewModel with ChangeNotifier {
|
|||||||
_isLoadingMore = false;
|
_isLoadingMore = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> getYourTenders() async {
|
||||||
|
_isLoading = true;
|
||||||
|
notifyListeners();
|
||||||
|
|
||||||
|
final result = await _homeRepository.getYourTenders();
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case Ok<TenderApprovalsResponse>():
|
||||||
|
data = result.value;
|
||||||
|
_errorMessage = null;
|
||||||
|
|
||||||
|
if (data?.data?.isEmpty ?? true) {
|
||||||
|
await getHomeRecommandTenders(reset: true);
|
||||||
|
} else {
|
||||||
|
_tenders.clear();
|
||||||
|
_tenders.addAll(
|
||||||
|
data!.data!
|
||||||
|
.map((e) => e.tender)
|
||||||
|
.whereType<TenderData>(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
case Error<TenderApprovalsResponse>():
|
||||||
|
_errorMessage = result.error.toString();
|
||||||
|
await getHomeRecommandTenders(reset: true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isLoading = false;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,30 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:tm_app/core/utils/result.dart';
|
import 'package:tm_app/core/utils/result.dart';
|
||||||
import 'package:tm_app/data/repositories/your_tenders_repository.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/tender_approvals_response/tender_approvals_response.dart';
|
||||||
import 'package:tm_app/data/services/model/your_tender_model_response/your_tender_model_response.dart';
|
|
||||||
|
|
||||||
class YourTendersViewModel with ChangeNotifier {
|
class YourTendersViewModel with ChangeNotifier {
|
||||||
final YourTendersRepository yourTendersRepository;
|
final YourTendersRepository yourTendersRepository;
|
||||||
YourTendersViewModel({required this.yourTendersRepository}) {
|
YourTendersViewModel({required this.yourTendersRepository}) {
|
||||||
getTenders();
|
getApprovedTenders();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
String? errorMessage;
|
String? errorMessage;
|
||||||
YourTendersResponseModel? data;
|
TenderApprovalsResponse? data;
|
||||||
|
|
||||||
Future<void> getTenders() async {
|
Future<void> getApprovedTenders() async {
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
final result = await yourTendersRepository.getYourTenders(
|
final result = await yourTendersRepository.getApprovedTenders();
|
||||||
request: const YourTendersRequestModel(id: '1'),
|
|
||||||
);
|
|
||||||
|
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case Ok<YourTendersResponseModel>():
|
case Ok<TenderApprovalsResponse>():
|
||||||
data = result.value;
|
data = result.value;
|
||||||
|
errorMessage = null;
|
||||||
break;
|
break;
|
||||||
case Error<YourTendersResponseModel>():
|
case Error<TenderApprovalsResponse>():
|
||||||
errorMessage = result.error.toString();
|
errorMessage = result.error.toString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class MobileHomePage extends StatelessWidget {
|
|||||||
if (homeViewModel.errorMessage != null) {
|
if (homeViewModel.errorMessage != null) {
|
||||||
return Center(child: Text(homeViewModel.errorMessage!));
|
return Center(child: Text(homeViewModel.errorMessage!));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (homeViewModel.homeResponse != null) {
|
if (homeViewModel.homeResponse != null) {
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -44,7 +45,7 @@ class MobileHomePage extends StatelessWidget {
|
|||||||
SizedBox(height: 8.0.h()),
|
SizedBox(height: 8.0.h()),
|
||||||
_secondTenderCardsRow(homeViewModel.homeResponse!),
|
_secondTenderCardsRow(homeViewModel.homeResponse!),
|
||||||
SizedBox(height: 40.0.h()),
|
SizedBox(height: 40.0.h()),
|
||||||
_yourTenderText(),
|
_yourTenderText(homeViewModel),
|
||||||
_bottomListView(homeViewModel),
|
_bottomListView(homeViewModel),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -149,11 +150,12 @@ class MobileHomePage extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _yourTenderText() {
|
Widget _yourTenderText(HomeViewModel homeViewModel) {
|
||||||
|
final isYourTenders = homeViewModel.data?.data?.isNotEmpty ?? false;
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
|
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
|
||||||
child: Text(
|
child: Text(
|
||||||
AppStrings.recommendation,
|
isYourTenders ? AppStrings.yourTenders : AppStrings.recommendedTenders,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 18.0.sp(),
|
fontSize: 18.0.sp(),
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
|||||||
controller = TabController(length: 2, vsync: this);
|
controller = TabController(length: 2, vsync: this);
|
||||||
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
context.read<YourTendersViewModel>().getTenders();
|
context.read<YourTendersViewModel>().getApprovedTenders();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,12 +72,11 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
|||||||
controller: controller,
|
controller: controller,
|
||||||
children: [
|
children: [
|
||||||
ApprovedTenders(
|
ApprovedTenders(
|
||||||
approvedTenders:
|
approvedTenders: viewModel.data!,
|
||||||
viewModel.data?.approvedTenders ?? [],
|
|
||||||
),
|
),
|
||||||
TendersSubmitted(
|
TendersSubmitted(
|
||||||
tendersSubmitted:
|
tendersSubmitted:
|
||||||
viewModel.data?.tendersSubmitted ?? [],
|
[],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage>
|
|||||||
controller = TabController(length: 2, vsync: this);
|
controller = TabController(length: 2, vsync: this);
|
||||||
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
context.read<YourTendersViewModel>().getTenders();
|
context.read<YourTendersViewModel>().getApprovedTenders();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,10 +65,10 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage>
|
|||||||
controller: controller,
|
controller: controller,
|
||||||
children: [
|
children: [
|
||||||
ApprovedTenders(
|
ApprovedTenders(
|
||||||
approvedTenders: viewModel.data?.approvedTenders ?? [],
|
approvedTenders: viewModel.data!,
|
||||||
),
|
),
|
||||||
TendersSubmitted(
|
TendersSubmitted(
|
||||||
tendersSubmitted: viewModel.data?.tendersSubmitted ?? [],
|
tendersSubmitted: [],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
|||||||
controller = TabController(length: 2, vsync: this);
|
controller = TabController(length: 2, vsync: this);
|
||||||
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
context.read<YourTendersViewModel>().getTenders();
|
context.read<YourTendersViewModel>().getApprovedTenders();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,12 +72,10 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
|||||||
controller: controller,
|
controller: controller,
|
||||||
children: [
|
children: [
|
||||||
ApprovedTenders(
|
ApprovedTenders(
|
||||||
approvedTenders:
|
approvedTenders: viewModel.data!,
|
||||||
viewModel.data?.approvedTenders ?? [],
|
|
||||||
),
|
),
|
||||||
TendersSubmitted(
|
TendersSubmitted(
|
||||||
tendersSubmitted:
|
tendersSubmitted: [],
|
||||||
viewModel.data?.tendersSubmitted ?? [],
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,58 +1,57 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:tm_app/core/constants/assets.dart';
|
import 'package:tm_app/core/constants/assets.dart';
|
||||||
import 'package:tm_app/core/theme/colors.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 '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 {
|
class ApprovedTenders extends StatelessWidget {
|
||||||
const ApprovedTenders({required this.approvedTenders, super.key});
|
const ApprovedTenders({required this.approvedTenders, super.key});
|
||||||
|
|
||||||
final List<YourTenderModel> approvedTenders;
|
final TenderApprovalsResponse approvedTenders;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
padding: const EdgeInsets.only(top: 20),
|
padding: const EdgeInsets.only(top: 20),
|
||||||
itemCount: approvedTenders.length,
|
itemCount: approvedTenders.data!.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final tender = approvedTenders[index];
|
final tender = approvedTenders.data![index];
|
||||||
return TenderCard(
|
return TenderCard(
|
||||||
date: tender.date,
|
date: tender.createdAt!.toString(),
|
||||||
title: tender.title,
|
title: tender.tender!.title!,
|
||||||
description: tender.description,
|
description: tender.tender!.description!,
|
||||||
location: tender.location,
|
location: tender.tender!.countryCode!,
|
||||||
countryFlag: tender.countryFlag,
|
countryFlag: AssetsManager.seFlag,
|
||||||
status: tender.status,
|
status: tender.status,
|
||||||
projectStatus: tender.projectStatus,
|
projectStatus: tender.tender!.status!,
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
tender.status == 'Won'
|
tender.status == 'Won'
|
||||||
? AppColors.green0
|
? AppColors.green0
|
||||||
: tender.status == 'Completed'
|
: tender.status == 'approved'
|
||||||
? AppColors.grey0
|
? AppColors.grey0
|
||||||
: AppColors.red0.withValues(alpha: 0.2),
|
: AppColors.red0.withValues(alpha: 0.2),
|
||||||
borderColor:
|
borderColor:
|
||||||
tender.status == 'Won'
|
tender.status == 'Won'
|
||||||
? AppColors.green10
|
? AppColors.green10
|
||||||
: tender.status == 'Completed'
|
: tender.status == 'approved'
|
||||||
? AppColors.grey30
|
? AppColors.grey30
|
||||||
: AppColors.red0,
|
: AppColors.red0,
|
||||||
statusIcon:
|
statusIcon:
|
||||||
tender.status == 'Won'
|
tender.status == 'Won'
|
||||||
? AssetsManager.tickCircle
|
? AssetsManager.tickCircle
|
||||||
: tender.status == 'Completed'
|
: tender.status == 'approved'
|
||||||
? null
|
? null
|
||||||
: AssetsManager.closeCircle,
|
: AssetsManager.closeCircle,
|
||||||
statusCardColor:
|
statusCardColor:
|
||||||
tender.status == 'Won'
|
tender.status == 'Won'
|
||||||
? AppColors.green20
|
? AppColors.green20
|
||||||
: tender.status == 'Completed'
|
: tender.status == 'approved'
|
||||||
? AppColors.green20
|
? AppColors.green20
|
||||||
: AppColors.red0,
|
: AppColors.red0,
|
||||||
statusTextColor:
|
statusTextColor:
|
||||||
tender.status == 'Won'
|
tender.status == 'Won'
|
||||||
? AppColors.green30
|
? AppColors.green30
|
||||||
: tender.status == 'Completed'
|
: tender.status == 'approved'
|
||||||
? AppColors.green30
|
? AppColors.green30
|
||||||
: AppColors.red10,
|
: AppColors.red10,
|
||||||
);
|
);
|
||||||
|
|||||||
+32
-8
@@ -37,10 +37,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.13.0"
|
version: "2.12.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -169,6 +169,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
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:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -221,10 +229,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fake_async
|
name: fake_async
|
||||||
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
|
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.3"
|
version: "1.3.2"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -416,6 +424,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
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:
|
js:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -444,10 +468,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
|
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.9"
|
version: "10.0.8"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -849,10 +873,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
|
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.0.0"
|
version: "14.3.1"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
Reference in New Issue
Block a user