process has started

This commit is contained in:
Вера 2024-12-18 17:20:52 +04:00
parent 55ec5f5ecc
commit 53ab91afde
10 changed files with 461 additions and 127 deletions

View File

@ -1,36 +0,0 @@
import 'package:json_annotation/json_annotation.dart';
part 'potions_dto.g.dart';
@JsonSerializable(createToJson: false)
class PotionsDto {
final List<PotionDataDto>? data;
const PotionsDto({this.data});
factory PotionsDto.fromJson(Map<String, dynamic> json) => _$PotionsDtoFromJson(json);
}
@JsonSerializable(createToJson: false)
class PotionDataDto {
final String? id;
final String? type;
final PotionAttributesDataDto? attributes;
const PotionDataDto({this.id, this.type, this.attributes});
factory PotionDataDto.fromJson(Map<String, dynamic> json) => _$PotionDataDtoFromJson(json);
}
@JsonSerializable(createToJson: false)
class PotionAttributesDataDto {
final String? name;
final String? characteristics;
final String? effect;
final String? image;
const PotionAttributesDataDto({this.name, this.characteristics, this.effect, this.image});
factory PotionAttributesDataDto.fromJson(Map<String, dynamic> json) =>
_$PotionAttributesDataDtoFromJson(json);
}

View File

@ -1,32 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'potions_dto.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
PotionsDto _$PotionsDtoFromJson(Map<String, dynamic> json) => PotionsDto(
data: (json['data'] as List<dynamic>?)
?.map((e) => PotionDataDto.fromJson(e as Map<String, dynamic>))
.toList(),
);
PotionDataDto _$PotionDataDtoFromJson(Map<String, dynamic> json) =>
PotionDataDto(
id: json['id'] as String?,
type: json['type'] as String?,
attributes: json['attributes'] == null
? null
: PotionAttributesDataDto.fromJson(
json['attributes'] as Map<String, dynamic>),
);
PotionAttributesDataDto _$PotionAttributesDataDtoFromJson(
Map<String, dynamic> json) =>
PotionAttributesDataDto(
name: json['name'] as String?,
characteristics: json['characteristics'] as String?,
effect: json['effect'] as String?,
image: json['image'] as String?,
);

View File

@ -0,0 +1,41 @@
import 'package:json_annotation/json_annotation.dart';
part 'recipe_dto.g.dart';
@JsonSerializable(createToJson: false)
class RecipesDto {
final List<RecipeDataDto>? hits; // API возвращает список рецептов под ключом "hits".
const RecipesDto({this.hits});
factory RecipesDto.fromJson(Map<String, dynamic> json) =>
_$RecipesDtoFromJson(json);
}
@JsonSerializable(createToJson: false)
class RecipeDataDto {
final RecipeAttributesDataDto? recipe; // API возвращает объект "recipe" внутри каждого "hit".
const RecipeDataDto({this.recipe});
factory RecipeDataDto.fromJson(Map<String, dynamic> json) =>
_$RecipeDataDtoFromJson(json);
}
@JsonSerializable(createToJson: false)
class RecipeAttributesDataDto {
final String? label;
final double? calories; // API возвращает "calories" как число.
final String? url;
final String? image;
const RecipeAttributesDataDto({
this.label,
this.calories,
this.url,
this.image,
});
factory RecipeAttributesDataDto.fromJson(Map<String, dynamic> json) =>
_$RecipeAttributesDataDtoFromJson(json);
}

View File

@ -1,23 +0,0 @@
import 'package:leonteva_pmu/data/dtos/potions_dto.dart';
import 'package:leonteva_pmu/domain/models/card.dart';
const String imagePlaceholder =
'https://cdn-icons-png.flaticon.com/512/4036/4036418.png';
extension PotionDataDtoToModel on PotionDataDto {
CardData toDomain() => CardData(
attributes?.name ?? 'UNKNOWN',
imageUrl: attributes?.image ?? imagePlaceholder,
descriptionText: _makeDescriptionText(attributes?.characteristics, attributes?.effect),
);
String _makeDescriptionText(String? characteristics, String? effect) {
return characteristics != null && effect != null
? '$characteristics - $effect'
: characteristics != null
? 'characteristics: $characteristics'
: effect != null
? 'effect: $effect'
: '';
}
}

View File

@ -0,0 +1,28 @@
import 'package:leonteva_pmu/data/dtos/recipes_dto.dart';
import 'package:leonteva_pmu/domain/models/card.dart';
const String imagePlaceholder =
'https://cdn-icons-png.flaticon.com/512/4036/4036418.png';
extension RecipeDataDtoToModel on RecipeDataDto {
CardData toDomain() => CardData(
recipe?.label ?? 'UNKNOWN', // Используем поле label из recipe.
imageUrl: recipe?.image ?? imagePlaceholder, // Используем поле image.
descriptionText: _makeDescriptionText(
recipe?.calories?.toString(), // Преобразуем double в строку.
recipe?.url, // Используем поле url.
),
);
String _makeDescriptionText(String? calories, String? url) {
if (calories != null && url != null) {
return 'Calories: $calories\nURL: $url';
} else if (calories != null) {
return 'Calories: $calories';
} else if (url != null) {
return 'URL: $url';
} else {
return 'No description available';
}
}
}

View File

@ -1,35 +0,0 @@
import 'package:dio/dio.dart';
import 'package:leonteva_pmu/data/dtos/potions_dto.dart';
import 'package:leonteva_pmu/data/mappers/potions_mapper.dart';
import 'package:leonteva_pmu/data/repositories/api_interface.dart';
import 'package:leonteva_pmu/domain/models/card.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
class PotterRepository extends ApiInterface {
static final Dio _dio = Dio()
..interceptors.add(PrettyDioLogger(
requestHeader: true,
requestBody: true,
));
static const String _baseUrl = 'https://api.potterdb.com';
@override
Future<List<CardData>?> loadData({String? q, OnErrorCallback? onError}) async {
try {
const String url = '$_baseUrl/v1/potions';
final Response<dynamic> response = await _dio.get<Map<dynamic, dynamic>>(
url,
queryParameters: q != null ? {'filter[name_cont]': q} : null,
);
final PotionsDto dto = PotionsDto.fromJson(response.data as Map<String, dynamic>);
final List<CardData>? data = dto.data?.map((e) => e.toDomain()).toList();
return data;
} on DioException catch (e) {
onError?.call(e.response?.statusMessage);
return null;
}
}
}

View File

@ -0,0 +1,47 @@
import 'package:dio/dio.dart';
import 'package:leonteva_pmu/data/dtos/recipes_dto.dart';
import 'package:leonteva_pmu/data/mappers/recipes_mapper.dart';
import 'package:leonteva_pmu/data/repositories/api_interface.dart';
import 'package:leonteva_pmu/domain/models/card.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
class PotterRepository extends ApiInterface {
static final Dio _dio = Dio()
..interceptors.add(PrettyDioLogger(
requestHeader: true,
requestBody: true,
responseHeader: true,
responseBody: true,
error: true,
));
static const String _baseUrl = 'https://api.edamam.com';
static const String _appId = '<YOUR_APP_ID>'; // Укажите ваш APP_ID.
static const String _appKey = '<YOUR_APP_KEY>'; // Укажите ваш APP_KEY.
@override
Future<List<CardData>?> loadData({String? q, OnErrorCallback? onError}) async {
try {
final String url = '$_baseUrl/search';
final Response<dynamic> response = await _dio.get(
url,
queryParameters: {
'q': q ?? '', // Параметр запроса для поиска рецептов.
'app_id': _appId,
'app_key': _appKey,
},
);
final RecipesDto dto =
RecipesDto.fromJson(response.data as Map<String, dynamic>);
final List<CardData>? data =
dto.hits?.map((e) => e.toDomain()).toList(); // Преобразуем DTO в модель.
return data;
} on DioException catch (e) {
// Обработка ошибки и передача сообщения через onError.
onError?.call(e.response?.statusMessage ?? 'Unknown error');
return null;
}
}
}

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:leonteva_pmu/data/repositories/potter_repository.dart'; import 'package:leonteva_pmu/data/repositories/recipe_repository.dart';
import 'package:leonteva_pmu/presentation/details_page/details_page.dart'; import 'package:leonteva_pmu/presentation/details_page/details_page.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:leonteva_pmu/domain/models/card.dart'; import 'package:leonteva_pmu/domain/models/card.dart';

View File

@ -1,6 +1,35 @@
# Generated by pub # Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile # See https://dart.dev/tools/pub/glossary#lockfile
packages: packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "88399e291da5f7e889359681a8f64b18c5123e03576b01f32a6a276611e511c3"
url: "https://pub.dev"
source: hosted
version: "78.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "62899ef43d0b962b056ed2ebac6b47ec76ffd003d5f7c4e4dc870afe63188e33"
url: "https://pub.dev"
source: hosted
version: "7.1.0"
args:
dependency: transitive
description:
name: args
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
url: "https://pub.dev"
source: hosted
version: "2.6.0"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -17,6 +46,70 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
build:
dependency: transitive
description:
name: build
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
url: "https://pub.dev"
source: hosted
version: "2.4.2"
build_config:
dependency: transitive
description:
name: build_config
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
build_daemon:
dependency: transitive
description:
name: build_daemon
sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948"
url: "https://pub.dev"
source: hosted
version: "4.0.3"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e"
url: "https://pub.dev"
source: hosted
version: "2.4.3"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573"
url: "https://pub.dev"
source: hosted
version: "2.4.14"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
url: "https://pub.dev"
source: hosted
version: "8.0.0"
built_collection:
dependency: transitive
description:
name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2"
url: "https://pub.dev"
source: hosted
version: "8.9.3"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@ -25,6 +118,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
url: "https://pub.dev"
source: hosted
version: "2.0.3"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@ -33,6 +134,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
code_builder:
dependency: transitive
description:
name: code_builder
sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
url: "https://pub.dev"
source: hosted
version: "4.10.1"
collection: collection:
dependency: transitive dependency: transitive
description: description:
@ -41,6 +150,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.19.0" version: "1.19.0"
convert:
dependency: transitive
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.dev"
source: hosted
version: "3.1.2"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
@ -49,6 +174,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.8" version: "1.0.8"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: "64b717484993e85315d0c04081b6fca9ef8bac8c2cb794b2e15810250b335913"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
@ -73,6 +206,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev"
source: hosted
version: "1.1.1"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -91,6 +240,38 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev"
source: hosted
version: "4.0.0"
glob:
dependency: transitive
description:
name: glob
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
graphs:
dependency: transitive
description:
name: graphs
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
url: "https://pub.dev"
source: hosted
version: "3.2.2"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
@ -99,6 +280,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.1" version: "4.1.1"
io:
dependency: transitive
description:
name: io
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
url: "https://pub.dev"
source: hosted
version: "1.0.5"
js:
dependency: transitive
description:
name: js
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
url: "https://pub.dev"
source: hosted
version: "0.7.1"
json_annotation: json_annotation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -107,6 +304,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.9.0" version: "4.9.0"
json_serializable:
dependency: "direct dev"
description:
name: json_serializable
sha256: "8f52361c07497a7f2c16c13aac159f9be6fb12b1d67719eac98a21d9a205d571"
url: "https://pub.dev"
source: hosted
version: "6.9.2"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@ -139,6 +344,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0" version: "5.1.0"
logging:
dependency: transitive
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.3.0"
macros:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -163,6 +384,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
mime:
dependency: transitive
description:
name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
package_config:
dependency: transitive
description:
name: package_config
sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
path: path:
dependency: transitive dependency: transitive
description: description:
@ -171,6 +408,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.0" version: "1.9.0"
pool:
dependency: transitive
description:
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
pretty_dio_logger: pretty_dio_logger:
dependency: "direct main" dependency: "direct main"
description: description:
@ -179,11 +424,59 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.0" version: "1.4.0"
pub_semver:
dependency: transitive
description:
name: pub_semver
sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
url: "https://pub.dev"
source: hosted
version: "1.3.0"
shelf:
dependency: transitive
description:
name: shelf
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.dev"
source: hosted
version: "1.4.2"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
url: "https://pub.dev"
source: hosted
version: "2.0.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
source_gen:
dependency: transitive
description:
name: source_gen
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
source_helper:
dependency: transitive
description:
name: source_helper
sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
url: "https://pub.dev"
source: hosted
version: "1.3.5"
source_span: source_span:
dependency: transitive dependency: transitive
description: description:
@ -208,6 +501,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
stream_transform:
dependency: transitive
description:
name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev"
source: hosted
version: "2.1.1"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
@ -232,6 +533,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.3" version: "0.7.3"
timing:
dependency: transitive
description:
name: timing
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@ -256,6 +565,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.3.0" version: "14.3.0"
watcher:
dependency: transitive
description:
name: watcher
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
web: web:
dependency: transitive dependency: transitive
description: description:
@ -264,6 +581,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
web_socket:
dependency: transitive
description:
name: web_socket
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
url: "https://pub.dev"
source: hosted
version: "0.1.6"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
yaml:
dependency: transitive
description:
name: yaml
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
sdks: sdks:
dart: ">=3.6.0 <4.0.0" dart: ">=3.6.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54" flutter: ">=3.18.0-18.0.pre.54"

View File

@ -31,6 +31,7 @@ dependencies:
dio: ^5.7.0 dio: ^5.7.0
pretty_dio_logger: ^1.4.0 pretty_dio_logger: ^1.4.0
json_annotation: ^4.9.0 json_annotation: ^4.9.0
flutter: flutter:
sdk: flutter sdk: flutter
@ -39,6 +40,8 @@ dependencies:
cupertino_icons: ^1.0.8 cupertino_icons: ^1.0.8
dev_dependencies: dev_dependencies:
build_runner: ^2.4.14
json_serializable: ^6.9.2
flutter_test: flutter_test:
sdk: flutter sdk: flutter