forked from eatvio/eatvio_app
183 lines
5.3 KiB
Dart
183 lines
5.3 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: "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") required DietType type,
|
|
@JsonKey(name: "description_md") required String details,
|
|
@JsonKey(name: "daily_schedule") 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);
|
|
}
|
|
|
|
enum DietState {
|
|
@JsonKey(name: 'active')
|
|
active,
|
|
@JsonKey(name: 'drafted')
|
|
draft,
|
|
@JsonKey(name: '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 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,
|
|
}) = _Author;
|
|
|
|
factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json);
|
|
}
|
|
|
|
@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: false, includeIfNull: false) String? 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);
|
|
}
|