diff --git a/.metadata b/.metadata
new file mode 100644
index 00000000..aa90aa80
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "ba393198430278b6595976de84fe170f553cc728"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: android
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: ios
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: linux
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: macos
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: web
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+ - platform: windows
+ create_revision: ba393198430278b6595976de84fe170f553cc728
+ base_revision: ba393198430278b6595976de84fe170f553cc728
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/android/app/src/main/kotlin/com/eatvioapp/eatvio_app/MainActivity.kt b/android/app/src/main/kotlin/com/eatvioapp/eatvio_app/MainActivity.kt
new file mode 100644
index 00000000..f3e4d58d
--- /dev/null
+++ b/android/app/src/main/kotlin/com/eatvioapp/eatvio_app/MainActivity.kt
@@ -0,0 +1,5 @@
+package com.eatvioapp.eatvio_app
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000..06952be7
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/eatvio_app_android.iml b/android/eatvio_app_android.iml
new file mode 100644
index 00000000..18999696
--- /dev/null
+++ b/android/eatvio_app_android.iml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eatvio_app.iml b/eatvio_app.iml
new file mode 100644
index 00000000..f66303d5
--- /dev/null
+++ b/eatvio_app.iml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..86a7c3b1
--- /dev/null
+++ b/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart
index 569164b1..be0a7a9d 100644
--- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart
+++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart
@@ -18,8 +18,7 @@ class DiaryEditBloc extends Bloc {
on(_onInitialize);
on(_changeSatiety); // пользователь нажимает на шкалу сытости
on(_changeMood); // пользователь нажимает на шкалу настроения
- on(
- _changeMealTime); // пользователь изменяет время приема пиши
+ on(_changeMealTime); // пользовательяет времяа пиши
on(_changeMeal);
on(_changeWakeup); // пользователь выбирает время пробуждения
on(_changeRetire); // пользователь выбирает время отхода ко сну
@@ -32,6 +31,10 @@ class DiaryEditBloc extends Bloc {
on(_addComment); //пользователь нажимает "Добавить комментарий"
on(
_inputProduct); //пользователь нажимает "Добавить комментарий"
+ on(_finishDay); //пользователь нажимает "Добавить комментарий"
+ on(_sendModeration);
+ on(
+ reloadScreen); //пользователь нажимает "Добавить комментарий"
}
Future _onInitialize(
@@ -40,7 +43,7 @@ class DiaryEditBloc extends Bloc {
) async {
try {
final token =
- "laravel_sanctum_1lPFtd9tpGmHYS243C4K7YF8BrVhxxgXm8cTmjuZda1da694";
+ "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1neAggmpR2TidVGDPN34fa201a";
final response = await http.get(
Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/index'),
headers: {
@@ -48,20 +51,20 @@ class DiaryEditBloc extends Bloc {
'Authorization': 'Bearer $token',
},
);
-
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
if (data is Map && data.containsKey('id')) {
final int diaryId = data['id'];
try {
final response = await http.get(
- Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/show/$diaryId'),
+ Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/$diaryId/show/'),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
},
);
final diary = jsonDecode(response.body)['diary'];
+ print("Screen load success");
if (diary is Map) {
final String diaryDate =
diary['date'] ?? DateTime.now().toString();
@@ -73,13 +76,20 @@ class DiaryEditBloc extends Bloc {
currentMeal: currentState.currentMeal,
wakeupExpanded: currentState.wakeupExpanded,
moodExpanded: currentState.moodExpanded,
+ moderationExpanded: currentState.moderationExpanded,
token: currentState.token,
meals: currentState.meals,
+ portions: currentState.portions,
+ photos: currentState.photos,
wakeupController: currentState.wakeupController,
retireController: currentState.retireController,
commentController: currentState.commentController,
mealTimeController: currentState.mealTimeController,
productNameController: currentState.productNameController,
+ caloriesController: currentState.caloriesController,
+ proteinsController: currentState.proteinsController,
+ fatsController: currentState.fatsController,
+ carbsController: currentState.carbsController,
selectedSatiety: currentState.selectedSatiety,
selectedMood: currentState.selectedMood,
diaryDate: currentState.diaryDate,
@@ -95,9 +105,11 @@ class DiaryEditBloc extends Bloc {
id: 1, title: "Прием пищи 1", isSelected: true),
wakeupExpanded: true,
moodExpanded: true,
+ moderationExpanded: false,
token: token,
meals: diary['meals'],
portions: diary['meals'][0]['portions'],
+ photos: diary['meals'][0]['photos'],
wakeupController: toTime(diary['wakeup'] ?? "09:00"),
retireController: toTime(diary['retire'] ?? "23:00"),
mealTimeController:
@@ -108,6 +120,10 @@ class DiaryEditBloc extends Bloc {
TextEditingController(text: diary['comment']),
productNameController: TextEditingController(),
productQuantityController: TextEditingController(),
+ caloriesController: TextEditingController(),
+ proteinsController: TextEditingController(),
+ fatsController: TextEditingController(),
+ carbsController: TextEditingController(),
diaryId: diaryId,
diaryDate: diaryDate,
autocompleteList: [],
@@ -135,6 +151,90 @@ class DiaryEditBloc extends Bloc {
}
} catch (e) {
// Ошибка при получении данных дневника
+ emit(DiaryEditErrorState('Ошибка при получении данных о дневнике: $e'));
+ }
+ }
+
+ reloadScreen(DiaryEditEvent event, Emitter emit) async {
+ print("Reloading...");
+ try {
+ final token =
+ "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1neAggmpR2TidVGDPN34fa201a";
+
+ final response = await http.get(
+ Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/index'),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ );
+
+ if (response.statusCode == 200) {
+ final data = jsonDecode(response.body);
+ if (data is Map && data.containsKey('id')) {
+ final int diaryId = data['id'];
+
+ final diaryResponse = await http.get(
+ Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/$diaryId/show/'),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ );
+
+ final diary = jsonDecode(diaryResponse.body)['diary'];
+
+ if (diary is Map) {
+ final String diaryDate = diary['date'] ?? DateTime.now().toString();
+ // Продолжайте обработку данных дневника
+ // Если текущее состояние - начальное, создаем новое загруженное состояние
+ try {
+ await Future(() => emit(DiaryEditLoadedState(
+ currentMeal: SelectionPopupModel(
+ id: 1, title: "Прием пищи 1", isSelected: true),
+ wakeupExpanded: true,
+ moodExpanded: true,
+ moderationExpanded: false,
+ token: token,
+ meals: diary['meals'],
+ portions: diary['meals'][0]['portions'],
+ photos: diary['meals'][0]['photos'],
+ wakeupController: toTime(diary['wakeup'] ?? "09:00"),
+ retireController: toTime(diary['retire'] ?? "23:00"),
+ mealTimeController:
+ toTime(diary['meals'][0]['time'] ?? "10:00"),
+ selectedSatiety: diary['meals'][0]['satiety'],
+ selectedMood: diary['meals'][0]['mood'],
+ commentController:
+ TextEditingController(text: diary['comment']),
+ productNameController: TextEditingController(),
+ productQuantityController: TextEditingController(),
+ caloriesController: TextEditingController(),
+ proteinsController: TextEditingController(),
+ fatsController: TextEditingController(),
+ carbsController: TextEditingController(),
+ diaryId: diaryId,
+ diaryDate: diaryDate,
+ autocompleteList: [],
+ diaryEditModelObj: state.diaryEditModelObj
+ ?.copyWith(mealList: fillMealList()))));
+
+ print("Updated");
+ } catch (e) {
+ print("Ошибка при создании нового состояния $e");
+ }
+ } else {
+ emit(DiaryEditErrorState(
+ 'Ошибка при декодировании данных дневника'));
+ }
+ } else {
+ emit(
+ DiaryEditErrorState('Некоторые необходимые данные отсутствуют.'));
+ }
+ } else {
+ emit(DiaryEditErrorState('Ошибка сервера: ${response.statusCode}'));
+ }
+ } catch (e) {
emit(DiaryEditErrorState('Ошибка при получении данных дневника: $e'));
}
}
@@ -229,18 +329,31 @@ class DiaryEditBloc extends Bloc {
WakeupEvent event, Emitter emit) async {
if (state is DiaryEditLoadedState) {
var currentState = state as DiaryEditLoadedState;
- var updatedState = //инициализируем новое состояние
- currentState.copyWith(wakeupController: event.selectedTime);
-
- // Отправляем данные по HTTP маршруту и ждем ответ
var response = await sendWakeupData(
currentState.token, event.selectedTime, currentState.diaryId);
-
if (response.statusCode == 200) {
- //Чекаем статус ответа
- updatedState.wakeupController = event.selectedTime;
+ var updatedState =
+ currentState.copyWith(wakeupController: event.selectedTime);
+ print("Wakeup time changed to ${event.selectedTime}");
emit(updatedState); // Передаем обновленное состояние в emit
- }
+ } else
+ print("Wakeup time change error");
+ }
+ }
+
+ FutureOr _changeRetire(
+ RetireEvent event, Emitter emit) async {
+ if (state is DiaryEditLoadedState) {
+ var currentState = state as DiaryEditLoadedState;
+ var response = await sendRetireData(
+ currentState.token, event.selectedTime, currentState.diaryId);
+ if (response.statusCode == 200) {
+ var updatedState =
+ currentState.copyWith(retireController: event.selectedTime);
+ print("Retire time changed to ${event.selectedTime}");
+ emit(updatedState); // Передаем обновленное состояние в emit
+ } else
+ print("Retire time change error");
}
}
@@ -254,39 +367,20 @@ class DiaryEditBloc extends Bloc {
final wakeupString =
formatter.format(DateTime(2022, 1, 1, wakeup.hour, wakeup.minute));
final Map credentials = {
- 'wakeup': wakeupString,
+ 'wakeUp': wakeupString,
};
- var response = await http.post(
- Uri.parse(url),
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': 'Bearer $token',
- },
- body: json.encode(credentials),
- encoding: utf8,
- );
- print(response.body);
+
+ var response = await http.post(Uri.parse(url),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ body: json.encode(credentials),
+ encoding: utf8);
+
return response;
}
- FutureOr _changeRetire(
- RetireEvent event, Emitter emit) async {
- if (state is DiaryEditLoadedState) {
- var currentState = state as DiaryEditLoadedState;
- var updatedState =
- currentState.copyWith(retireController: event.selectedTime);
-
- // Отправляем данные по HTTP маршруту и ждем ответ
- var response = await sendRetireData(
- currentState.token, event.selectedTime, currentState.diaryId);
-
- if (response.statusCode == 200) {
- updatedState.retireController = event.selectedTime;
- emit(updatedState); // Передаем обновленное состояние в emit
- }
- }
- }
-
Future sendRetireData(
String? token, TimeOfDay retire, int diaryID) async {
String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/retire/fill';
@@ -342,18 +436,23 @@ class DiaryEditBloc extends Bloc {
return response;
}
- FutureOr _changeMeal(ChangeMeal event, Emitter emit) {
+ FutureOr _changeMeal(
+ ChangeMeal event, Emitter emit) async {
if (state is DiaryEditLoadedState) {
var currentState = state as DiaryEditLoadedState;
+ final meal = currentState.meals?.firstWhere(
+ (meal) => meal['type'] == event.value.id,
+ orElse: () => null);
+
int? id = event.value.id;
- emit(currentState.copyWith(
+ DiaryEditLoadedState updatedState = currentState.copyWith(
currentMeal: event.value,
- portions: event.meals?[event.value.id ?? 0]['portions'],
- mealTimeController:
- toTime(event.meals?[event.value.id ?? 0]['time'] ?? "1$id:00"),
- selectedMood: event.meals?[event.value.id ?? 0]['mood'],
- selectedSatiety: event.meals?[event.value.id ?? 0]['satiety']));
- currentState.currentMeal = event.value;
+ portions: meal['portions'],
+ photos: meal['photos'],
+ mealTimeController: toTime(meal['time'] ?? "1$id:00"),
+ selectedMood: meal['mood'],
+ selectedSatiety: meal['satiety']);
+ emit(updatedState);
}
}
@@ -382,64 +481,60 @@ class DiaryEditBloc extends Bloc {
if (state is DiaryEditLoadedState) {
var currentState = state as DiaryEditLoadedState;
- int? id = currentState.currentMeal?.id;
-
- // Отправляем данные по HTTP маршруту и ждем ответ
var response = await sendPortionData(
- currentState.token,
- currentState.productNameController?.text,
- 'pcs',
- int.parse(currentState.productQuantityController!.text),
- currentState.currentMeal!.id,
- currentState.diaryId);
+ currentState.token,
+ currentState.productNameController?.text,
+ 'pcs',
+ int.parse(currentState.productQuantityController!.text),
+ currentState.currentMeal!.id,
+ currentState.diaryId,
+ );
+
+ print(response.body);
+
if (response.statusCode == 200) {
- var updatedState = currentState.copyWith(
- portions: currentState.meals?[id ?? 0]['portions'],
- );
- emit(updatedState); // Передаем обновленное состояние в emit
+ await reloadScreen(event, emit);
+ } else {
+ print(
+ 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}');
}
}
}
- Future sendPortionData(
- String? token,
- String? name,
- String portion,
- int? quantity,
- int? mealID,
- int diaryID,
- ) async {
- String url = dotenv.env['SERVER_ROOT']! +
- '/diary/$diaryID/meal/$mealID/portions/create';
+ FutureOr sendPortionData(String? token, String? name,
+ String portion, int? quantity, int? mealID, int diaryID) async {
+ String url =
+ '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/create';
+
final Map credentials = {
'product_name': name,
'portion': portion,
'quantity': quantity,
};
- print(credentials);
- var response = await http.post(Uri.parse(url),
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': 'Bearer $token',
- },
- body: json.encode(credentials),
- encoding: utf8);
- print(response.body);
+ var response = await http.post(
+ Uri.parse(url),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ body: json.encode(credentials),
+ encoding: utf8,
+ );
+
return response;
}
- FutureOr _inputProduct(
+ Future _inputProduct(
ProductInput event, Emitter emit) async {
if (state is DiaryEditLoadedState) {
var currentState = state as DiaryEditLoadedState;
String? token = currentState.token;
- final Map credentials = {
- 'name': event.input,
- };
- final uri = Uri.parse(dotenv.env['SERVER_ROOT']! +
- '/diary/product_nutritional_values/filter?' +
- Uri(queryParameters: credentials).query);
+
+ final Map credentials = {'name': event.input};
+ final uri = Uri.parse(
+ '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/filter?${Uri(queryParameters: credentials).query}');
+
final response = await http.get(
uri,
headers: {
@@ -447,29 +542,210 @@ class DiaryEditBloc extends Bloc {
'Authorization': 'Bearer $token',
},
);
+
final productNutritionalValues =
jsonDecode(response.body)['product_nutritional_value'];
- if (productNutritionalValues is List) {
- var updatedState = currentState.copyWith(
- productNameController: TextEditingController(text: event.input),
- autocompleteList: productNutritionalValues
- .map((product) => product['name'])
- .toList());
- emit(updatedState);
- } else {
- print("Ошибка в декодировании ответа из API");
+ if (productNutritionalValues is List) {
+ // Create a new controller with the input text and update the autocomplete list
+ var updatedState = currentState.copyWith(
+ productNameController: TextEditingController(text: event.input),
+ autocompleteList: productNutritionalValues
+ .map((product) => product['name'])
+ .toList(),
+ );
+ if (event.input.length > 3) {
+ updatedState = updatedState.copyWith(moderationExpanded: true);
+ } else {
+ updatedState = updatedState.copyWith(moderationExpanded: false);
+ }
+
+ emit(updatedState); // Emit the updated state
}
}
}
- FutureOr _removePortion(
- RemovePortionEvent event, Emitter emit) {}
+ Future _removePortion(
+ RemovePortionEvent event, Emitter emit) async {
+ if (state is DiaryEditLoadedState) {
+ var currentState = state as DiaryEditLoadedState;
- Future> _uploadImages(
+ int? mealId =
+ currentState.currentMeal?.id; // Rename id to mealId for clarity
+
+ var response = await sendRemovePortion(
+ currentState.token,
+ event.portionId,
+ mealId,
+ currentState.diaryId,
+ );
+
+ if (response.statusCode == 204) {
+ await reloadScreen(event, emit);
+ } else {
+ print(
+ 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}');
+ }
+ }
+ }
+
+ Future sendRemovePortion(
+ String? token, int? portionID, int? mealID, int diaryID) async {
+ String url =
+ '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete';
+
+ var response = await http.delete(
+ Uri.parse(url),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ encoding: utf8,
+ );
+
+ return response;
+ }
+
+ Future _finishDay(FinishDay event, Emitter emit) async {
+ if (state is DiaryEditLoadedState) {
+ var currentState = state as DiaryEditLoadedState;
+
+ var response = await sendFinishDay(
+ currentState.token,
+ currentState.diaryId,
+ currentState.wakeupController,
+ currentState.retireController,
+ currentState.commentController?.text,
+ );
+
+ if (response.statusCode == 200) {
+ print("finished");
+ }
+ }
+ }
+
+ Future sendFinishDay(String? token, int diaryID,
+ TimeOfDay? wakeup, TimeOfDay? retire, String? comment) async {
+ final formatter = DateFormat('HH:mm');
+ final wakeupString =
+ formatter.format(DateTime(2022, 1, 1, wakeup!.hour, wakeup.minute));
+ final retireString =
+ formatter.format(DateTime(2022, 1, 1, retire!.hour, retire.minute));
+
+ final Map credentials = {
+ 'wakeup': wakeupString,
+ 'retire': retireString,
+ 'comment': comment ?? " ",
+ };
+
+ String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/finishDay';
+
+ var response = await http.post(
+ Uri.parse(url),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ body: json.encode(credentials),
+ encoding: utf8,
+ );
+
+ return response;
+ }
+
+ Future _uploadImages(
UploadImages event, Emitter emit) async {
- String imageUrl = await uploadImageToServer(event.image.path);
- print(imageUrl);
+ if (state is DiaryEditLoadedState) {
+ var currentState = state as DiaryEditLoadedState;
+
+ await uploadImageToServer(event.image.path, currentState.diaryId,
+ currentState.currentMeal!.id!, currentState.token);
+ await reloadScreen(event, emit);
+ }
+ }
+
+ Future uploadImageToServer(
+ String imagePath, int diaryID, int mealId, String? token) async {
+ String url =
+ '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload';
+
+ var request = http.MultipartRequest('POST', Uri.parse(url));
+ request.headers['Authorization'] = 'Bearer $token';
+
+ request.files.add(await http.MultipartFile.fromPath('photo', imagePath));
+
+ var client = http.Client();
+ var streamedResponse = await client.send(request);
+
+ if (streamedResponse.statusCode == 200) {
+ var response = await http.Response.fromStream(streamedResponse);
+ var imageUrl = response.body;
+ print('Image successfully uploaded');
+ return imageUrl;
+ } else {
+ throw Exception(
+ 'Failed to upload image. Status code: ${streamedResponse.statusCode}}');
+ }
+ }
+
+ FutureOr _sendModeration(
+ SendModeration event, Emitter emit) async {
+ if (state is DiaryEditLoadedState) {
+ var currentState = state as DiaryEditLoadedState;
+ final response = await _sendModerationData(
+ event.name,
+ event.energyOn100gr,
+ event.proteinsOn100gr,
+ event.fatsOn100gr,
+ event.carbohydratesOn100gr,
+ currentState.token,
+ );
+
+ if (response.statusCode == 200)
+ print("Moderation success");
+ else
+ print("Moderation error");
+ }
+ }
+
+ Future _sendModerationData(
+ String name,
+ String energy_on_100gr,
+ String proteins_on_100gr,
+ String fats_on_100gr,
+ String carbohydrates_on_100gr,
+ String? token) async {
+ final Uri url = Uri.parse(
+ '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/sendToModeration');
+ final Uri serverURL = Uri.parse('${dotenv.env['SERVER_ROOT']!}');
+ String host = serverURL.host;
+ final Map credentials = {
+ 'name': name,
+ 'energy_on_100gr': energy_on_100gr,
+ 'proteins_on_100gr': proteins_on_100gr,
+ 'fats_on_100gr': fats_on_100gr,
+ 'carbohydrates_on_100gr': carbohydrates_on_100gr,
+ };
+
+ var headers = {
+ //'Content-Length': bodyBytes,
+ 'Authorization': 'Bearer $token',
+ 'Host': host,
+ };
+
+ var response = await http.post(
+ url,
+ headers: headers,
+ body: credentials,
+ encoding: utf8,
+ );
+
+ if (response.statusCode == 200) {
+ return response;
+ } else {
+ throw Exception(
+ 'Failed to send a product for moderation ${response.statusCode}');
+ }
}
FutureOr _addComment(
@@ -508,24 +784,6 @@ class DiaryEditBloc extends Bloc {
return response;
}
- Future uploadImageToServer(String imagePath) async {
- var request = http.MultipartRequest(
- 'POST',
- Uri.parse(
- 'http://your-api-url.com/upload'), // Замените на ваш маршрут API
- );
-
- request.files.add(await http.MultipartFile.fromPath('image', imagePath));
-
- var response = await request.send();
- if (response.statusCode == 200) {
- var responseData = await response.stream.bytesToString();
- return responseData;
- } else {
- throw Exception('Ошибка при загрузке изображения');
- }
- }
-
TimeOfDay toTime(String timeStr) {
List timeParts = timeStr.split(":");
int hour = int.parse(timeParts[0]);
diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart
index ed6f8e2f..6ab61626 100644
--- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart
+++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart
@@ -113,3 +113,34 @@ class ChangeMeal extends DiaryEditEvent {
@override
List