Files
eatvio_app/lib/features/feed/models/diets_pagination_model.dart

195 lines
5.7 KiB
Dart

import 'package:eatvio_app/core/models/pagination_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'diets_pagination_model.freezed.dart';
part 'diets_pagination_model.g.dart';
@freezed
abstract class DietsPagination with _$DietsPagination {
const factory DietsPagination({
@JsonKey(name: "data") required List<Diet> data,
@JsonKey(name: "links") required Links links,
@JsonKey(name: "meta") required Meta meta,
}) = _DietsPagination;
factory DietsPagination.fromJson(Map<String, dynamic> json) => _$DietsPaginationFromJson(json);
}
@freezed
abstract class Diet with _$Diet {
const factory Diet({
@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 DietState state,
@JsonKey(name: "type", fromJson: parseDietTypeFromJson) required DietType type,
@JsonKey(name: "description_md", defaultValue: '') required String details,
@JsonKey(name: "daily_schedule", defaultValue: {}) required Map<int, Map<int, Map<int, DailySchedule>>> dailySchedule,
@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: "was_liked_by_me") required bool wasLikedByMe,
@JsonKey(name: "is_favorite") required bool isFavorite,
@JsonKey(name: "daily_nutrition") required List<DailyNutrition> dailyNutrition,
}) = _Diet;
factory Diet.fromJson(Map<String, dynamic> json) => _$DietFromJson(json);
}
DietType parseDietTypeFromJson(Map<String, dynamic>? json) {
if (json == null) {
return const DietType(carb: false, light: false, meat: false, veg: false);
}
return DietType.fromJson(json);
}
enum DietState {
@JsonValue('active')
active,
@JsonValue('drafted')
draft,
@JsonValue('personal')
personal;
@override
String toString() {
switch (this) {
case DietState.active:
return 'active';
case DietState.draft:
return 'drafted';
case DietState.personal:
return 'personal';
}
}
}
@freezed
abstract class CreatedDiet with _$CreatedDiet {
const factory CreatedDiet({@JsonKey(name: "id") required int id}) = _CreatedDiet;
factory CreatedDiet.fromJson(Map<String, dynamic> json) => _$CreatedDietFromJson(json);
}
int parseDuration(dynamic duration) {
if (duration is String) {
return int.parse(duration);
} else {
return duration;
}
}
@freezed
abstract class Author with _$Author {
const Author._();
const factory Author({
@JsonKey(name: "author_slug") required String authorSlug,
@JsonKey(name: "author_name") required String authorName,
@JsonKey(name: "author_profile_icon") required String authorProfileIcon,
@JsonKey(name: "author_is_me") required bool authorIsMe,
@JsonKey(name: "is_entity_subscribed_by_me") bool? isEntitySubscribedByMe,
@JsonKey(name: "author_place_in_rating") int? authorPlaceInRating,
@JsonKey(name: "author_roles") @Default([]) List<String> authorRoles,
}) = _Author;
factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json);
bool get isAdmin => authorRoles.contains('admin');
}
@freezed
abstract class DailySchedule with _$DailySchedule {
const factory DailySchedule({
@JsonKey(name: "name") required String name,
@JsonKey(name: "portion") required Portion portion,
@JsonKey(name: "quantity", fromJson: _parseQuantity) required int quantity,
@JsonKey(name: 'nutrition', includeToJson: false) DailyNutrition? dailyNutrition,
@JsonKey(name: 'product_nutritional_value_id', includeToJson: true, includeFromJson: true, includeIfNull: false) int? productNutritionalValueId,
}) = _DailySchedule;
factory DailySchedule.fromJson(Map<String, dynamic> json) => _$DailyScheduleFromJson(json);
}
int _parseQuantity(dynamic quantity) {
if (quantity is String) {
return int.parse(quantity);
} else {
return quantity;
}
}
enum Portion {
@JsonValue("gr")
grams,
@JsonValue("milliliters")
milliliters,
@JsonValue("pcs")
pcs;
static Portion? getPortionFromValue(String value) {
switch (value) {
case 'gr':
return Portion.grams;
case 'milliliters':
return Portion.milliliters;
case 'pcs':
return Portion.pcs;
default:
return null;
}
}
String getValue() => switch (this) {
Portion.grams => 'gr',
Portion.milliliters => 'milliliters',
Portion.pcs => 'pcs',
};
}
@freezed
abstract class DietType with _$DietType {
const DietType._();
const factory DietType({
@JsonKey(name: "light") bool? light,
@JsonKey(name: "veg") bool? veg,
@JsonKey(name: "carb") bool? carb,
@JsonKey(name: "meat") bool? meat,
}) = _DietType;
factory DietType.fromJson(Map<String, dynamic> json) => _$DietTypeFromJson(json);
bool hasAtLeastOneType() {
return light ?? false || (veg ?? false) || (carb ?? false) || (meat ?? false);
}
}
class EnumValues<T> {
Map<String, T> map;
late Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
reverseMap = map.map((k, v) => MapEntry(v, k));
return reverseMap;
}
}
@freezed
abstract class DailyNutrition with _$DailyNutrition {
const factory DailyNutrition({
@JsonKey(name: 'energy') required double energy,
@JsonKey(name: 'proteins') required double proteins,
@JsonKey(name: 'fats') required double fats,
@JsonKey(name: 'carbohydrates') required double carbohydrates,
}) = _DailyNutrition;
factory DailyNutrition.fromJson(Map<String, dynamic> json) => _$DailyNutritionFromJson(json);
}