diff --git a/analysis_options.yaml b/analysis_options.yaml
index 7db716b4..a614abae 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,6 +1,5 @@
linter:
rules:
- - require_trailing_commas
analyzer:
exclude:
diff --git a/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
index 04e382a4..0ff207aa 100644
--- a/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/arm64-v8a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Loga
_
]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ¤¤þñÚ2 �ë„ÖØ2^
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ‹Ãú½Ü2 �ë„ÖØ2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build.json ¤¤þñÚ2§ ‡ë„ÖØ2c
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build.json ‹Ãú½Ü2§ ‡ë„ÖØ2c
a
-_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build_mini.json ¤¤þñÚ2² ‰ë„ÖØ2P
+_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/android_gradle_build_mini.json ‹Ãú½Ü2² ‰ë„ÖØ2P
N
-L/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja ¤¤þñÚ2œÃ çê„ÖØ2T
+L/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja ŒÃú½Ü2œÃ çê„ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja.txt ¤¤þñÚ2Y
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build.ninja.txt ŒÃú½Ü2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build_file_index.txt ¤¤þñÚ2
P ‰ë„ÖØ2Z
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/build_file_index.txt ŒÃú½Ü2
P ‰ë„ÖØ2Z
X
-V/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json ¤¤þñÚ2^
+V/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json ŒÃú½Ü2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json.bin ¤¤þñÚ2 d
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/compile_commands.json.bin ŒÃú½Ü2 d
b
-`/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/metadata_generation_command.txt ¤¤þñÚ2
+`/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/metadata_generation_command.txt ŒÃú½Ü2
‚ ‰ë„ÖØ2W
U
-S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/prefab_config.json ¤¤þñÚ2
( ‰ë„ÖØ2\
+S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/prefab_config.json ŒÃú½Ü2
( ‰ë„ÖØ2\
Z
-X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/symbol_folder_index.txt ¤¤þñÚ2
O ‰ë„ÖØ2T
+X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/arm64-v8a/symbol_folder_index.txt ŒÃú½Ü2
O ‰ë„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ¤¤þñÚ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ŒÃú½Ü2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
index 997c9dcb..7f853cb6 100644
--- a/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Logc
a
_/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ѤþñÚ2 ’ò„ÖØ2`
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint åÃú½Ü2 ’ò„ÖØ2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build.json ѤþñÚ2« ”ò„ÖØ2e
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build.json åÃú½Ü2« ”ò„ÖØ2e
c
-a/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build_mini.json ѤþñÚ2¶ –ò„ÖØ2R
+a/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/android_gradle_build_mini.json åÃú½Ü2¶ –ò„ÖØ2R
P
-N/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja ѤþñÚ2¨Ã þñ„ÖØ2V
+N/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja åÃú½Ü2¨Ã þñ„ÖØ2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja.txt ѤþñÚ2[
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build.ninja.txt åÃú½Ü2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build_file_index.txt ѤþñÚ2
P –ò„ÖØ2\
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/build_file_index.txt åÃú½Ü2
P –ò„ÖØ2\
Z
-X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json ѤþñÚ2`
+X/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json åÃú½Ü2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json.bin ѤþñÚ2 f
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/compile_commands.json.bin åÃú½Ü2 f
d
-b/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/metadata_generation_command.txt ѤþñÚ2
+b/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/metadata_generation_command.txt åÃú½Ü2
Œ –ò„ÖØ2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/prefab_config.json ѤþñÚ2
( –ò„ÖØ2^
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/prefab_config.json åÃú½Ü2
( –ò„ÖØ2^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/symbol_folder_index.txt ѤþñÚ2
Q –ò„ÖØ2T
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/armeabi-v7a/symbol_folder_index.txt åÃú½Ü2
Q –ò„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ѤþñÚ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt åÃú½Ü2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
index 328a1cc5..23292523 100644
--- a/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/x86/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log[
Y
W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ߤþñÚ2 Üû„ÖØ2X
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint öÃú½Ü2 Üû„ÖØ2X
V
-T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build.json ߤþñÚ2› Ýû„ÖØ2]
+T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build.json öÃú½Ü2› Ýû„ÖØ2]
[
-Y/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build_mini.json ߤþñÚ2¦ Þû„ÖØ2J
+Y/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/android_gradle_build_mini.json öÃú½Ü2¦ Þû„ÖØ2J
H
-F/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja ߤþñÚ2øÂ Ïû„ÖØ2N
+F/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja öÃú½Ü2øÂ Ïû„ÖØ2N
L
-J/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja.txt ߤþñÚ2S
+J/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build.ninja.txt öÃú½Ü2S
Q
-O/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build_file_index.txt ߤþñÚ2
P ßû„ÖØ2T
+O/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/build_file_index.txt öÃú½Ü2
P ßû„ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json ߤþñÚ2X
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json öÃú½Ü2X
V
-T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json.bin ߤþñÚ2 ^
+T/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/compile_commands.json.bin öÃú½Ü2 ^
\
-Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/metadata_generation_command.txt ߤþñÚ2
+Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/metadata_generation_command.txt öÃú½Ü2
ä Þû„ÖØ2Q
O
-M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/prefab_config.json ߤþñÚ2
( Þû„ÖØ2V
+M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/prefab_config.json öÃú½Ü2
( Þû„ÖØ2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/symbol_folder_index.txt ߤþñÚ2
I ßû„ÖØ2T
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86/symbol_folder_index.txt öÃú½Ü2
I ßû„ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ߤþñÚ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ÷Ãú½Ü2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
index d02753d8..3a01cb9a 100644
--- a/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/4y1z256o/x86_64/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log^
\
Z/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint é¤þñÚ2 Î�…ÖØ2[
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ‰Äú½Ü2 Î�…ÖØ2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build.json é¤þñÚ2¡ Ð�…ÖØ2`
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build.json ‰Äú½Ü2¡ Ð�…ÖØ2`
^
-\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build_mini.json é¤þñÚ2¬ Ò�…ÖØ2M
+\/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/android_gradle_build_mini.json ‰Äú½Ü2¬ Ò�…ÖØ2M
K
-I/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja é¤þñÚ2ŠÃ »�…ÖØ2Q
+I/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja ‰Äú½Ü2ŠÃ »�…ÖØ2Q
O
-M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja.txt é¤þñÚ2V
+M/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build.ninja.txt ‰Äú½Ü2V
T
-R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build_file_index.txt é¤þñÚ2
P Ô�…ÖØ2W
+R/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/build_file_index.txt ‰Äú½Ü2
P Ô�…ÖØ2W
U
-S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json é¤þñÚ2[
+S/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json ‰Äú½Ü2[
Y
-W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json.bin é¤þñÚ2 a
+W/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/compile_commands.json.bin ‰Äú½Ü2 a
_
-]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/metadata_generation_command.txt ê¤þñÚ2
+]/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/metadata_generation_command.txt ‰Äú½Ü2
ó Ó�…ÖØ2T
R
-P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/prefab_config.json ê¤þñÚ2
( Ó�…ÖØ2Y
+P/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/prefab_config.json ‰Äú½Ü2
( Ó�…ÖØ2Y
W
-U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/symbol_folder_index.txt ê¤þñÚ2
L Ó�…ÖØ2T
+U/Users/alex/eatvio_app/android/app/.cxx/Debug/4y1z256o/x86_64/symbol_folder_index.txt ‰Äú½Ü2
L Ó�…ÖØ2T
R
-P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ê¤þñÚ2
¤ ÑÚÏ2
\ No newline at end of file
+P/Users/alex/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt ‰Äú½Ü2
¤ ÑÚÏ2
\ No newline at end of file
diff --git a/assets/icons/mood_1.svg b/assets/icons/mood_1.svg
new file mode 100644
index 00000000..e3f93b4f
--- /dev/null
+++ b/assets/icons/mood_1.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/icons/mood_2.svg b/assets/icons/mood_2.svg
new file mode 100644
index 00000000..48bcdb0f
--- /dev/null
+++ b/assets/icons/mood_2.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/icons/retire.svg b/assets/icons/retire.svg
new file mode 100644
index 00000000..bde7d06a
--- /dev/null
+++ b/assets/icons/retire.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/wakeup.svg b/assets/icons/wakeup.svg
new file mode 100644
index 00000000..a0bd91c0
--- /dev/null
+++ b/assets/icons/wakeup.svg
@@ -0,0 +1,10 @@
+
diff --git a/lib/core/widgets/custom_search_bar.dart b/lib/core/widgets/custom_search_bar.dart
index 94b3c5c4..dac1e8d7 100644
--- a/lib/core/widgets/custom_search_bar.dart
+++ b/lib/core/widgets/custom_search_bar.dart
@@ -16,6 +16,7 @@ class CustomSearchBar extends StatelessWidget {
height: 40,
width: width ?? MediaQuery.of(context).size.width - 84,
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
controller: searchController,
autofocus: false,
style: TextStyle(
diff --git a/lib/core/widgets/custom_text_form_field.dart b/lib/core/widgets/custom_text_form_field.dart
index 490255db..c58dd23e 100644
--- a/lib/core/widgets/custom_text_form_field.dart
+++ b/lib/core/widgets/custom_text_form_field.dart
@@ -80,8 +80,10 @@ class CustomTextFormField extends StatelessWidget {
final TextAlignVertical? textAlignVertical;
final bool hasError;
final bool enabled;
+
// final TextAlign
final bool readOnly;
+
@override
Widget build(BuildContext context) {
return Align(
@@ -97,54 +99,37 @@ class CustomTextFormField extends StatelessWidget {
controller: controller,
focusNode: focusNode ?? null,
autofocus: autofocus,
- style: TextStyle(
- fontSize: 16,
- color: Colors.black,
- fontWeight: FontWeight.w500,
- ),
+ style: TextStyle(fontSize: 16, color: Colors.black, fontWeight: FontWeight.w500),
obscureText: obscureText!,
textInputAction: textInputAction,
maxLines: maxLines,
initialValue: initialValue,
cursorColor: appTheme.blueA400,
+ textCapitalization: TextCapitalization.sentences,
decoration: InputDecoration(
counter: counter,
suffixText: suffixText,
hintText: hintText ?? "",
- hintStyle: TextStyle(
- fontSize: 16,
- color: Colors.grey.shade400,
- fontWeight: FontWeight.w500,
- ),
+ hintStyle: hintStyle ?? TextStyle(fontSize: 16, color: Color(0xFF323F4B).withAlpha((255 / 2).toInt()), fontWeight: FontWeight.w500),
prefixIcon: prefix,
prefixIconConstraints: prefixConstraints,
suffixIcon: suffix,
floatingLabelBehavior: FloatingLabelBehavior.always,
- suffixStyle: TextStyle(
- fontSize: 16,
- fontWeight: FontWeight.w500,
- color: Color(0xFF323F4B),
- ),
+ suffixStyle: textStyle ?? TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Color(0xFF323F4B)),
suffixIconConstraints: suffixConstraints,
isDense: false,
contentPadding: EdgeInsets.symmetric(vertical: 16, horizontal: 12),
fillColor: Color(0xFFF6F6F6),
filled: true,
- border: borderDecoration ??
- OutlineInputBorder(
- borderRadius: BorderRadius.circular(20),
- borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none,
- ),
- enabledBorder: borderDecoration ??
- OutlineInputBorder(
- borderRadius: BorderRadius.circular(20),
- borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none,
- ),
- focusedBorder: borderDecoration ??
- OutlineInputBorder(
- borderRadius: BorderRadius.circular(20),
- borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none,
- ),
+ border:
+ borderDecoration ??
+ OutlineInputBorder(borderRadius: BorderRadius.circular(20), borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none),
+ enabledBorder:
+ borderDecoration ??
+ OutlineInputBorder(borderRadius: BorderRadius.circular(20), borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none),
+ focusedBorder:
+ borderDecoration ??
+ OutlineInputBorder(borderRadius: BorderRadius.circular(20), borderSide: hasError ? BorderSide(color: appTheme.red, width: 1) : BorderSide.none),
),
keyboardType: keyboardType,
validator: validator,
diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
index 09d0d9f5..e63da667 100644
--- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart
+++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
@@ -85,24 +85,47 @@ class _BlogPostScreenState extends State {
if (replyId != null) SizedBox(width: 8),
SizedBox(
width: MediaQuery.of(context).size.width - (replyId == null ? 64 : 104),
- child: TextFormField(
- onChanged: (_) {
- setState(() {});
- },
- controller: textEditingController,
- maxLines: 5,
- minLines: 1,
- keyboardType: TextInputType.multiline,
- style: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
- decoration: InputDecoration(
- isDense: true,
- contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
- hintText: 'Комментарий',
- hintStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
- filled: true,
- border: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
- enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
- focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(16), borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1)),
+ child: ConstrainedBox(
+ constraints: BoxConstraints(minHeight: 52),
+ child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
+ onChanged: (_) {
+ setState(() {});
+ },
+ controller: textEditingController,
+ maxLines: 5,
+ minLines: 1,
+ keyboardType: TextInputType.multiline,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ color: Colors.black,
+ height: 1.2,
+ ),
+ decoration: InputDecoration(
+ isDense: false, // убираем true, чтобы padding учитывал�� корректно
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен
+ hintText: 'Комментарий',
+ hintStyle: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ height: 1.2,
+ color: Color(0xFFAEAEB2),
+ ),
+ filled: true,
+ border: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
+ ),
+ focusedBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.circular(16),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
+ ),
+ ),
),
),
),
diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart
index 745bb46b..5fafe2c8 100644
--- a/lib/features/chat/presentation/pages/chat_screen.dart
+++ b/lib/features/chat/presentation/pages/chat_screen.dart
@@ -15,6 +15,7 @@ import 'package:eatvio_app/core/theme/custom_text_style.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/chat/presentation/widgets/notification_banner.dart';
import 'package:eatvio_app/features/chat/presentation/widgets/order_card.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
import 'package:eatvio_app/features/user_details/presentation/user_details_screen.dart';
import 'package:eatvio_app/generated/l10n.dart';
@@ -97,37 +98,68 @@ class _ChatScreenState extends State {
titleSpacing: 0,
backgroundColor: appTheme.gray100,
centerTitle: false,
- title: Row(
- children: [
- if (state.chatRoom.users.receiver.profilePhotoUrl != null)
- CircleAvatar(radius: 20, foregroundImage: NetworkImage(state.chatRoom.users.receiver.profilePhotoUrl!)),
- if (state.chatRoom.users.receiver.profilePhotoUrl == null)
- Container(
- width: 40,
- height: 40,
- alignment: Alignment.center,
- decoration: BoxDecoration(color: Color(0xFFEBF4FF), shape: BoxShape.circle),
- child: Text(
- state.chatRoom.users.receiver.name.split(' ').first[0] + state.chatRoom.users.receiver.name.split(' ')[1][0],
- style: TextStyle(color: Color(0xFF7F9CF5), fontWeight: FontWeight.w400, fontSize: 20),
- ),
+ title: GestureDetector(
+ onTap: () {
+ GoRouter.of(context).pushNamed(
+ 'profileScreen',
+ extra: Author(
+ authorSlug: state.chatRoom.users.receiver.slug,
+ authorName: state.chatRoom.users.receiver.name,
+ authorProfileIcon: state.chatRoom.users.receiver.profilePhotoUrl ?? '',
+ authorIsMe: false,
),
- SizedBox(width: 16),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(state.chatRoom.users.receiver.name, style: CustomTextStyles.titleSmallBold.copyWith(color: PrimaryColors().black)),
- AnimatedCrossFade(
- firstChild: Text('Печатает...', style: CustomTextStyles.bodySmallMulishPrimary),
- firstCurve: Curves.easeIn,
- secondCurve: Curves.easeOut,
- secondChild: const SizedBox.shrink(),
- crossFadeState: state.isTyping ? CrossFadeState.showFirst : CrossFadeState.showSecond,
- duration: Duration(milliseconds: 150),
+ );
+ },
+ child: Row(
+ children: [
+ if (state.chatRoom.users.receiver.profilePhotoUrl != null)
+ CircleAvatar(
+ radius: 20,
+ foregroundImage: NetworkImage(state.chatRoom.users.receiver.profilePhotoUrl!),
),
- ],
- ),
- ],
+ if (state.chatRoom.users.receiver.profilePhotoUrl == null)
+ Container(
+ width: 40,
+ height: 40,
+ alignment: Alignment.center,
+ decoration: BoxDecoration(
+ color: Color(0xFFEBF4FF),
+ shape: BoxShape.circle,
+ ),
+ child: Text(
+ state.chatRoom.users.receiver.name.split(' ').first[0] + state.chatRoom.users.receiver.name.split(' ')[1][0],
+ style: TextStyle(
+ color: Color(0xFF7F9CF5),
+ fontWeight: FontWeight.w400,
+ fontSize: 20,
+ ),
+ ),
+ ),
+ SizedBox(width: 16),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ state.chatRoom.users.receiver.name,
+ style: CustomTextStyles.titleSmallBold.copyWith(
+ color: PrimaryColors().black,
+ ),
+ ),
+ AnimatedCrossFade(
+ firstChild: Text(
+ 'Печатает...',
+ style: CustomTextStyles.bodySmallMulishPrimary,
+ ),
+ firstCurve: Curves.easeIn,
+ secondCurve: Curves.easeOut,
+ secondChild: const SizedBox.shrink(),
+ crossFadeState: state.isTyping ? CrossFadeState.showFirst : CrossFadeState.showSecond,
+ duration: Duration(milliseconds: 150),
+ ),
+ ],
+ ),
+ ],
+ ),
),
),
body: SafeArea(
@@ -301,6 +333,7 @@ class _ChatScreenState extends State {
height: 40,
child: TextFormField(
expands: true,
+ textCapitalization: TextCapitalization.sentences,
controller: textEditingController,
maxLines: null,
minLines: null,
diff --git a/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart b/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart
index 90db1fca..2750d2c5 100644
--- a/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart
+++ b/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart
@@ -81,6 +81,7 @@ class ChatSearchBarWidget extends StatelessWidget {
searchViewWidget(BuildContext context) => SizedBox(
width: width ?? MediaQuery.of(context).size.width,
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
controller: controller,
focusNode: focusNode,
onTapOutside: (event) => onTapOutside(),
diff --git a/lib/features/create_diet/presentation/diet_preview_screen.dart b/lib/features/create_diet/presentation/diet_preview_screen.dart
index 066ac06e..8ed2cbf1 100644
--- a/lib/features/create_diet/presentation/diet_preview_screen.dart
+++ b/lib/features/create_diet/presentation/diet_preview_screen.dart
@@ -116,6 +116,7 @@ class _DietPreviewScreenState extends State {
Expanded(
child: SizedBox(
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
onChanged: (_) {
setState(() {});
},
diff --git a/lib/features/diary/models/finish_diary_day_model.dart b/lib/features/diary/models/finish_diary_day_model.dart
index d1522273..8e7dfa34 100644
--- a/lib/features/diary/models/finish_diary_day_model.dart
+++ b/lib/features/diary/models/finish_diary_day_model.dart
@@ -4,12 +4,9 @@ part 'finish_diary_day_model.freezed.dart';
part 'finish_diary_day_model.g.dart';
-@freezed
+@Freezed()
class FinishDiaryDayModel with _$FinishDiaryDayModel {
- const factory FinishDiaryDayModel({
- required String wakeUp,
- required String retire,
- }) = _FinishDiaryDayModel;
+ const factory FinishDiaryDayModel({required String wakeUp, required String retire, @JsonKey(includeIfNull: false) String? comment}) = _FinishDiaryDayModel;
- factory FinishDiaryDayModel.fromJson(Map json) => _$FinishDiaryDayModelFromJson(json);
+ factory FinishDiaryDayModel.fromJson(Map json) => _$FinishDiaryDayModelFromJson(json);
}
diff --git a/lib/features/diary/models/finish_diary_day_model.freezed.dart b/lib/features/diary/models/finish_diary_day_model.freezed.dart
index 8b590859..a6631f37 100644
--- a/lib/features/diary/models/finish_diary_day_model.freezed.dart
+++ b/lib/features/diary/models/finish_diary_day_model.freezed.dart
@@ -23,6 +23,8 @@ FinishDiaryDayModel _$FinishDiaryDayModelFromJson(Map json) {
mixin _$FinishDiaryDayModel {
String get wakeUp => throw _privateConstructorUsedError;
String get retire => throw _privateConstructorUsedError;
+ @JsonKey(includeIfNull: false)
+ String? get comment => throw _privateConstructorUsedError;
/// Serializes this FinishDiaryDayModel to a JSON map.
Map toJson() => throw _privateConstructorUsedError;
@@ -41,7 +43,11 @@ abstract class $FinishDiaryDayModelCopyWith<$Res> {
$Res Function(FinishDiaryDayModel) then,
) = _$FinishDiaryDayModelCopyWithImpl<$Res, FinishDiaryDayModel>;
@useResult
- $Res call({String wakeUp, String retire});
+ $Res call({
+ String wakeUp,
+ String retire,
+ @JsonKey(includeIfNull: false) String? comment,
+ });
}
/// @nodoc
@@ -58,7 +64,11 @@ class _$FinishDiaryDayModelCopyWithImpl<$Res, $Val extends FinishDiaryDayModel>
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
- $Res call({Object? wakeUp = null, Object? retire = null}) {
+ $Res call({
+ Object? wakeUp = null,
+ Object? retire = null,
+ Object? comment = freezed,
+ }) {
return _then(
_value.copyWith(
wakeUp:
@@ -71,6 +81,11 @@ class _$FinishDiaryDayModelCopyWithImpl<$Res, $Val extends FinishDiaryDayModel>
? _value.retire
: retire // ignore: cast_nullable_to_non_nullable
as String,
+ comment:
+ freezed == comment
+ ? _value.comment
+ : comment // ignore: cast_nullable_to_non_nullable
+ as String?,
)
as $Val,
);
@@ -86,7 +101,11 @@ abstract class _$$FinishDiaryDayModelImplCopyWith<$Res>
) = __$$FinishDiaryDayModelImplCopyWithImpl<$Res>;
@override
@useResult
- $Res call({String wakeUp, String retire});
+ $Res call({
+ String wakeUp,
+ String retire,
+ @JsonKey(includeIfNull: false) String? comment,
+ });
}
/// @nodoc
@@ -102,7 +121,11 @@ class __$$FinishDiaryDayModelImplCopyWithImpl<$Res>
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
- $Res call({Object? wakeUp = null, Object? retire = null}) {
+ $Res call({
+ Object? wakeUp = null,
+ Object? retire = null,
+ Object? comment = freezed,
+ }) {
return _then(
_$FinishDiaryDayModelImpl(
wakeUp:
@@ -115,6 +138,11 @@ class __$$FinishDiaryDayModelImplCopyWithImpl<$Res>
? _value.retire
: retire // ignore: cast_nullable_to_non_nullable
as String,
+ comment:
+ freezed == comment
+ ? _value.comment
+ : comment // ignore: cast_nullable_to_non_nullable
+ as String?,
),
);
}
@@ -123,7 +151,11 @@ class __$$FinishDiaryDayModelImplCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$FinishDiaryDayModelImpl implements _FinishDiaryDayModel {
- const _$FinishDiaryDayModelImpl({required this.wakeUp, required this.retire});
+ const _$FinishDiaryDayModelImpl({
+ required this.wakeUp,
+ required this.retire,
+ @JsonKey(includeIfNull: false) this.comment,
+ });
factory _$FinishDiaryDayModelImpl.fromJson(Map json) =>
_$$FinishDiaryDayModelImplFromJson(json);
@@ -132,10 +164,13 @@ class _$FinishDiaryDayModelImpl implements _FinishDiaryDayModel {
final String wakeUp;
@override
final String retire;
+ @override
+ @JsonKey(includeIfNull: false)
+ final String? comment;
@override
String toString() {
- return 'FinishDiaryDayModel(wakeUp: $wakeUp, retire: $retire)';
+ return 'FinishDiaryDayModel(wakeUp: $wakeUp, retire: $retire, comment: $comment)';
}
@override
@@ -144,12 +179,13 @@ class _$FinishDiaryDayModelImpl implements _FinishDiaryDayModel {
(other.runtimeType == runtimeType &&
other is _$FinishDiaryDayModelImpl &&
(identical(other.wakeUp, wakeUp) || other.wakeUp == wakeUp) &&
- (identical(other.retire, retire) || other.retire == retire));
+ (identical(other.retire, retire) || other.retire == retire) &&
+ (identical(other.comment, comment) || other.comment == comment));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
- int get hashCode => Object.hash(runtimeType, wakeUp, retire);
+ int get hashCode => Object.hash(runtimeType, wakeUp, retire, comment);
/// Create a copy of FinishDiaryDayModel
/// with the given fields replaced by the non-null parameter values.
@@ -172,6 +208,7 @@ abstract class _FinishDiaryDayModel implements FinishDiaryDayModel {
const factory _FinishDiaryDayModel({
required final String wakeUp,
required final String retire,
+ @JsonKey(includeIfNull: false) final String? comment,
}) = _$FinishDiaryDayModelImpl;
factory _FinishDiaryDayModel.fromJson(Map json) =
@@ -181,6 +218,9 @@ abstract class _FinishDiaryDayModel implements FinishDiaryDayModel {
String get wakeUp;
@override
String get retire;
+ @override
+ @JsonKey(includeIfNull: false)
+ String? get comment;
/// Create a copy of FinishDiaryDayModel
/// with the given fields replaced by the non-null parameter values.
diff --git a/lib/features/diary/models/finish_diary_day_model.g.dart b/lib/features/diary/models/finish_diary_day_model.g.dart
index b20f81a9..5721deda 100644
--- a/lib/features/diary/models/finish_diary_day_model.g.dart
+++ b/lib/features/diary/models/finish_diary_day_model.g.dart
@@ -11,8 +11,13 @@ _$FinishDiaryDayModelImpl _$$FinishDiaryDayModelImplFromJson(
) => _$FinishDiaryDayModelImpl(
wakeUp: json['wakeUp'] as String,
retire: json['retire'] as String,
+ comment: json['comment'] as String?,
);
Map _$$FinishDiaryDayModelImplToJson(
_$FinishDiaryDayModelImpl instance,
-) => {'wakeUp': instance.wakeUp, 'retire': instance.retire};
+) => {
+ 'wakeUp': instance.wakeUp,
+ 'retire': instance.retire,
+ if (instance.comment case final value?) 'comment': value,
+};
diff --git a/lib/features/diary/presentation/bloc/diary_cubit.dart b/lib/features/diary/presentation/bloc/diary_cubit.dart
index 8c18c725..7d57a35d 100644
--- a/lib/features/diary/presentation/bloc/diary_cubit.dart
+++ b/lib/features/diary/presentation/bloc/diary_cubit.dart
@@ -17,10 +17,7 @@ class DiaryCubit extends Cubit {
final DiaryRepository diaryRepository;
final GlossaryRepository glossaryRepository;
- DiaryCubit({
- required this.diaryRepository,
- required this.glossaryRepository,
- }) : super(const DiaryState.loading()) {
+ DiaryCubit({required this.diaryRepository, required this.glossaryRepository}) : super(const DiaryState.loading()) {
today = DateTime.now();
selectedDay = today;
}
@@ -56,16 +53,8 @@ class DiaryCubit extends Cubit {
}
}
- finishDiaryDay({
- required int diaryId,
- required String wakeUp,
- required String retire,
- }) async {
- await diaryRepository.finishDiaryDay(
- diaryId: diaryId,
- wakeUp: wakeUp,
- retire: retire,
- );
+ finishDiaryDay({required int diaryId, required String wakeUp, required String retire, String? comment}) async {
+ await diaryRepository.finishDiaryDay(diaryId: diaryId, wakeUp: wakeUp, retire: retire, comment: comment);
await fetchDiary();
}
@@ -126,55 +115,23 @@ class DiaryCubit extends Cubit {
await fetchDiary();
}
- markEaten({
- required int diaryId,
- required int mealId,
- required int portionId,
- }) async {
- await diaryRepository.markEaten(
- diaryId: diaryId,
- mealId: mealId,
- portionId: portionId,
- );
+ markEaten({required int diaryId, required int mealId, required int portionId}) async {
+ await diaryRepository.markEaten(diaryId: diaryId, mealId: mealId, portionId: portionId);
await fetchDiary();
}
- unmarkEaten({
- required int diaryId,
- required int mealId,
- required int portionId,
- }) async {
- await diaryRepository.unmarkEaten(
- diaryId: diaryId,
- mealId: mealId,
- portionId: portionId,
- );
+ unmarkEaten({required int diaryId, required int mealId, required int portionId}) async {
+ await diaryRepository.unmarkEaten(diaryId: diaryId, mealId: mealId, portionId: portionId);
await fetchDiary();
}
- restore({
- required int diaryId,
- required int mealId,
- required int portionId,
- }) async {
- await diaryRepository.restore(
- diaryId: diaryId,
- mealId: mealId,
- portionId: portionId,
- );
+ restore({required int diaryId, required int mealId, required int portionId}) async {
+ await diaryRepository.restore(diaryId: diaryId, mealId: mealId, portionId: portionId);
await fetchDiary();
}
- deleteProductFromMeal({
- required int diaryId,
- required int mealId,
- required int portionId,
- }) async {
- await diaryRepository.deleteProductFromMeal(
- diaryId: diaryId,
- mealId: mealId,
- portionId: portionId,
- );
+ deleteProductFromMeal({required int diaryId, required int mealId, required int portionId}) async {
+ await diaryRepository.deleteProductFromMeal(diaryId: diaryId, mealId: mealId, portionId: portionId);
await fetchDiary();
}
@@ -182,27 +139,13 @@ class DiaryCubit extends Cubit {
return await glossaryRepository.getGlossaryListByQuery(query);
}
- uploadPhotos({
- required List files,
- required int diaryId,
- }) async {
- await diaryRepository.uploadPhotos(
- files: await ImageCompressUtility.compressFilesList(files),
- diaryId: diaryId,
- mealId: selectedMeal,
- );
+ uploadPhotos({required List files, required int diaryId}) async {
+ await diaryRepository.uploadPhotos(files: await ImageCompressUtility.compressFilesList(files), diaryId: diaryId, mealId: selectedMeal);
await fetchDiary();
}
- deletePhoto({
- required DiaryPhotoModel photo,
- required int diaryId,
- }) async {
- await diaryRepository.deletePhoto(
- photo: photo,
- diaryId: diaryId,
- mealId: selectedMeal,
- );
+ deletePhoto({required DiaryPhotoModel photo, required int diaryId}) async {
+ await diaryRepository.deletePhoto(photo: photo, diaryId: diaryId, mealId: selectedMeal);
await fetchDiary();
}
@@ -214,39 +157,37 @@ class DiaryCubit extends Cubit {
required double carbohydrates,
}) async {
try {
- return await diaryRepository.sendProductToModeration(
- name: name,
- energy: energy,
- proteins: proteins,
- fats: fats,
- carbohydrates: carbohydrates,
- );
+ return await diaryRepository.sendProductToModeration(name: name, energy: energy, proteins: proteins, fats: fats, carbohydrates: carbohydrates);
} catch (e, stackTrace) {
log(e.toString(), stackTrace: stackTrace);
}
return null;
}
- fillTime({
- required int diaryId,
- required String time,
- }) async {
- await diaryRepository.fillTime(
- diaryId: diaryId,
- mealId: selectedMeal,
- time: time,
- );
+ fillTime({required int diaryId, required String time}) async {
+ await diaryRepository.fillTime(diaryId: diaryId, mealId: selectedMeal, time: time);
await fetchDiary();
}
- fillSatiety({
- required int diaryId,
- required int satiety,
- }) async {
- await diaryRepository.fillSatiety(
- diaryId: diaryId,
- mealId: selectedMeal,
- satiety: satiety,
- );
+ fillWakeup({required int diaryId, required String time}) async {
+ await diaryRepository.fillWakeup(diaryId: diaryId, time: time);
+ await fetchDiary();
+ }
+
+ fillRetire({required int diaryId, required String time}) async {
+ await diaryRepository.fillRetire(diaryId: diaryId, time: time);
+ await fetchDiary();
+ }
+
+ fillSatiety({required int diaryId, required int satiety}) async {
+ await diaryRepository.fillSatiety(diaryId: diaryId, mealId: selectedMeal, satiety: satiety);
+ }
+
+ fillMood({required int diaryId, required int mood}) async {
+ await diaryRepository.fillMood(diaryId: diaryId, mealId: selectedMeal, mood: mood);
+ }
+
+ fillComment(String comment) {
+ emit((state as DiaryStateLoaded).copyWith(diary: (state as DiaryStateLoaded).diary.copyWith(comment: comment)));
}
}
diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart
index 8c5e784f..7f230e2b 100644
--- a/lib/features/diary/presentation/pages/diary_screen.dart
+++ b/lib/features/diary/presentation/pages/diary_screen.dart
@@ -7,8 +7,10 @@ import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/calendar_widget.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/calories_chart_widget.dart';
+import 'package:eatvio_app/features/diary/presentation/widgets/comment_for_consultant_widget.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/finish_day_button_widget.dart';
import 'package:eatvio_app/features/diary/presentation/widgets/meal_widget.dart';
+import 'package:eatvio_app/features/diary/presentation/widgets/wakeup_and_retire_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -46,8 +48,12 @@ class _DiaryScreenState extends State {
children: [
CalendarWidget(),
if (state is DiaryStateLoading) const Loader(),
+ if (state is DiaryStateLoaded) WakeupAndRetireWidget(),
+ const SizedBox(height: 12),
if (state is DiaryStateLoaded) MealWidget(),
- CaloriesChartWidget(),
+ if (state is DiaryStateLoaded) CaloriesChartWidget(),
+ const SizedBox(height: 12),
+ if (state is DiaryStateLoaded) CommentForConsultantWidget(),
if (state is DiaryStateLoaded && state.diary.closed == 0)
Padding(
padding: const EdgeInsets.only(top: 12),
diff --git a/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart b/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart
new file mode 100644
index 00000000..0e276f72
--- /dev/null
+++ b/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart
@@ -0,0 +1,44 @@
+import 'package:easy_debounce/easy_debounce.dart';
+import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class CommentForConsultantWidget extends StatefulWidget {
+ const CommentForConsultantWidget({super.key});
+
+ @override
+ State createState() => _CommentForConsultantWidgetState();
+}
+
+class _CommentForConsultantWidgetState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Material(
+ borderRadius: BorderRadius.circular(20),
+ color: Colors.white,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Дополнительна� информаци� дл� кон�ультанта',
+ textAlign: TextAlign.center,
+ style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: Color(0xFF323F4B), height: 1),
+ ),
+ const SizedBox(height: 12),
+ CustomTextFormField(
+ onChanged: (value) {
+ EasyDebounce.debounce('client-typing', Duration(seconds: 3), () => context.read().fillComment(value));
+ },
+ hintText: 'Укажите дополнительную информацию',
+ minLines: 4,
+ maxLines: 4,
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart
index 3ed14e27..651f4a66 100644
--- a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart
+++ b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart
@@ -7,10 +7,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
class FinishDayButtonWidget extends StatefulWidget {
final DiaryDayModel diaryDay;
- const FinishDayButtonWidget({
- super.key,
- required this.diaryDay,
- });
+ const FinishDayButtonWidget({super.key, required this.diaryDay});
@override
State createState() => _FinishDayButtonWidgetState();
@@ -20,30 +17,22 @@ class _FinishDayButtonWidgetState extends State {
@override
Widget build(BuildContext context) {
return InkWell(
- onTap: () => context.read().finishDiaryDay(
+ onTap:
+ () => context.read().finishDiaryDay(
diaryId: widget.diaryDay.id,
wakeUp: widget.diaryDay.wakeup.toString(),
retire: widget.diaryDay.retire.toString(),
+ comment: widget.diaryDay.comment.isEmpty ? null : widget.diaryDay.comment,
),
borderRadius: BorderRadius.circular(20),
child: Ink(
padding: EdgeInsets.symmetric(horizontal: 8),
width: MediaQuery.of(context).size.width - 16,
- decoration: BoxDecoration(
- color: appTheme.blueA400,
- borderRadius: BorderRadius.circular(20),
- ),
+ decoration: BoxDecoration(color: appTheme.blueA400, borderRadius: BorderRadius.circular(20)),
child: Container(
padding: EdgeInsets.all(16),
alignment: Alignment.center,
- child: Text(
- 'Закончить день',
- style: TextStyle(
- color: Colors.white,
- fontSize: 18,
- fontWeight: FontWeight.w600,
- ),
- ),
+ child: Text('Закончить день', style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.w600)),
),
),
);
diff --git a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart
index 23e9f00e..4f49747f 100644
--- a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart
+++ b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart
@@ -227,7 +227,7 @@ class _GlossaryModerationRequestModalWidgetState extends State {
PhotoGalleryWidget(),
const SizedBox(height: 12),
SatietyRatingWidget(),
+ const SizedBox(height: 12),
+ MoodRatingWidget(),
],
),
),
diff --git a/lib/features/diary/presentation/widgets/mood_rating_widget.dart b/lib/features/diary/presentation/widgets/mood_rating_widget.dart
new file mode 100644
index 00000000..9d8c6dab
--- /dev/null
+++ b/lib/features/diary/presentation/widgets/mood_rating_widget.dart
@@ -0,0 +1,199 @@
+import 'package:easy_debounce/easy_debounce.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_rating_bar/flutter_rating_bar.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+class MoodRatingWidget extends StatefulWidget {
+ @override
+ State createState() => _MoodRatingWidgetState();
+}
+
+class _MoodRatingWidgetState extends State {
+ late double currentSelectedRating;
+ bool isFirstFetch = true;
+
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder(
+ builder: (BuildContext context, DiaryState state) {
+ if (state is DiaryStateLoaded) {
+ if (isFirstFetch) {
+ currentSelectedRating = state.diary.meals[state.selectedMeal - 1].mood.toDouble() + 1;
+ isFirstFetch = false;
+ }
+ return Padding(
+ padding: const EdgeInsets.only(top: 24),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text(
+ 'Ваше на�троение по�ле приёма пищи',
+ style: TextStyle(
+ fontSize: 16,
+ ),
+ ),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ SvgPicture.asset(
+ 'assets/icons/mood_1.svg',
+ height: 32,
+ width: 32,
+ ),
+ RatingBar.builder(
+ initialRating: state.diary.meals[state.selectedMeal - 1].mood.toDouble() + 1,
+ itemCount: 6,
+ itemSize: MediaQuery.of(context).size.width / 6 - (124 / 6),
+ updateOnDrag: true,
+ itemBuilder: (context, index) {
+ switch (index) {
+ case 0:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 1 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFFC82222),
+ border: currentSelectedRating == 1
+ ? Border.all(
+ width: 2,
+ color: Color(0xFFAA3333),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 1
+ ? BorderRadius.horizontal(
+ left: Radius.circular(8),
+ right: Radius.circular(2),
+ )
+ : BorderRadius.horizontal(
+ left: Radius.circular(8),
+ ),
+ ),
+ );
+ case 1:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 2 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFFFF3E3E),
+ border: currentSelectedRating == 2
+ ? Border.all(
+ width: 2,
+ color: Color(0xFF550000),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 2 ? BorderRadius.circular(2) : null,
+ ),
+ );
+ case 2:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 3 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFFF8C926),
+ border: currentSelectedRating == 3
+ ? Border.all(
+ width: 2,
+ color: Color(0xFF8C5D00),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 3 ? BorderRadius.circular(2) : null,
+ ),
+ );
+ case 3:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 4 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFFFFF3BF),
+ border: currentSelectedRating == 4
+ ? Border.all(
+ width: 2,
+ color: Color(0xFFB5911B),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 4 ? BorderRadius.circular(2) : null,
+ ),
+ );
+ case 4:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 5 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFF62E833),
+ border: currentSelectedRating == 5
+ ? Border.all(
+ width: 2,
+ color: Color(0xFF276918),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 5 ? BorderRadius.circular(2) : null,
+ ),
+ );
+ default:
+ return Container(
+ width: MediaQuery.of(context).size.width / 6,
+ height: 24,
+ margin: currentSelectedRating == 6 ? EdgeInsets.symmetric(horizontal: 2) : null,
+ decoration: BoxDecoration(
+ color: Color(0xFF4DCE20),
+ border: currentSelectedRating == 6
+ ? Border.all(
+ width: 2,
+ color: Color(0xFF184D12),
+ strokeAlign: BorderSide.strokeAlignOutside,
+ )
+ : null,
+ borderRadius: currentSelectedRating == 6
+ ? BorderRadius.horizontal(
+ left: Radius.circular(2),
+ right: Radius.circular(8),
+ )
+ : BorderRadius.horizontal(
+ right: Radius.circular(8),
+ ),
+ ),
+ );
+ }
+ },
+ onRatingUpdate: (value) {
+ setState(() {
+ currentSelectedRating = value;
+ });
+ EasyDebounce.debounce(
+ 'change-satiety',
+ Duration(milliseconds: 250),
+ () {
+ context.read().fillMood(diaryId: state.diary.id, mood: currentSelectedRating.toInt() - 1);
+ },
+ );
+ },
+ ),
+ SvgPicture.asset(
+ 'assets/icons/mood_2.svg',
+ height: 32,
+ width: 32,
+ ),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+ return const SizedBox.shrink();
+ },
+ );
+ }
+}
diff --git a/lib/features/diary/presentation/widgets/satiety_rating_widget.dart b/lib/features/diary/presentation/widgets/satiety_rating_widget.dart
index 89404fcc..28ab9996 100644
--- a/lib/features/diary/presentation/widgets/satiety_rating_widget.dart
+++ b/lib/features/diary/presentation/widgets/satiety_rating_widget.dart
@@ -21,7 +21,7 @@ class _SatietyRatingWidgetState extends State {
builder: (BuildContext context, DiaryState state) {
if (state is DiaryStateLoaded) {
if (isFirstFetch) {
- currentSelectedRating = state.diary.meals[state.selectedMeal - 1].satiety.toDouble();
+ currentSelectedRating = state.diary.meals[state.selectedMeal - 1].satiety.toDouble() + 1;
isFirstFetch = false;
}
return Padding(
@@ -44,7 +44,7 @@ class _SatietyRatingWidgetState extends State {
width: 32,
),
RatingBar.builder(
- initialRating: state.diary.meals[state.selectedMeal - 1].satiety.toDouble(),
+ initialRating: state.diary.meals[state.selectedMeal - 1].satiety.toDouble() + 1,
itemCount: 6,
itemSize: MediaQuery.of(context).size.width / 6 - (124 / 6),
updateOnDrag: true,
@@ -176,7 +176,7 @@ class _SatietyRatingWidgetState extends State {
'change-satiety',
Duration(milliseconds: 250),
() {
- context.read().fillSatiety(diaryId: state.diary.id, satiety: currentSelectedRating.toInt());
+ context.read().fillSatiety(diaryId: state.diary.id, satiety: currentSelectedRating.toInt() - 1);
},
);
},
diff --git a/lib/features/diary/presentation/widgets/wakeup_and_retire_widget.dart b/lib/features/diary/presentation/widgets/wakeup_and_retire_widget.dart
new file mode 100644
index 00000000..65c3cbe8
--- /dev/null
+++ b/lib/features/diary/presentation/widgets/wakeup_and_retire_widget.dart
@@ -0,0 +1,229 @@
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+import '../../../../core/theme/theme_helper.dart';
+
+class WakeupAndRetireWidget extends StatefulWidget {
+ const WakeupAndRetireWidget({super.key});
+
+ @override
+ State createState() => _WakeupAndRetireWidgetState();
+}
+
+class _WakeupAndRetireWidgetState extends State {
+ late final DiaryCubit diaryCubit;
+ DateTime wakeup = DateTime.now().copyWith(hour: 6, minute: 30);
+ DateTime retire = DateTime.now().copyWith(hour: 22, minute: 30);
+
+ @override
+ void initState() {
+ super.initState();
+ diaryCubit = context.read();
+ }
+
+ showTimePicker(int diaryId, bool isWakeup) {
+ showModalBottomSheet(
+ context: context,
+ useRootNavigator: true,
+ builder:
+ (context) => SizedBox(
+ height: MediaQuery.of(context).copyWith().size.height / 3,
+ child: Column(
+ children: [
+ Expanded(
+ child: CupertinoDatePicker(
+ mode: CupertinoDatePickerMode.time,
+ use24hFormat: true,
+ initialDateTime: DateTime.now(),
+ onDateTimeChanged: (newTime) {
+ if (isWakeup) {
+ wakeup = newTime;
+ } else {
+ retire = newTime;
+ }
+ },
+ ),
+ ),
+ InkWell(
+ onTap: () {
+ Navigator.of(context).pop();
+ if (isWakeup) {
+ diaryCubit.fillWakeup(
+ diaryId: diaryId,
+ time:
+ '${wakeup.hour.toString().padLeft(2, '0')}:${wakeup.minute.toString().padLeft(2, '0')}:00',
+ );
+ } else {
+ diaryCubit.fillRetire(
+ diaryId: diaryId,
+ time:
+ '${retire.hour.toString().padLeft(2, '0')}:${retire.minute.toString().padLeft(2, '0')}:00',
+ );
+ }
+ },
+ borderRadius: BorderRadius.circular(20),
+ child: Ink(
+ width: MediaQuery.of(context).size.width - 16,
+ height: 52,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(20),
+ color: appTheme.blueA400,
+ ),
+ child: Center(
+ child: Text(
+ 'Сохранить',
+ style: TextStyle(
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ color: Colors.white,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder(
+ builder: (context, state) {
+ if (state is DiaryStateLoaded) {
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 4),
+ child: Row(
+ children: [
+ Expanded(
+ child: Material(
+ borderRadius: BorderRadius.circular(12),
+ color: Colors.white,
+ child: Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 8,
+ vertical: 12,
+ ),
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ SvgPicture.asset('assets/icons/wakeup.svg'),
+ const SizedBox(width: 8),
+ Text(
+ 'Подъём',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ height: 1,
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 8),
+ InkWell(
+ onTap: () => showTimePicker(state.diary.id, true),
+ borderRadius: BorderRadius.circular(100),
+ child: Ink(
+ height: 32,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(100),
+ color: Color(0xFFF1F2F6),
+ ),
+ child: Container(
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ state.diary.wakeup.toString().substring(
+ 0,
+ state.diary.wakeup.toString().length - 3,
+ ),
+ style: TextStyle(
+ color: Color(0xFF6D6F71),
+ fontSize: 17,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(width: 8),
+ Expanded(
+ child: Material(
+ borderRadius: BorderRadius.circular(12),
+ color: Colors.white,
+ child: Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 8,
+ vertical: 12,
+ ),
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ SvgPicture.asset('assets/icons/retire.svg'),
+ const SizedBox(width: 8),
+ Text(
+ 'Уход ко �ну',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ height: 1,
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 8),
+ InkWell(
+ onTap: () => showTimePicker(state.diary.id, false),
+ borderRadius: BorderRadius.circular(100),
+ child: Ink(
+ height: 32,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(100),
+ color: Color(0xFFF1F2F6),
+ ),
+ child: Container(
+ alignment: Alignment.center,
+ padding: EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ state.diary.retire.toString().substring(
+ 0,
+ state.diary.retire.toString().length - 3,
+ ),
+ style: TextStyle(
+ color: Color(0xFF6D6F71),
+ fontSize: 17,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ } else {
+ return SizedBox.shrink();
+ }
+ },
+ );
+ }
+}
diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart
index 754e1321..ad7a0448 100644
--- a/lib/features/diary/repositories/diary_repository.dart
+++ b/lib/features/diary/repositories/diary_repository.dart
@@ -158,12 +158,14 @@ class DiaryRepository {
required int diaryId,
required String wakeUp,
required String retire,
+ String? comment,
}) async {
return await diaryService.finishDiaryDay(
diary: diaryId,
finishDiaryDayModel: FinishDiaryDayModel(
wakeUp: wakeUp,
retire: retire,
+ comment: comment
),
);
}
@@ -202,6 +204,22 @@ class DiaryRepository {
}
}
+ Future fillMood({
+ required int diaryId,
+ required int mealId,
+ required int mood,
+ }) async {
+ try {
+ return await diaryService.fillMood(
+ diary: diaryId,
+ typeNo: mealId,
+ mood: mood,
+ );
+ } catch (e) {
+ rethrow;
+ }
+ }
+
Future fillTime({
required int diaryId,
required int mealId,
@@ -217,4 +235,32 @@ class DiaryRepository {
rethrow;
}
}
+
+ Future fillWakeup({
+ required int diaryId,
+ required String time,
+ }) async {
+ try {
+ return await diaryService.fillWakeup(
+ diary: diaryId,
+ wakeUp: time,
+ );
+ } catch (e) {
+ rethrow;
+ }
+ }
+
+ Future fillRetire({
+ required int diaryId,
+ required String time,
+ }) async {
+ try {
+ return await diaryService.fillRetire(
+ diary: diaryId,
+ retire: time,
+ );
+ } catch (e) {
+ rethrow;
+ }
+ }
}
diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart
index 6a519b71..8506e466 100644
--- a/lib/features/diary/services/diary_service.dart
+++ b/lib/features/diary/services/diary_service.dart
@@ -91,7 +91,7 @@ abstract class DiaryService {
@POST('/api/diary/{diary}/finishDay')
Future finishDiaryDay({
@Path('diary') required int diary,
- @Body() required FinishDiaryDayModel finishDiaryDayModel,
+ @Body(nullToAbsent: true) required FinishDiaryDayModel finishDiaryDayModel,
});
@POST('/api/diary/{diary}/meals/{type_no}/satiety/fill')
@@ -101,6 +101,13 @@ abstract class DiaryService {
@Field() required int satiety,
});
+ @POST('/api/diary/{diary}/meals/{type_no}/mood/fill')
+ Future fillMood({
+ @Path('diary') required int diary,
+ @Path('type_no') required int typeNo,
+ @Field() required int mood,
+ });
+
@POST('/api/diary/{diary}/meals/{type_no}/time/fill')
Future fillTime({
@Path('diary') required int diary,
@@ -108,6 +115,18 @@ abstract class DiaryService {
@Field() required String time,
});
+ @POST('/api/diary/{diary}/wakeUp/fill')
+ Future fillWakeup({
+ @Path('diary') required int diary,
+ @Field() required String wakeUp,
+ });
+
+ @POST('/api/diary/{diary}/retire/fill')
+ Future fillRetire({
+ @Path('diary') required int diary,
+ @Field() required String retire,
+ });
+
@POST('/api/diary/product_nutritional_values/sendToModeration')
Future sendProductToModeration({
@Body() required Map data,
diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart
index c369088f..16bd7dbe 100644
--- a/lib/features/diary/services/diary_service.g.dart
+++ b/lib/features/diary/services/diary_service.g.dart
@@ -366,6 +366,29 @@ class _DiaryService implements DiaryService {
await _dio.fetch(_options);
}
+ @override
+ Future fillMood({
+ required int diary,
+ required int typeNo,
+ required int mood,
+ }) async {
+ final _extra = {};
+ final queryParameters = {};
+ final _headers = {};
+ final _data = {'mood': mood};
+ final _options = _setStreamType(
+ Options(method: 'POST', headers: _headers, extra: _extra)
+ .compose(
+ _dio.options,
+ '/api/diary/${diary}/meals/${typeNo}/mood/fill',
+ queryParameters: queryParameters,
+ data: _data,
+ )
+ .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+ );
+ await _dio.fetch(_options);
+ }
+
@override
Future fillTime({
required int diary,
@@ -389,6 +412,44 @@ class _DiaryService implements DiaryService {
await _dio.fetch(_options);
}
+ @override
+ Future fillWakeup({required int diary, required String wakeUp}) async {
+ final _extra = {};
+ final queryParameters = {};
+ final _headers = {};
+ final _data = {'wakeUp': wakeUp};
+ final _options = _setStreamType(
+ Options(method: 'POST', headers: _headers, extra: _extra)
+ .compose(
+ _dio.options,
+ '/api/diary/${diary}/wakeUp/fill',
+ queryParameters: queryParameters,
+ data: _data,
+ )
+ .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+ );
+ await _dio.fetch(_options);
+ }
+
+ @override
+ Future fillRetire({required int diary, required String retire}) async {
+ final _extra = {};
+ final queryParameters = {};
+ final _headers = {};
+ final _data = {'retire': retire};
+ final _options = _setStreamType(
+ Options(method: 'POST', headers: _headers, extra: _extra)
+ .compose(
+ _dio.options,
+ '/api/diary/${diary}/retire/fill',
+ queryParameters: queryParameters,
+ data: _data,
+ )
+ .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+ );
+ await _dio.fetch(_options);
+ }
+
@override
Future sendProductToModeration({
required Map data,
diff --git a/lib/features/diets/presentation/pages/about_diet_screen.dart b/lib/features/diets/presentation/pages/about_diet_screen.dart
index 93668286..c5953c36 100644
--- a/lib/features/diets/presentation/pages/about_diet_screen.dart
+++ b/lib/features/diets/presentation/pages/about_diet_screen.dart
@@ -5,7 +5,6 @@ import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/enums/complained_content.dart';
import 'package:eatvio_app/core/enums/product_type.dart';
import 'package:eatvio_app/core/utils/localization_utils.dart';
-import 'package:eatvio_app/core/utils/string_extentions.dart';
import 'package:eatvio_app/core/widgets/bookmark_button.dart';
import 'package:eatvio_app/core/widgets/custom_divider.dart';
import 'package:eatvio_app/core/widgets/data_error_widget.dart';
@@ -219,8 +218,10 @@ class _AboutDietScreenState extends State {
),
if (replyId != null) SizedBox(width: 8),
Expanded(
- child: SizedBox(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(minHeight: 52),
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
onChanged: (_) {
setState(() {});
},
@@ -228,33 +229,34 @@ class _AboutDietScreenState extends State {
maxLines: 5,
minLines: 1,
keyboardType: TextInputType.multiline,
- style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ color: Colors.black,
+ height: 1.2,
+ ),
decoration: InputDecoration(
- isDense: true,
- contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
- hintText: s.comment.capitalize(),
- hintStyle: TextStyles.textMMedium.copyWith(color: appTheme.lightGray600),
+ isDense: false, // убираем true, чтобы padding учитывал�� корректно
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен
+ hintText: 'Комментарий',
+ hintStyle: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ height: 1.2,
+ color: Color(0xFFAEAEB2),
+ ),
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
),
),
diff --git a/lib/features/feed/models/plan_pagination_model.dart b/lib/features/feed/models/plan_pagination_model.dart
index 09c2129f..5af99db7 100644
--- a/lib/features/feed/models/plan_pagination_model.dart
+++ b/lib/features/feed/models/plan_pagination_model.dart
@@ -27,7 +27,7 @@ class PlanModel with _$PlanModel {
@JsonKey(name: "duration") required int duration,
@JsonKey(name: "state") required String state,
@JsonKey(name: "type", fromJson: planTypeFromJson) required PlanType type,
- @JsonKey(name: "details") required String details,
+ @JsonKey(name: "description_md") required String details,
@JsonKey(name: "packets_count") required int packetsCount,
@JsonKey(name: "packet1_options") PacketOptions? packet1Options,
@JsonKey(name: "packet2_options") PacketOptions? packet2Options,
diff --git a/lib/features/feed/models/plan_pagination_model.freezed.dart b/lib/features/feed/models/plan_pagination_model.freezed.dart
index 94799f51..bcf2a193 100644
--- a/lib/features/feed/models/plan_pagination_model.freezed.dart
+++ b/lib/features/feed/models/plan_pagination_model.freezed.dart
@@ -287,7 +287,7 @@ mixin _$PlanModel {
String get state => throw _privateConstructorUsedError;
@JsonKey(name: "type", fromJson: planTypeFromJson)
PlanType get type => throw _privateConstructorUsedError;
- @JsonKey(name: "details")
+ @JsonKey(name: "description_md")
String get details => throw _privateConstructorUsedError;
@JsonKey(name: "packets_count")
int get packetsCount => throw _privateConstructorUsedError;
@@ -337,7 +337,7 @@ abstract class $PlanModelCopyWith<$Res> {
@JsonKey(name: "duration") int duration,
@JsonKey(name: "state") String state,
@JsonKey(name: "type", fromJson: planTypeFromJson) PlanType type,
- @JsonKey(name: "details") String details,
+ @JsonKey(name: "description_md") String details,
@JsonKey(name: "packets_count") int packetsCount,
@JsonKey(name: "packet1_options") PacketOptions? packet1Options,
@JsonKey(name: "packet2_options") PacketOptions? packet2Options,
@@ -582,7 +582,7 @@ abstract class _$$PlanModelImplCopyWith<$Res>
@JsonKey(name: "duration") int duration,
@JsonKey(name: "state") String state,
@JsonKey(name: "type", fromJson: planTypeFromJson) PlanType type,
- @JsonKey(name: "details") String details,
+ @JsonKey(name: "description_md") String details,
@JsonKey(name: "packets_count") int packetsCount,
@JsonKey(name: "packet1_options") PacketOptions? packet1Options,
@JsonKey(name: "packet2_options") PacketOptions? packet2Options,
@@ -762,7 +762,7 @@ class _$PlanModelImpl implements _PlanModel {
@JsonKey(name: "duration") required this.duration,
@JsonKey(name: "state") required this.state,
@JsonKey(name: "type", fromJson: planTypeFromJson) required this.type,
- @JsonKey(name: "details") required this.details,
+ @JsonKey(name: "description_md") required this.details,
@JsonKey(name: "packets_count") required this.packetsCount,
@JsonKey(name: "packet1_options") this.packet1Options,
@JsonKey(name: "packet2_options") this.packet2Options,
@@ -802,7 +802,7 @@ class _$PlanModelImpl implements _PlanModel {
@JsonKey(name: "type", fromJson: planTypeFromJson)
final PlanType type;
@override
- @JsonKey(name: "details")
+ @JsonKey(name: "description_md")
final String details;
@override
@JsonKey(name: "packets_count")
@@ -935,7 +935,7 @@ abstract class _PlanModel implements PlanModel {
@JsonKey(name: "state") required final String state,
@JsonKey(name: "type", fromJson: planTypeFromJson)
required final PlanType type,
- @JsonKey(name: "details") required final String details,
+ @JsonKey(name: "description_md") required final String details,
@JsonKey(name: "packets_count") required final int packetsCount,
@JsonKey(name: "packet1_options") final PacketOptions? packet1Options,
@JsonKey(name: "packet2_options") final PacketOptions? packet2Options,
@@ -977,7 +977,7 @@ abstract class _PlanModel implements PlanModel {
@JsonKey(name: "type", fromJson: planTypeFromJson)
PlanType get type;
@override
- @JsonKey(name: "details")
+ @JsonKey(name: "description_md")
String get details;
@override
@JsonKey(name: "packets_count")
diff --git a/lib/features/feed/models/plan_pagination_model.g.dart b/lib/features/feed/models/plan_pagination_model.g.dart
index 5b2921d8..f9a2ccee 100644
--- a/lib/features/feed/models/plan_pagination_model.g.dart
+++ b/lib/features/feed/models/plan_pagination_model.g.dart
@@ -34,7 +34,7 @@ _$PlanModelImpl _$$PlanModelImplFromJson(Map json) =>
duration: (json['duration'] as num).toInt(),
state: json['state'] as String,
type: planTypeFromJson(json['type']),
- details: json['details'] as String,
+ details: json['description_md'] as String,
packetsCount: (json['packets_count'] as num).toInt(),
packet1Options:
json['packet1_options'] == null
@@ -73,7 +73,7 @@ Map _$$PlanModelImplToJson(_$PlanModelImpl instance) =>
'duration': instance.duration,
'state': instance.state,
'type': instance.type,
- 'details': instance.details,
+ 'description_md': instance.details,
'packets_count': instance.packetsCount,
'packet1_options': instance.packet1Options,
'packet2_options': instance.packet2Options,
diff --git a/lib/features/feed/models/recipes_model.dart b/lib/features/feed/models/recipes_model.dart
index f32fc011..3a5b56ff 100644
--- a/lib/features/feed/models/recipes_model.dart
+++ b/lib/features/feed/models/recipes_model.dart
@@ -13,7 +13,7 @@ class Recipe with _$Recipe {
@JsonKey(name: 'cooking_time') required int cookingTime,
@JsonKey(name: 'active_time') required int activeCookingTime,
required List? ingredients,
- required String description,
+ @JsonKey(name: 'description_md') required String description,
required List? steps,
@JsonKey(name: 'video_url') required String? videoUrl,
@JsonKey(name: 'created_at') required DateTime createdAt,
diff --git a/lib/features/feed/models/recipes_model.freezed.dart b/lib/features/feed/models/recipes_model.freezed.dart
index 21c0d2c1..3e062bab 100644
--- a/lib/features/feed/models/recipes_model.freezed.dart
+++ b/lib/features/feed/models/recipes_model.freezed.dart
@@ -29,6 +29,7 @@ mixin _$Recipe {
@JsonKey(name: 'active_time')
int get activeCookingTime => throw _privateConstructorUsedError;
List? get ingredients => throw _privateConstructorUsedError;
+ @JsonKey(name: 'description_md')
String get description => throw _privateConstructorUsedError;
List? get steps => throw _privateConstructorUsedError;
@JsonKey(name: 'video_url')
@@ -75,7 +76,7 @@ abstract class $RecipeCopyWith<$Res> {
@JsonKey(name: 'cooking_time') int cookingTime,
@JsonKey(name: 'active_time') int activeCookingTime,
List? ingredients,
- String description,
+ @JsonKey(name: 'description_md') String description,
List? steps,
@JsonKey(name: 'video_url') String? videoUrl,
@JsonKey(name: 'created_at') DateTime createdAt,
@@ -270,7 +271,7 @@ abstract class _$$RecipesImplCopyWith<$Res> implements $RecipeCopyWith<$Res> {
@JsonKey(name: 'cooking_time') int cookingTime,
@JsonKey(name: 'active_time') int activeCookingTime,
List? ingredients,
- String description,
+ @JsonKey(name: 'description_md') String description,
List? steps,
@JsonKey(name: 'video_url') String? videoUrl,
@JsonKey(name: 'created_at') DateTime createdAt,
@@ -449,7 +450,7 @@ class _$RecipesImpl implements _Recipes {
@JsonKey(name: 'cooking_time') required this.cookingTime,
@JsonKey(name: 'active_time') required this.activeCookingTime,
required final List? ingredients,
- required this.description,
+ @JsonKey(name: 'description_md') required this.description,
required final List? steps,
@JsonKey(name: 'video_url') required this.videoUrl,
@JsonKey(name: 'created_at') required this.createdAt,
@@ -493,6 +494,7 @@ class _$RecipesImpl implements _Recipes {
}
@override
+ @JsonKey(name: 'description_md')
final String description;
final List? _steps;
@override
@@ -637,7 +639,7 @@ abstract class _Recipes implements Recipe {
@JsonKey(name: 'cooking_time') required final int cookingTime,
@JsonKey(name: 'active_time') required final int activeCookingTime,
required final List? ingredients,
- required final String description,
+ @JsonKey(name: 'description_md') required final String description,
required final List? steps,
@JsonKey(name: 'video_url') required final String? videoUrl,
@JsonKey(name: 'created_at') required final DateTime createdAt,
@@ -671,6 +673,7 @@ abstract class _Recipes implements Recipe {
@override
List? get ingredients;
@override
+ @JsonKey(name: 'description_md')
String get description;
@override
List? get steps;
diff --git a/lib/features/feed/models/recipes_model.g.dart b/lib/features/feed/models/recipes_model.g.dart
index 207de5f7..43a99cb9 100644
--- a/lib/features/feed/models/recipes_model.g.dart
+++ b/lib/features/feed/models/recipes_model.g.dart
@@ -17,7 +17,7 @@ _$RecipesImpl _$$RecipesImplFromJson(Map json) =>
(json['ingredients'] as List?)
?.map((e) => Ingredient.fromJson(e as Map))
.toList(),
- description: json['description'] as String,
+ description: json['description_md'] as String,
steps:
(json['steps'] as List?)
?.map((e) => Step.fromJson(e as Map))
@@ -45,7 +45,7 @@ Map _$$RecipesImplToJson(_$RecipesImpl instance) =>
'cooking_time': instance.cookingTime,
'active_time': instance.activeCookingTime,
'ingredients': instance.ingredients,
- 'description': instance.description,
+ 'description_md': instance.description,
'steps': instance.steps,
'video_url': instance.videoUrl,
'created_at': instance.createdAt.toIso8601String(),
diff --git a/lib/features/feed/presentation/widgets/blog_post_widget.dart b/lib/features/feed/presentation/widgets/blog_post_widget.dart
index 3e066448..915b3fa0 100644
--- a/lib/features/feed/presentation/widgets/blog_post_widget.dart
+++ b/lib/features/feed/presentation/widgets/blog_post_widget.dart
@@ -4,6 +4,7 @@ import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/utils/date_time_utils.dart';
import 'package:eatvio_app/core/widgets/feed_icon_button.dart';
import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_state.dart';
@@ -58,37 +59,54 @@ class _BlogPostWidgetState extends State {
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(
children: [
- CircleAvatar(
- radius: 20,
- backgroundColor: Colors.black12,
- foregroundImage: NetworkImage(
- state.feedBlogPostList[widget.index].author.authorProfileIcon,
+ GestureDetector(
+ onTap: () {
+ GoRouter.of(context).pushNamed(
+ 'profileScreen',
+ extra: Author(
+ authorSlug: state.feedBlogPostList[widget.index].author.authorSlug,
+ authorName: state.feedBlogPostList[widget.index].author.authorName,
+ authorProfileIcon: state.feedBlogPostList[widget.index].author.authorProfileIcon,
+ authorIsMe: state.feedBlogPostList[widget.index].author.authorIsMe,
+ ),
+ );
+ },
+ child: Row(
+ children: [
+ CircleAvatar(
+ radius: 20,
+ backgroundColor: Colors.black12,
+ foregroundImage: NetworkImage(
+ state.feedBlogPostList[widget.index].author.authorProfileIcon,
+ ),
+ ),
+ SizedBox(width: 8),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ state.feedBlogPostList[widget.index].author.authorName,
+ style: TextStyle(
+ height: 1,
+ color: Colors.black87,
+ fontWeight: FontWeight.w500,
+ fontSize: 16,
+ ),
+ ),
+ const SizedBox(height: 4),
+ Text(
+ '${calculateDifference(state.feedBlogPostList[widget.index].createdAt)} в ${state.feedBlogPostList[widget.index].createdAt.hour.toString().padLeft(2, '0')}:${state.feedBlogPostList[widget.index].createdAt.minute.toString().padLeft(2, '0')}',
+ style: TextStyle(
+ height: 1,
+ color: Colors.black45,
+ fontSize: 14,
+ ),
+ ),
+ ],
+ ),
+ ],
),
),
- SizedBox(width: 8),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- state.feedBlogPostList[widget.index].author.authorName,
- style: TextStyle(
- height: 1,
- color: Colors.black87,
- fontWeight: FontWeight.w500,
- fontSize: 16,
- ),
- ),
- const SizedBox(height: 4),
- Text(
- '${calculateDifference(state.feedBlogPostList[widget.index].createdAt)} в ${state.feedBlogPostList[widget.index].createdAt.hour.toString().padLeft(2, '0')}:${state.feedBlogPostList[widget.index].createdAt.minute.toString().padLeft(2, '0')}',
- style: TextStyle(
- height: 1,
- color: Colors.black45,
- fontSize: 14,
- ),
- ),
- ],
- ),
const Spacer(),
if (!(state.feedBlogPostList[widget.index].author.isEntitySubscribedByMe ?? false) &&
!state.feedBlogPostList[widget.index].author.authorIsMe)
diff --git a/lib/features/feed/presentation/widgets/plan_widget.dart b/lib/features/feed/presentation/widgets/plan_widget.dart
index 5d3f5bda..12ab8ec7 100644
--- a/lib/features/feed/presentation/widgets/plan_widget.dart
+++ b/lib/features/feed/presentation/widgets/plan_widget.dart
@@ -5,6 +5,7 @@ import 'package:eatvio_app/core/widgets/bookmark_button.dart';
import 'package:eatvio_app/core/widgets/info_row.dart';
import 'package:eatvio_app/core/widgets/feed_icon_button.dart';
import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart';
import 'package:eatvio_app/core/theme/custom_text_style.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
@@ -127,50 +128,63 @@ class _PlanWidgetState extends State {
],
),
SizedBox(height: 16),
- Padding(
- padding: const EdgeInsets.only(left: 16.0),
- child: ListTile(
- contentPadding: EdgeInsets.zero,
- leading: Container(
- width: 46,
- height: 46,
- decoration: BoxDecoration(
- shape: BoxShape.circle,
- image: DecorationImage(
- image: NetworkImage(widget.plan.author.authorProfileIcon),
- fit: BoxFit.cover,
+ GestureDetector(
+ onTap: () {
+ GoRouter.of(context).pushNamed(
+ 'profileScreen',
+ extra: Author(
+ authorSlug: widget.plan.author.authorSlug,
+ authorName: widget.plan.author.authorName,
+ authorProfileIcon: widget.plan.author.authorProfileIcon,
+ authorIsMe: widget.plan.author.authorIsMe,
+ ),
+ );
+ },
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16.0),
+ child: ListTile(
+ contentPadding: EdgeInsets.zero,
+ leading: Container(
+ width: 46,
+ height: 46,
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ image: DecorationImage(
+ image: NetworkImage(widget.plan.author.authorProfileIcon),
+ fit: BoxFit.cover,
+ ),
),
),
- ),
- subtitle: Row(
- children: [
- InfoBouble(
- radius: 12,
- backgroundColor: appTheme.gray50,
- padding: EdgeInsets.symmetric(vertical: 4, horizontal: 10),
- children: [
- Text(
- '${widget.plan.author.authorPlaceInRating}-й в рейтинге',
- style: TextStyles.textXSSemibold.copyWith(
- color: appTheme.blueA400,
+ subtitle: Row(
+ children: [
+ InfoBouble(
+ radius: 12,
+ backgroundColor: appTheme.gray50,
+ padding: EdgeInsets.symmetric(vertical: 4, horizontal: 10),
+ children: [
+ Text(
+ '${widget.plan.author.authorPlaceInRating}-й в рейтинге',
+ style: TextStyles.textXSSemibold.copyWith(
+ color: appTheme.blueA400,
+ ),
),
- ),
- ],
- ),
- Spacer(),
- Text(
- '${widget.plan.packetsCount == 1 ? widget.plan.packet1Options?.price : '${s.from} ${widget.plan.minPriceOfOptions.toStringAsFixed(0)}'}₽',
- style: TextStyles.headingXLSemibold.copyWith(color: appTheme.greenA700),
- ),
- SizedBox(width: 16),
- ],
- ),
- title: Padding(
- padding: const EdgeInsets.only(bottom: 4.0),
- child: Text(
- widget.plan.author.authorName,
- style: TextStyles.textSSemibold.copyWith(
- color: appTheme.black,
+ ],
+ ),
+ Spacer(),
+ Text(
+ '${widget.plan.packetsCount == 1 ? widget.plan.packet1Options?.price : '${s.from} ${widget.plan.minPriceOfOptions.toStringAsFixed(0)}'}₽',
+ style: TextStyles.headingXLSemibold.copyWith(color: appTheme.greenA700),
+ ),
+ SizedBox(width: 16),
+ ],
+ ),
+ title: Padding(
+ padding: const EdgeInsets.only(bottom: 4.0),
+ child: Text(
+ widget.plan.author.authorName,
+ style: TextStyles.textSSemibold.copyWith(
+ color: appTheme.black,
+ ),
),
),
),
diff --git a/lib/features/plans/presentation/pages/about_plan_screen.dart b/lib/features/plans/presentation/pages/about_plan_screen.dart
index c34985a1..4ec3a327 100644
--- a/lib/features/plans/presentation/pages/about_plan_screen.dart
+++ b/lib/features/plans/presentation/pages/about_plan_screen.dart
@@ -5,7 +5,6 @@ import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/enums/complained_content.dart';
import 'package:eatvio_app/core/enums/product_type.dart';
import 'package:eatvio_app/core/utils/localization_utils.dart';
-import 'package:eatvio_app/core/utils/string_extentions.dart';
import 'package:eatvio_app/core/widgets/bookmark_button.dart';
import 'package:eatvio_app/core/widgets/data_error_widget.dart';
import 'package:eatvio_app/core/widgets/info_row.dart';
@@ -289,8 +288,10 @@ class _AboutPlanScreenState extends State {
),
if (replyId != null) SizedBox(width: 8),
Expanded(
- child: SizedBox(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(minHeight: 52),
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
onChanged: (_) {
setState(() {});
},
@@ -298,33 +299,34 @@ class _AboutPlanScreenState extends State {
maxLines: 5,
minLines: 1,
keyboardType: TextInputType.multiline,
- style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ color: Colors.black,
+ height: 1.2,
+ ),
decoration: InputDecoration(
- isDense: true,
- contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
- hintText: s.comment.capitalize(),
- hintStyle: TextStyles.textMMedium.copyWith(color: appTheme.lightGray600),
+ isDense: false, // убираем true, чтобы padding учитывал�� корректно
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен
+ hintText: 'Комментарий',
+ hintStyle: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ height: 1.2,
+ color: Color(0xFFAEAEB2),
+ ),
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
),
),
diff --git a/lib/features/recipe/presentation/about_recipe_screen.dart b/lib/features/recipe/presentation/about_recipe_screen.dart
index 029b9c0f..f2a15edd 100644
--- a/lib/features/recipe/presentation/about_recipe_screen.dart
+++ b/lib/features/recipe/presentation/about_recipe_screen.dart
@@ -6,7 +6,6 @@ import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/core/enums/complained_content.dart';
import 'package:eatvio_app/core/enums/product_type.dart';
import 'package:eatvio_app/core/utils/localization_utils.dart';
-import 'package:eatvio_app/core/utils/string_extentions.dart';
import 'package:eatvio_app/core/utils/toasts.dart';
import 'package:eatvio_app/core/widgets/bookmark_button.dart';
import 'package:eatvio_app/core/widgets/data_error_widget.dart';
@@ -149,8 +148,10 @@ class _AboutRecipeScreenState extends State {
),
if (replyId != null) SizedBox(width: 8),
Expanded(
- child: SizedBox(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(minHeight: 52),
child: TextFormField(
+ textCapitalization: TextCapitalization.sentences,
onChanged: (_) {
setState(() {});
},
@@ -158,39 +159,40 @@ class _AboutRecipeScreenState extends State {
maxLines: 5,
minLines: 1,
keyboardType: TextInputType.multiline,
- style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ color: Colors.black,
+ height: 1.2,
+ ),
decoration: InputDecoration(
- isDense: true,
- contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
- hintText: s.comment.capitalize(),
- hintStyle: TextStyles.textMMedium.copyWith(color: appTheme.lightGray600),
+ isDense: false, // убираем true, чтобы padding учитывал�� корректно
+ contentPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), // вертикальный паддинг увеличен
+ hintText: 'Комментарий',
+ hintStyle: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w400,
+ height: 1.2,
+ color: Color(0xFFAEAEB2),
+ ),
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(16),
- borderSide: BorderSide(
- color: Color(0xFFD1D1D6),
- width: 1,
- ),
+ borderSide: BorderSide(color: Color(0xFFD1D1D6), width: 1),
),
),
),
),
),
- SizedBox(width: 8),
+ const SizedBox(width: 8),
GestureDetector(
onTap: () {
if (textEditingController.text.length > 2) {
@@ -212,17 +214,10 @@ class _AboutRecipeScreenState extends State {
}
},
child: Container(
- decoration: BoxDecoration(
- color: textEditingController.text.length > 2 ? appTheme.blueA400 : appTheme.gray50,
- shape: BoxShape.circle,
- ),
+ decoration: BoxDecoration(color: textEditingController.text.length > 2 ? appTheme.blueA400 : Colors.grey, shape: BoxShape.circle),
height: 32,
width: 32,
- child: Icon(
- Icons.send_rounded,
- size: 18,
- color: textEditingController.text.length > 2 ? appTheme.whiteA700 : appTheme.black,
- ),
+ child: Icon(Icons.send_rounded, size: 18, color: Colors.white),
),
),
],
diff --git a/test/widget_test.dart b/test/widget_test.dart
deleted file mode 100644
index da093caf..00000000
--- a/test/widget_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// This is a basic Flutter widget test.
-//
-// To perform an interaction with a widget in your test, use the WidgetTester
-// utility in the flutter_test package. For example, you can send tap and scroll
-// gestures. You can also use WidgetTester to find child widgets in the widget
-// tree, read text, and verify that the values of widget properties are correct.
-
-import 'package:flutter/material.dart';
-import 'package:flutter_test/flutter_test.dart';
-
-import 'package:eatvio_app/main.dart';
-
-void main() {
- testWidgets('Counter increments smoke test', (WidgetTester tester) async {
- // Build our app and trigger a frame.
- await tester.pumpWidget(MyApp());
-
- // Verify that our counter starts at 0.
- expect(find.text('0'), findsOneWidget);
- expect(find.text('1'), findsNothing);
-
- // Tap the '+' icon and trigger a frame.
- await tester.tap(find.byIcon(Icons.add));
- await tester.pump();
-
- // Verify that our counter has incremented.
- expect(find.text('0'), findsNothing);
- expect(find.text('1'), findsOneWidget);
- });
-}