From eee1d9cdd86c33309253aeb6654b6a7eab0f219b Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Thu, 25 Sep 2025 09:01:10 +0330 Subject: [PATCH] feedback response model changes --- .../model/feedback_data/feedback_data.dart | 5 +- .../feedback_data/feedback_data.freezed.dart | 73 +++++++++++++------ .../model/feedback_data/feedback_data.g.dart | 7 +- lib/view_models/tenders_view_model.dart | 30 ++++---- 4 files changed, 77 insertions(+), 38 deletions(-) diff --git a/lib/data/services/model/feedback_data/feedback_data.dart b/lib/data/services/model/feedback_data/feedback_data.dart index a29a0c1..8914c90 100644 --- a/lib/data/services/model/feedback_data/feedback_data.dart +++ b/lib/data/services/model/feedback_data/feedback_data.dart @@ -2,6 +2,8 @@ import 'package:freezed_annotation/freezed_annotation.dart'; +import '../tender_data/tender_data.dart'; + part 'feedback_data.freezed.dart'; part 'feedback_data.g.dart'; @@ -13,7 +15,8 @@ abstract class FeedbackData with _$FeedbackData { @JsonKey(name: 'customer_id') required String? customerId, @JsonKey(name: 'feedback_type') required String? feedbackType, @JsonKey(name: 'id') required String? id, - @JsonKey(name: 'tender') required String? tender, + @JsonKey(name: 'tender_id') required String? tenderId, + @JsonKey(name: 'tender') required TenderData? tender, @JsonKey(name: 'updated_at') required int? updatedAt, }) = _FeedbackData; diff --git a/lib/data/services/model/feedback_data/feedback_data.freezed.dart b/lib/data/services/model/feedback_data/feedback_data.freezed.dart index df2f018..d6e88da 100644 --- a/lib/data/services/model/feedback_data/feedback_data.freezed.dart +++ b/lib/data/services/model/feedback_data/feedback_data.freezed.dart @@ -15,7 +15,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$FeedbackData { -@JsonKey(name: 'company_id') String? get companyId;@JsonKey(name: 'created_at') int? get createdAt;@JsonKey(name: 'customer_id') String? get customerId;@JsonKey(name: 'feedback_type') String? get feedbackType;@JsonKey(name: 'id') String? get id;@JsonKey(name: 'tender') String? get tender;@JsonKey(name: 'updated_at') int? get updatedAt; +@JsonKey(name: 'company_id') String? get companyId;@JsonKey(name: 'created_at') int? get createdAt;@JsonKey(name: 'customer_id') String? get customerId;@JsonKey(name: 'feedback_type') String? get feedbackType;@JsonKey(name: 'id') String? get id;@JsonKey(name: 'tender_id') String? get tenderId;@JsonKey(name: 'tender') TenderData? get tender;@JsonKey(name: 'updated_at') int? get updatedAt; /// Create a copy of FeedbackData /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -28,16 +28,16 @@ $FeedbackDataCopyWith get copyWith => _$FeedbackDataCopyWithImpl Object.hash(runtimeType,companyId,createdAt,customerId,feedbackType,id,tender,updatedAt); +int get hashCode => Object.hash(runtimeType,companyId,createdAt,customerId,feedbackType,id,tenderId,tender,updatedAt); @override String toString() { - return 'FeedbackData(companyId: $companyId, createdAt: $createdAt, customerId: $customerId, feedbackType: $feedbackType, id: $id, tender: $tender, updatedAt: $updatedAt)'; + return 'FeedbackData(companyId: $companyId, createdAt: $createdAt, customerId: $customerId, feedbackType: $feedbackType, id: $id, tenderId: $tenderId, tender: $tender, updatedAt: $updatedAt)'; } @@ -48,11 +48,11 @@ abstract mixin class $FeedbackDataCopyWith<$Res> { factory $FeedbackDataCopyWith(FeedbackData value, $Res Function(FeedbackData) _then) = _$FeedbackDataCopyWithImpl; @useResult $Res call({ -@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'created_at') int? createdAt,@JsonKey(name: 'customer_id') String? customerId,@JsonKey(name: 'feedback_type') String? feedbackType,@JsonKey(name: 'id') String? id,@JsonKey(name: 'tender') String? tender,@JsonKey(name: 'updated_at') int? updatedAt +@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'created_at') int? createdAt,@JsonKey(name: 'customer_id') String? customerId,@JsonKey(name: 'feedback_type') String? feedbackType,@JsonKey(name: 'id') String? id,@JsonKey(name: 'tender_id') String? tenderId,@JsonKey(name: 'tender') TenderData? tender,@JsonKey(name: 'updated_at') int? updatedAt }); - +$TenderDataCopyWith<$Res>? get tender; } /// @nodoc @@ -65,19 +65,32 @@ class _$FeedbackDataCopyWithImpl<$Res> /// Create a copy of FeedbackData /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? companyId = freezed,Object? createdAt = freezed,Object? customerId = freezed,Object? feedbackType = freezed,Object? id = freezed,Object? tender = freezed,Object? updatedAt = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? companyId = freezed,Object? createdAt = freezed,Object? customerId = freezed,Object? feedbackType = freezed,Object? id = freezed,Object? tenderId = freezed,Object? tender = freezed,Object? updatedAt = freezed,}) { return _then(_self.copyWith( companyId: freezed == companyId ? _self.companyId : companyId // ignore: cast_nullable_to_non_nullable as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as int?,customerId: freezed == customerId ? _self.customerId : customerId // ignore: cast_nullable_to_non_nullable as String?,feedbackType: freezed == feedbackType ? _self.feedbackType : feedbackType // ignore: cast_nullable_to_non_nullable as String?,id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String?,tenderId: freezed == tenderId ? _self.tenderId : tenderId // ignore: cast_nullable_to_non_nullable as String?,tender: freezed == tender ? _self.tender : tender // ignore: cast_nullable_to_non_nullable -as String?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as TenderData?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable as int?, )); } +/// Create a copy of FeedbackData +/// 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)); + }); +} } @@ -159,10 +172,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender') String? tender, @JsonKey(name: 'updated_at') int? updatedAt)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'tender') TenderData? tender, @JsonKey(name: 'updated_at') int? updatedAt)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _FeedbackData() when $default != null: -return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tender,_that.updatedAt);case _: +return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tenderId,_that.tender,_that.updatedAt);case _: return orElse(); } @@ -180,10 +193,10 @@ return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackT /// } /// ``` -@optionalTypeArgs TResult when(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender') String? tender, @JsonKey(name: 'updated_at') int? updatedAt) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'tender') TenderData? tender, @JsonKey(name: 'updated_at') int? updatedAt) $default,) {final _that = this; switch (_that) { case _FeedbackData(): -return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tender,_that.updatedAt);case _: +return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tenderId,_that.tender,_that.updatedAt);case _: throw StateError('Unexpected subclass'); } @@ -200,10 +213,10 @@ return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackT /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender') String? tender, @JsonKey(name: 'updated_at') int? updatedAt)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function(@JsonKey(name: 'company_id') String? companyId, @JsonKey(name: 'created_at') int? createdAt, @JsonKey(name: 'customer_id') String? customerId, @JsonKey(name: 'feedback_type') String? feedbackType, @JsonKey(name: 'id') String? id, @JsonKey(name: 'tender_id') String? tenderId, @JsonKey(name: 'tender') TenderData? tender, @JsonKey(name: 'updated_at') int? updatedAt)? $default,) {final _that = this; switch (_that) { case _FeedbackData() when $default != null: -return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tender,_that.updatedAt);case _: +return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackType,_that.id,_that.tenderId,_that.tender,_that.updatedAt);case _: return null; } @@ -215,7 +228,7 @@ return $default(_that.companyId,_that.createdAt,_that.customerId,_that.feedbackT @JsonSerializable() class _FeedbackData implements FeedbackData { - const _FeedbackData({@JsonKey(name: 'company_id') required this.companyId, @JsonKey(name: 'created_at') required this.createdAt, @JsonKey(name: 'customer_id') required this.customerId, @JsonKey(name: 'feedback_type') required this.feedbackType, @JsonKey(name: 'id') required this.id, @JsonKey(name: 'tender') required this.tender, @JsonKey(name: 'updated_at') required this.updatedAt}); + const _FeedbackData({@JsonKey(name: 'company_id') required this.companyId, @JsonKey(name: 'created_at') required this.createdAt, @JsonKey(name: 'customer_id') required this.customerId, @JsonKey(name: 'feedback_type') required this.feedbackType, @JsonKey(name: 'id') required this.id, @JsonKey(name: 'tender_id') required this.tenderId, @JsonKey(name: 'tender') required this.tender, @JsonKey(name: 'updated_at') required this.updatedAt}); factory _FeedbackData.fromJson(Map json) => _$FeedbackDataFromJson(json); @override@JsonKey(name: 'company_id') final String? companyId; @@ -223,7 +236,8 @@ class _FeedbackData implements FeedbackData { @override@JsonKey(name: 'customer_id') final String? customerId; @override@JsonKey(name: 'feedback_type') final String? feedbackType; @override@JsonKey(name: 'id') final String? id; -@override@JsonKey(name: 'tender') final String? tender; +@override@JsonKey(name: 'tender_id') final String? tenderId; +@override@JsonKey(name: 'tender') final TenderData? tender; @override@JsonKey(name: 'updated_at') final int? updatedAt; /// Create a copy of FeedbackData @@ -239,16 +253,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _FeedbackData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.customerId, customerId) || other.customerId == customerId)&&(identical(other.feedbackType, feedbackType) || other.feedbackType == feedbackType)&&(identical(other.id, id) || other.id == id)&&(identical(other.tender, tender) || other.tender == tender)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _FeedbackData&&(identical(other.companyId, companyId) || other.companyId == companyId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.customerId, customerId) || other.customerId == customerId)&&(identical(other.feedbackType, feedbackType) || other.feedbackType == feedbackType)&&(identical(other.id, id) || other.id == id)&&(identical(other.tenderId, tenderId) || other.tenderId == tenderId)&&(identical(other.tender, tender) || other.tender == tender)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,companyId,createdAt,customerId,feedbackType,id,tender,updatedAt); +int get hashCode => Object.hash(runtimeType,companyId,createdAt,customerId,feedbackType,id,tenderId,tender,updatedAt); @override String toString() { - return 'FeedbackData(companyId: $companyId, createdAt: $createdAt, customerId: $customerId, feedbackType: $feedbackType, id: $id, tender: $tender, updatedAt: $updatedAt)'; + return 'FeedbackData(companyId: $companyId, createdAt: $createdAt, customerId: $customerId, feedbackType: $feedbackType, id: $id, tenderId: $tenderId, tender: $tender, updatedAt: $updatedAt)'; } @@ -259,11 +273,11 @@ abstract mixin class _$FeedbackDataCopyWith<$Res> implements $FeedbackDataCopyWi factory _$FeedbackDataCopyWith(_FeedbackData value, $Res Function(_FeedbackData) _then) = __$FeedbackDataCopyWithImpl; @override @useResult $Res call({ -@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'created_at') int? createdAt,@JsonKey(name: 'customer_id') String? customerId,@JsonKey(name: 'feedback_type') String? feedbackType,@JsonKey(name: 'id') String? id,@JsonKey(name: 'tender') String? tender,@JsonKey(name: 'updated_at') int? updatedAt +@JsonKey(name: 'company_id') String? companyId,@JsonKey(name: 'created_at') int? createdAt,@JsonKey(name: 'customer_id') String? customerId,@JsonKey(name: 'feedback_type') String? feedbackType,@JsonKey(name: 'id') String? id,@JsonKey(name: 'tender_id') String? tenderId,@JsonKey(name: 'tender') TenderData? tender,@JsonKey(name: 'updated_at') int? updatedAt }); - +@override $TenderDataCopyWith<$Res>? get tender; } /// @nodoc @@ -276,20 +290,33 @@ class __$FeedbackDataCopyWithImpl<$Res> /// Create a copy of FeedbackData /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? companyId = freezed,Object? createdAt = freezed,Object? customerId = freezed,Object? feedbackType = freezed,Object? id = freezed,Object? tender = freezed,Object? updatedAt = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? companyId = freezed,Object? createdAt = freezed,Object? customerId = freezed,Object? feedbackType = freezed,Object? id = freezed,Object? tenderId = freezed,Object? tender = freezed,Object? updatedAt = freezed,}) { return _then(_FeedbackData( companyId: freezed == companyId ? _self.companyId : companyId // ignore: cast_nullable_to_non_nullable as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as int?,customerId: freezed == customerId ? _self.customerId : customerId // ignore: cast_nullable_to_non_nullable as String?,feedbackType: freezed == feedbackType ? _self.feedbackType : feedbackType // ignore: cast_nullable_to_non_nullable as String?,id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String?,tenderId: freezed == tenderId ? _self.tenderId : tenderId // ignore: cast_nullable_to_non_nullable as String?,tender: freezed == tender ? _self.tender : tender // ignore: cast_nullable_to_non_nullable -as String?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as TenderData?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable as int?, )); } +/// Create a copy of FeedbackData +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$TenderDataCopyWith<$Res>? get tender { + if (_self.tender == null) { + return null; + } + return $TenderDataCopyWith<$Res>(_self.tender!, (value) { + return _then(_self.copyWith(tender: value)); + }); +} } // dart format on diff --git a/lib/data/services/model/feedback_data/feedback_data.g.dart b/lib/data/services/model/feedback_data/feedback_data.g.dart index 9e53ae6..3ba1cfd 100644 --- a/lib/data/services/model/feedback_data/feedback_data.g.dart +++ b/lib/data/services/model/feedback_data/feedback_data.g.dart @@ -13,7 +13,11 @@ _FeedbackData _$FeedbackDataFromJson(Map json) => customerId: json['customer_id'] as String?, feedbackType: json['feedback_type'] as String?, id: json['id'] as String?, - tender: json['tender'] as String?, + tenderId: json['tender_id'] as String?, + tender: + json['tender'] == null + ? null + : TenderData.fromJson(json['tender'] as Map), updatedAt: (json['updated_at'] as num?)?.toInt(), ); @@ -24,6 +28,7 @@ Map _$FeedbackDataToJson(_FeedbackData instance) => 'customer_id': instance.customerId, 'feedback_type': instance.feedbackType, 'id': instance.id, + 'tender_id': instance.tenderId, 'tender': instance.tender, 'updated_at': instance.updatedAt, }; diff --git a/lib/view_models/tenders_view_model.dart b/lib/view_models/tenders_view_model.dart index 6661231..3bf35d7 100644 --- a/lib/view_models/tenders_view_model.dart +++ b/lib/view_models/tenders_view_model.dart @@ -1,8 +1,7 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tm_app/core/utils/device_utils.dart'; +import 'package:tm_app/core/utils/logger.dart'; import 'package:tm_app/data/repositories/tenders_repository.dart'; import 'package:tm_app/data/services/model/feedback_data/feedback_data.dart'; import 'package:tm_app/data/services/model/feedback_response/feedback_response.dart'; @@ -134,7 +133,7 @@ class TendersViewModel with ChangeNotifier { /// Get feedback for a specific tender FeedbackData? getFeedbackForTender(String tenderId) { try { - return feedbacks.firstWhere((f) => f.tender == tenderId); + return feedbacks.firstWhere((f) => f.tenderId == tenderId); } catch (e) { return null; } @@ -142,7 +141,7 @@ class TendersViewModel with ChangeNotifier { /// Check if feedback exists for a specific tender bool hasFeedbackForTender(String tenderId) { - return feedbacks.any((f) => f.tender == tenderId); + return feedbacks.any((f) => f.tenderId == tenderId); } Future getTenders({ @@ -319,16 +318,20 @@ class TendersViewModel with ChangeNotifier { // Add or update _feedbackData in feedbacks list by tender id if (_feedbackData != null) { final index = feedbacks.indexWhere( - (f) => f.tender == _feedbackData!.tender, + (f) => f.tenderId == _feedbackData!.tenderId, ); if (index != -1) { feedbacks[index] = _feedbackData!; - log('Updated feedback for tender: ${_feedbackData!.tender}'); + AppLogger().info( + 'Updated feedback for tender: ${_feedbackData!.tenderId}', + ); } else { feedbacks.add(_feedbackData!); - log('Added new feedback for tender: ${_feedbackData!.tender}'); + AppLogger().info( + 'Added new feedback for tender: ${_feedbackData!.tenderId}', + ); } - log('Total feedbacks: ${feedbacks.length}'); + AppLogger().info('Total feedbacks: ${feedbacks.length}'); } break; case Error(): @@ -350,7 +353,7 @@ class TendersViewModel with ChangeNotifier { // Get current feedback for this tender final existingFeedback = getFeedbackForTender(tenderId); final existingFeedbackIndex = feedbacks.indexWhere( - (f) => f.tender == tenderId, + (f) => f.tenderId == tenderId, ); // Create optimistic feedback data @@ -364,7 +367,8 @@ class TendersViewModel with ChangeNotifier { customerId: null, // Will be filled by server feedbackType: feedbackType, id: null, // Will be filled by server - tender: tenderId, + tenderId: tenderId, + tender: null, updatedAt: DateTime.now().millisecondsSinceEpoch, ); feedbacks.add(optimisticFeedback); @@ -412,18 +416,18 @@ class TendersViewModel with ChangeNotifier { } } else { // Server returned null data - remove feedback - feedbacks.removeWhere((f) => f.tender == tenderId); + feedbacks.removeWhere((f) => f.tenderId == tenderId); } break; case Error(): // Revert optimistic update on error if (existingFeedback == null) { // Remove the optimistic feedback we added - feedbacks.removeWhere((f) => f.tender == tenderId); + feedbacks.removeWhere((f) => f.tenderId == tenderId); } else { // Restore the original feedback - find current index and update, or add if not found final currentIndex = feedbacks.indexWhere( - (f) => f.tender == tenderId, + (f) => f.tenderId == tenderId, ); if (currentIndex != -1) { feedbacks[currentIndex] = existingFeedback;