From 684b2eec9d5827a7f665e1c64909e1b94a919064 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Fri, 16 Aug 2024 15:49:26 +0300 Subject: [PATCH] fix(recipe): Fix --- .../bloc/recipe_create_cubit.dart | 4 +++ .../pages/recipe_create_screen.dart | 33 ++++++++++++++---- .../pages/recipe_edit_screen.dart | 29 +++++++++++++--- .../reporitories/recipe_repository.dart | 12 ++++++- .../recipes/services/recipe_service.dart | 5 ++- .../recipes/services/recipe_service.g.dart | 34 +++++++++++++++++-- 6 files changed, 103 insertions(+), 14 deletions(-) diff --git a/lib/features/recipes/presentation/bloc/recipe_create_cubit.dart b/lib/features/recipes/presentation/bloc/recipe_create_cubit.dart index 3aef52aa..5507c0ea 100644 --- a/lib/features/recipes/presentation/bloc/recipe_create_cubit.dart +++ b/lib/features/recipes/presentation/bloc/recipe_create_cubit.dart @@ -145,6 +145,10 @@ class RecipeCreateCubit extends Cubit { await recipeRepository.publishRecipe(recipe); } + editRecipe(RecipeModel recipe, String id) async { + await recipeRepository.editRecipe(recipe, id); + } + uploadRecipeImage(XFile? pickedFile) { try { if (state is RecipeCreateStateLoaded) { diff --git a/lib/features/recipes/presentation/pages/recipe_create_screen.dart b/lib/features/recipes/presentation/pages/recipe_create_screen.dart index 13c52ae6..79b159b7 100644 --- a/lib/features/recipes/presentation/pages/recipe_create_screen.dart +++ b/lib/features/recipes/presentation/pages/recipe_create_screen.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:eatvio_app/core/app_export.dart'; import 'package:eatvio_app/features/diary/models/product.dart'; @@ -17,6 +18,7 @@ import 'package:image_picker/image_picker.dart'; class RecipeCreateScreen extends StatelessWidget { RecipeCreateScreen({Key? key}) : super(key: key); Widget build(BuildContext context) { + context.read().loadRecipeCreate(); return BlocBuilder( builder: (context, state) { if (state is RecipeCreateStateLoaded) { @@ -53,8 +55,29 @@ class RecipeCreateScreen extends StatelessWidget { List _options = state.autocompleteList.map((Product item) => item.name).toList(); return Scaffold( appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, + actions: [ + InkWell( + borderRadius: BorderRadius.circular(16), + child: Ink( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 4), + Text( + 'Новый рецепт', + style: TextStyle( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.w400, + height: 1, + ), + ), + ], + ), + ), + ), + ], ), backgroundColor: Color.fromARGB(255, 240, 242, 245), resizeToAvoidBottomInset: true, @@ -145,7 +168,7 @@ class RecipeCreateScreen extends StatelessWidget { optionsBuilder: _buildOptions(_options), fieldViewBuilder: ( BuildContext context, - productEditingController, + TextEditingController productEditingController, FocusNode focusNodeName, VoidCallback onFieldSubmitted, ) { @@ -472,9 +495,7 @@ class RecipeCreateScreen extends StatelessWidget { image: state.recipeImage?.path, video_url: state.youtubeLinkController.text.isNotEmpty ? state.youtubeLinkController.text : null, ); - print(recipe.toJson()); - print(recipe.toString()); - print(recipe); + print(jsonDecode(jsonEncode(recipe))); return recipe; } } diff --git a/lib/features/recipes/presentation/pages/recipe_edit_screen.dart b/lib/features/recipes/presentation/pages/recipe_edit_screen.dart index aa93f72f..584a8e79 100644 --- a/lib/features/recipes/presentation/pages/recipe_edit_screen.dart +++ b/lib/features/recipes/presentation/pages/recipe_edit_screen.dart @@ -59,8 +59,29 @@ class RecipeEditScreen extends StatelessWidget { List _options = state.autocompleteList.map((Product item) => item.name).toList(); return Scaffold( appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, + actions: [ + InkWell( + borderRadius: BorderRadius.circular(16), + child: Ink( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 4), + Text( + state.titleController.text, + style: TextStyle( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.w400, + height: 1, + ), + ), + ], + ), + ), + ), + ], ), backgroundColor: Color.fromARGB(255, 240, 242, 245), resizeToAvoidBottomInset: true, @@ -155,7 +176,7 @@ class RecipeEditScreen extends StatelessWidget { optionsBuilder: _buildOptions(_options), fieldViewBuilder: ( BuildContext context, - productEditingController, + TextEditingController productEditingController, FocusNode focusNodeName, VoidCallback onFieldSubmitted, ) { @@ -304,7 +325,7 @@ class RecipeEditScreen extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), backgroundColor: appTheme.blueA400, - onPressed: () => context.read().publishRecipe(createRecipeFromState(state)), + onPressed: () => context.read().editRecipe(createRecipeFromState(state), recipeID), label: Text( 'Опубликовать', style: theme.textTheme.titleSmall, diff --git a/lib/features/recipes/reporitories/recipe_repository.dart b/lib/features/recipes/reporitories/recipe_repository.dart index e6d67b9f..8d2bc57b 100644 --- a/lib/features/recipes/reporitories/recipe_repository.dart +++ b/lib/features/recipes/reporitories/recipe_repository.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:eatvio_app/features/recipes/models/recipe_model.dart'; import 'package:eatvio_app/features/recipes/services/recipe_service.dart'; import 'package:eatvio_app/features/diary/models/product.dart'; @@ -17,7 +19,15 @@ class RecipeRepository { Future publishRecipe(RecipeModel recipe) async { try { - return await recipeService.publishRecipe(recipe); + return await recipeService.publishRecipe(jsonDecode(jsonEncode(recipe))); + } catch (e) { + rethrow; + } + } + + Future editRecipe(RecipeModel recipe, String id) async { + try { + return await recipeService.editRecipe(jsonDecode(jsonEncode(recipe)), id); } catch (e) { rethrow; } diff --git a/lib/features/recipes/services/recipe_service.dart b/lib/features/recipes/services/recipe_service.dart index 6d73ccc6..d68a4e33 100644 --- a/lib/features/recipes/services/recipe_service.dart +++ b/lib/features/recipes/services/recipe_service.dart @@ -16,5 +16,8 @@ abstract class RecipeService { Future>> getInputProduct(@Query('name') String name); @POST('/api/recipes/create') - Future publishRecipe(RecipeModel recipe); + Future publishRecipe(@Part() Map recipe); + + @POST('/api/recipes/update/{id}') + Future editRecipe(@Part() Map recipe, String id); } diff --git a/lib/features/recipes/services/recipe_service.g.dart b/lib/features/recipes/services/recipe_service.g.dart index bb170928..de85e17d 100644 --- a/lib/features/recipes/services/recipe_service.g.dart +++ b/lib/features/recipes/services/recipe_service.g.dart @@ -77,11 +77,11 @@ class _RecipeService implements RecipeService { } @override - Future publishRecipe(RecipeModel recipe) async { + Future publishRecipe(Map recipe) async { final _extra = {}; final queryParameters = {}; final _headers = {}; - const Map? _data = null; + final _data = FormData.fromMap(recipe); final _result = await _dio .fetch>(_setStreamType(Options( method: 'POST', @@ -103,6 +103,36 @@ class _RecipeService implements RecipeService { return _value; } + @override + Future editRecipe( + Map recipe, + String id, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = FormData.fromMap(recipe); + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/api/recipes/update/{id}', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = RecipeModel.fromJson(_result.data!); + return _value; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes ||