Files
eatvio_app/lib/features/feed/models/plan_pagination_model.dart
2025-05-21 17:42:43 +03:00

100 lines
3.9 KiB
Dart

import 'package:eatvio_app/core/models/pagination_model.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/my_finance/models/card_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'plan_pagination_model.freezed.dart';
part 'plan_pagination_model.g.dart';
@freezed
abstract class PlanPaginationModel with _$PlanPaginationModel {
const factory PlanPaginationModel({
@JsonKey(name: "data") required List<PlanModel> data,
@JsonKey(name: "links") required Links links,
@JsonKey(name: "meta") required Meta meta,
}) = _PlanPaginationModel;
factory PlanPaginationModel.fromJson(Map<String, dynamic> json) => _$PlanPaginationModelFromJson(json);
}
@freezed
abstract class PlanModel with _$PlanModel {
const factory PlanModel({
@JsonKey(name: "id") required int id,
@JsonKey(name: "slug") required String slug,
@JsonKey(name: "name") required String name,
@JsonKey(name: "image") required String image,
@JsonKey(name: "duration") required int duration,
@JsonKey(name: "state") required String state,
@JsonKey(name: "type", fromJson: planTypeFromJson) required PlanType type,
@JsonKey(name: "description_md") required String details,
@JsonKey(name: "packets_count") required int packetsCount,
@JsonKey(name: "packet1_options", fromJson: parseOption) PacketOptions? packet1Options,
@JsonKey(name: "packet2_options", fromJson: parseOption) PacketOptions? packet2Options,
@JsonKey(name: "packet3_options", fromJson: parseOption) PacketOptions? packet3Options,
@JsonKey(name: "author") required Author author,
@JsonKey(name: "total_likes") required int totalLikes,
@JsonKey(name: "total_views") required int totalViews,
@JsonKey(name: "total_comments") required int totalComments,
@JsonKey(name: "is_favorite") required bool isFavorite,
@JsonKey(name: "min_price_of_options") required double minPriceOfOptions,
@JsonKey(name: "max_price_of_options") required double maxPriceOfOptions,
@JsonKey(name: "was_liked_by_me") required bool wasLikedByMe,
}) = _PlanModel;
factory PlanModel.fromJson(Map<String, dynamic> json) => _$PlanModelFromJson(json);
}
PacketOptions? parseOption(json) {
if (json is Map<String, dynamic>) {
return PacketOptions.fromJson(json);
}
return null;
}
PlanType planTypeFromJson(dynamic json) {
if (json is List<dynamic>) {
return const PlanType(fit: false, slim: false, behavior: false, wellness: false);
}
return PlanType.fromJson(json);
}
@freezed
abstract class PacketOptions with _$PacketOptions {
const factory PacketOptions({
@JsonKey(name: "items", fromJson: _parseItems) required List<String> items,
@JsonKey(name: "price") required dynamic price,
@JsonKey(name: "short") required String short,
@JsonKey(name: "description_md") required String description,
}) = _PacketOptions;
factory PacketOptions.fromJson(Map<String, dynamic> json) => _$PacketOptionsFromJson(json);
factory PacketOptions.empty() => PacketOptions(items: [], price: double.parse('1200'), short: '', description: '');
}
List<String> _parseItems(json) {
if (json is Map<String, dynamic>) {
return json.values.map((e) => e as String).toList();
}
return (json as List<dynamic>).map((e) => e as String).toList();
}
@freezed
abstract class PlanType with _$PlanType {
const PlanType._();
const factory PlanType({
@JsonKey(name: "fit", fromJson: parseBool) required bool? fit,
@JsonKey(name: "slim", fromJson: parseBool) required bool? slim,
@JsonKey(name: "behavior", fromJson: parseBool) required bool? behavior,
@JsonKey(name: "wellness", fromJson: parseBool) required bool? wellness,
}) = _PlanType;
factory PlanType.fromJson(Map<String, dynamic> json) => _$PlanTypeFromJson(json);
bool hasAtLeastOneType() {
return (fit ?? false) || (slim ?? false) || (behavior ?? false) || (wellness ?? false);
}
}