From 72c0d015b30c2b1f755153f4f4e481607c229141 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 27 Dec 2023 17:14:20 +0300 Subject: [PATCH] Finished client-side calidation --- lib/data/apiClient/api_client.dart | 2 +- .../user_registration_model.dart | 3 - lib/localization/app_localization.dart | 10 ++- lib/localization/ru/ru_translations.dart | 14 +++- .../models/additional_information_model.dart | 3 +- .../allergies_screen/allergies_screen.dart | 2 +- .../models/allergies_model.dart | 3 +- .../blood_pressure_screen.dart | 74 +++++++++++++----- .../body_circumferences_screen.dart | 77 +++++++++++++++---- .../models/body_circumferences_model.dart | 3 +- .../models/city_of_living_model.dart | 3 +- .../models/date_of_birth_model.dart | 3 +- .../models/favorite_foods_model.dart | 3 +- .../height_screen/height_screen.dart | 2 +- lib/presentation/name_screen/name_screen.dart | 70 ++++++++++++++--- 15 files changed, 208 insertions(+), 64 deletions(-) diff --git a/lib/data/apiClient/api_client.dart b/lib/data/apiClient/api_client.dart index cd1bf912..d629b311 100644 --- a/lib/data/apiClient/api_client.dart +++ b/lib/data/apiClient/api_client.dart @@ -1,3 +1,3 @@ -import 'package:eatvio_app/core/app_export.dart'; +//import 'package:eatvio_app/core/app_export.dart'; class ApiClient {} diff --git a/lib/data/models/userRegistrationModel/user_registration_model.dart b/lib/data/models/userRegistrationModel/user_registration_model.dart index 46b23698..0001f9ec 100644 --- a/lib/data/models/userRegistrationModel/user_registration_model.dart +++ b/lib/data/models/userRegistrationModel/user_registration_model.dart @@ -1,6 +1,3 @@ -import 'dart:convert'; -import 'package:http/http.dart' as http; - class UserRegistrationSheet { String name; String firstName; diff --git a/lib/localization/app_localization.dart b/lib/localization/app_localization.dart index d711fa4b..51b4b1aa 100644 --- a/lib/localization/app_localization.dart +++ b/lib/localization/app_localization.dart @@ -1,5 +1,5 @@ import 'ru/ru_translations.dart'; -import 'en_us/en_us_translations.dart'; +//import 'en_us/en_us_translations.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/cupertino.dart'; import '../core/app_export.dart'; @@ -9,10 +9,12 @@ class AppLocalization { Locale locale; - static final Map> _localizedValues = {'ru': ru}; - static final Map> __localizedValues = { - 'en': enUs + static final Map> _localizedValues = { + 'ru': ru, }; + /*static final Map> __localizedValues = { + 'en': enUs + };*/ static AppLocalization of() { return Localizations.of( diff --git a/lib/localization/ru/ru_translations.dart b/lib/localization/ru/ru_translations.dart index dc434c77..3d328fe0 100644 --- a/lib/localization/ru/ru_translations.dart +++ b/lib/localization/ru/ru_translations.dart @@ -18,7 +18,7 @@ final Map ru = { "place_of_living": "Место проживания", // body_circumferences Screen - "hip_circumference": "Обхват бедр", "chest_circumference": "Обхват груди", + "hip_circumference": "Обхват бедер", "chest_circumference": "Обхват груди", "waist_circumference": "Обхват талии", "initial_measurements": "Первичные замеры", @@ -87,4 +87,16 @@ final Map ru = { "password_confirmation_mismatch": "Пароли не совпадают", // Name + "first_name_empty": "Имя обязательно для заполнения", + "first_name_short": "В имени должен быть минимум 1 символ", + "last_name_empty": "Фамилия обязательна для заполнения", + "last_name_short": "В фамилии должен быть минимум 6 символов", + + // Body Circumference + "circumference_empty": "Все замеры обязательны к заполнению", + "circumference_is_not_a_number": "Все замеры должны быть числами", + + // Body Circumference + "pressure_empty": "Все показатели давления обязательны к заполнению", + "pressure_is_not_a_number": "Все показатели давления должны быть числами", }; diff --git a/lib/presentation/additional_information_screen/models/additional_information_model.dart b/lib/presentation/additional_information_screen/models/additional_information_model.dart index 3e5243d2..ff001d96 100644 --- a/lib/presentation/additional_information_screen/models/additional_information_model.dart +++ b/lib/presentation/additional_information_screen/models/additional_information_model.dart @@ -11,8 +11,7 @@ class AdditionalInformationModel extends Equatable { AdditionalInformationModel copyWith() { return AdditionalInformationModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, ); } diff --git a/lib/presentation/allergies_screen/allergies_screen.dart b/lib/presentation/allergies_screen/allergies_screen.dart index 219e6f3f..ee78724c 100644 --- a/lib/presentation/allergies_screen/allergies_screen.dart +++ b/lib/presentation/allergies_screen/allergies_screen.dart @@ -50,7 +50,7 @@ class _AllergiesScreenState extends State { child: ClipRRect( borderRadius: BorderRadius.circular(8.h), child: LinearProgressIndicator( - value: 0.62, + value: 0.76, backgroundColor: theme.colorScheme.onPrimary, valueColor: AlwaysStoppedAnimation( appTheme.blueA400)))), diff --git a/lib/presentation/allergies_screen/models/allergies_model.dart b/lib/presentation/allergies_screen/models/allergies_model.dart index 5553fa4e..ebd20063 100644 --- a/lib/presentation/allergies_screen/models/allergies_model.dart +++ b/lib/presentation/allergies_screen/models/allergies_model.dart @@ -11,8 +11,7 @@ class AllergiesModel extends Equatable { AllergiesModel copyWith() { return AllergiesModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, ); } diff --git a/lib/presentation/blood_pressure_screen/blood_pressure_screen.dart b/lib/presentation/blood_pressure_screen/blood_pressure_screen.dart index 0efd74cf..47c83a35 100644 --- a/lib/presentation/blood_pressure_screen/blood_pressure_screen.dart +++ b/lib/presentation/blood_pressure_screen/blood_pressure_screen.dart @@ -57,7 +57,7 @@ class _BloodPressureScreenState extends State { child: ClipRRect( borderRadius: BorderRadius.circular(8.h), child: LinearProgressIndicator( - value: 0.76, + value: 0.62, backgroundColor: theme.colorScheme.onPrimary, valueColor: AlwaysStoppedAnimation( appTheme.blueA400))))), @@ -175,17 +175,44 @@ class _BloodPressureScreenState extends State { left: 16.h, right: 16.h, bottom: 50.v), buttonStyle: CustomButtonStyles.outlinePrimaryTL15, onPressed: () { - UserRegistrationSheet sheet = state - .bloodPressureModelObj!.userRegistrationSheet; - sheet.bloodPressureUp = - state.upPressureController!.text; - sheet.bloodPressureDown = - state.downPressureController!.text; - Navigator.pushNamed( - context, - AppRoutes.favoriteSportsScreen, - arguments: sheet, - ); + List errors = validateFields( + state.upPressureController!.text, + state.downPressureController!.text); + if (errors.isEmpty) { + UserRegistrationSheet sheet = state + .bloodPressureModelObj!.userRegistrationSheet; + sheet.bloodPressureUp = + state.upPressureController!.text; + sheet.bloodPressureDown = + state.downPressureController!.text; + Navigator.pushNamed( + context, + AppRoutes.favoriteSportsScreen, + arguments: sheet, + ); + } else { + String errorMessage = ''; + + for (var error in errors) { + errorMessage += error + '\n\n'; + } + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text('Ошибка'), + content: Text(errorMessage), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text('OK'), + ), + ], + ), + ); + } }); }), BlocBuilder( @@ -196,7 +223,7 @@ class _BloodPressureScreenState extends State { state.bloodPressureModelObj!.userRegistrationSheet; Navigator.pushNamed( context, - AppRoutes.favoriteSportsScreen, + AppRoutes.allergiesScreen, arguments: sheet, ); }, @@ -225,10 +252,21 @@ class _BloodPressureScreenState extends State { NavigatorService.goBack(); } - /// Navigates to the favoriteSportsScreen when the action is triggered. - navigateToSports(BuildContext context) { - NavigatorService.pushNamed( - AppRoutes.favoriteSportsScreen, - ); + List validateFields( + String bloodPressureUp, + String bloodPressureDown, + ) { + List errors = []; + + if (bloodPressureUp.isEmpty | bloodPressureDown.isEmpty) { + errors.add('pressure_empty'.tr); + } + + if (![bloodPressureUp, bloodPressureDown] + .every((pressure) => int.tryParse(pressure) != null)) { + errors.add('pressure_is_not_a_number'.tr); + } + + return errors; } } diff --git a/lib/presentation/body_circumferences_screen/body_circumferences_screen.dart b/lib/presentation/body_circumferences_screen/body_circumferences_screen.dart index d85d84ad..77f48b43 100644 --- a/lib/presentation/body_circumferences_screen/body_circumferences_screen.dart +++ b/lib/presentation/body_circumferences_screen/body_circumferences_screen.dart @@ -106,20 +106,48 @@ class BodyCircumferencesScreen extends StatelessWidget { left: 16.h, right: 16.h, bottom: 50.v), buttonStyle: CustomButtonStyles.outlinePrimaryTL15, onPressed: () { - UserRegistrationSheet sheet = state - .bodyCircumferencesModelObj! - .userRegistrationSheet; - sheet.chestCircumference = - state.chestCircumferenceController!.text!; - sheet.waistCircumference = - state.waistCircumferenceController!.text!; - sheet.hipCircumference = - state.hipCircumferenceController!.text!; - Navigator.pushNamed( - context, - AppRoutes.weightScreen, - arguments: sheet, - ); + List errors = validateFields( + state.chestCircumferenceController!.text, + state.waistCircumferenceController!.text, + state.hipCircumferenceController!.text); + if (errors.isEmpty) { + UserRegistrationSheet sheet = state + .bodyCircumferencesModelObj! + .userRegistrationSheet; + sheet.chestCircumference = + state.chestCircumferenceController!.text; + sheet.waistCircumference = + state.waistCircumferenceController!.text; + sheet.hipCircumference = + state.hipCircumferenceController!.text; + Navigator.pushNamed( + context, + AppRoutes.weightScreen, + arguments: sheet, + ); + } else { + String errorMessage = ''; + + for (var error in errors) { + errorMessage += error + '\n\n'; + } + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text('Ошибка'), + content: Text(errorMessage), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text('OK'), + ), + ], + ), + ); + } }); }), ])))); @@ -150,4 +178,25 @@ class BodyCircumferencesScreen extends StatelessWidget { AppRoutes.weightScreen, ); } + + List validateFields( + String chestCircumference, + String waistCircumference, + String hipCircumference, + ) { + List errors = []; + + if (chestCircumference.isEmpty | + waistCircumference.isEmpty | + hipCircumference.isEmpty) { + errors.add('circumference_empty'.tr); + } + + if (![chestCircumference, waistCircumference, hipCircumference] + .every((circumference) => int.tryParse(circumference) != null)) { + errors.add('circumference_is_not_a_number'.tr); + } + + return errors; + } } diff --git a/lib/presentation/body_circumferences_screen/models/body_circumferences_model.dart b/lib/presentation/body_circumferences_screen/models/body_circumferences_model.dart index bc684a03..2af76f9d 100644 --- a/lib/presentation/body_circumferences_screen/models/body_circumferences_model.dart +++ b/lib/presentation/body_circumferences_screen/models/body_circumferences_model.dart @@ -11,8 +11,7 @@ class BodyCircumferencesModel extends Equatable { BodyCircumferencesModel copyWith() { return BodyCircumferencesModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, ); } diff --git a/lib/presentation/city_of_living_screen/models/city_of_living_model.dart b/lib/presentation/city_of_living_screen/models/city_of_living_model.dart index 1b32e6e0..048621df 100644 --- a/lib/presentation/city_of_living_screen/models/city_of_living_model.dart +++ b/lib/presentation/city_of_living_screen/models/city_of_living_model.dart @@ -23,8 +23,7 @@ class CityOfLivingModel extends Equatable { List? dropdownItemList1, }) { return CityOfLivingModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, dropdownItemList: dropdownItemList ?? this.dropdownItemList, dropdownItemList1: dropdownItemList1 ?? this.dropdownItemList1, ); diff --git a/lib/presentation/date_of_birth_screen/models/date_of_birth_model.dart b/lib/presentation/date_of_birth_screen/models/date_of_birth_model.dart index 98700d4c..121b10d6 100644 --- a/lib/presentation/date_of_birth_screen/models/date_of_birth_model.dart +++ b/lib/presentation/date_of_birth_screen/models/date_of_birth_model.dart @@ -12,8 +12,7 @@ class DateOfBirthModel extends Equatable { DateOfBirthModel copyWith() { return DateOfBirthModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, ); } diff --git a/lib/presentation/favorite_foods_screen/models/favorite_foods_model.dart b/lib/presentation/favorite_foods_screen/models/favorite_foods_model.dart index 2084cade..3aeeee20 100644 --- a/lib/presentation/favorite_foods_screen/models/favorite_foods_model.dart +++ b/lib/presentation/favorite_foods_screen/models/favorite_foods_model.dart @@ -11,8 +11,7 @@ class FavoriteFoodsModel extends Equatable { FavoriteFoodsModel copyWith() { return FavoriteFoodsModel( - userRegistrationSheet: - userRegistrationSheet ?? this.userRegistrationSheet, + userRegistrationSheet: userRegistrationSheet, ); } diff --git a/lib/presentation/height_screen/height_screen.dart b/lib/presentation/height_screen/height_screen.dart index 6563fcaa..574bf488 100644 --- a/lib/presentation/height_screen/height_screen.dart +++ b/lib/presentation/height_screen/height_screen.dart @@ -98,7 +98,7 @@ class _HeightScreenState extends State { state.heightModelObj!.userRegistrationSheet; Navigator.pushNamed( context, - AppRoutes.allergiesScreen, + AppRoutes.bloodPressureScreen, arguments: sheet, ); }); diff --git a/lib/presentation/name_screen/name_screen.dart b/lib/presentation/name_screen/name_screen.dart index 9d9d132e..cc234a77 100644 --- a/lib/presentation/name_screen/name_screen.dart +++ b/lib/presentation/name_screen/name_screen.dart @@ -83,15 +83,42 @@ class NameScreen extends StatelessWidget { left: 16.h, right: 16.h, bottom: 50.v), buttonStyle: CustomButtonStyles.outlinePrimaryTL15, onPressed: () { - UserRegistrationSheet sheet = - state.nameModelObj!.userRegistrationSheet; - sheet.firstName = state.firstNameController!.text; - sheet.lastName = state.lastNameController!.text; - Navigator.pushNamed( - context, - AppRoutes.genderScreen, - arguments: sheet, - ); + List errors = validateFields( + state.firstNameController!.text, + state.lastNameController!.text); + if (errors.isEmpty) { + UserRegistrationSheet sheet = + state.nameModelObj!.userRegistrationSheet; + sheet.firstName = state.firstNameController!.text; + sheet.lastName = state.lastNameController!.text; + Navigator.pushNamed( + context, + AppRoutes.genderScreen, + arguments: sheet, + ); + } else { + String errorMessage = ''; + + for (var error in errors) { + errorMessage += error + '\n\n'; + } + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text('Ошибка'), + content: Text(errorMessage), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text('OK'), + ), + ], + ), + ); + } }); }), ])))); @@ -115,4 +142,29 @@ class NameScreen extends StatelessWidget { onTapArrowLeft(BuildContext context) { NavigatorService.goBack(); } + + List validateFields( + String firstName, + String lastName, + ) { + List errors = []; + + if (firstName.isEmpty) { + errors.add('first_name_empty'.tr); + } + + if (firstName.length < 1) { + errors.add('first_name_short'.tr); + } + + if (lastName.isEmpty) { + errors.add('last_name_empty'.tr); + } + + if (lastName.length < 1) { + errors.add('last_name_short'.tr); + } + + return errors; + } }