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:
a.ghabeli
2025-08-20 10:37:32 +03:30
20 changed files with 905 additions and 69 deletions
+1 -1
View File
@@ -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()),
), ),
+1
View File
@@ -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);
} }
} }
+18
View File
@@ -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);
}
@@ -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,
};
+26 -11
View File
@@ -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));
}
} }
} }
+36 -2
View File
@@ -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();
}
} }
+8 -10
View File
@@ -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;
} }
+5 -3
View File
@@ -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
View File
@@ -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: