diff --git a/android/app/.cxx/Debug/5y6c3x6h/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/5y6c3x6h/arm64-v8a/configure_fingerprint.bin
index 781d1c2f..51cc237b 100644
--- a/android/app/.cxx/Debug/5y6c3x6h/arm64-v8a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/5y6c3x6h/arm64-v8a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Logc
a
_C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\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`
^
-\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\android_gradle_build.json Ó½ùêÑ2¡ “õ‘×Ñ2e
+\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\android_gradle_build.json �³üâÔ2¡ “õ‘×Ñ2e
c
-aC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\android_gradle_build_mini.json Ó½ùêÑ2€ ¤õ‘×Ñ2R
+aC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\android_gradle_build_mini.json �³üâÔ2€ ¤õ‘×Ñ2R
P
-NC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build.ninja Ó½ùêÑ2¥Ò †ô‘×Ñ2V
+NC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build.ninja �³üâÔ2¥Ò †ô‘×Ñ2V
T
-RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build.ninja.txt Ó½ùêÑ2[
+RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build.ninja.txt �³üâÔ2[
Y
-WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build_file_index.txt Ó½ùêÑ2
R ¬õ‘×Ñ2\
+WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\build_file_index.txt �³üâÔ2
R ¬õ‘×Ñ2\
Z
-XC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\compile_commands.json Ó½ùêÑ2`
+XC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\compile_commands.json �³üâÔ2`
^
-\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\compile_commands.json.bin Ó½ùêÑ2 f
+\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\compile_commands.json.bin �³üâÔ2 f
d
-bC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\metadata_generation_command.txt Ó½ùêÑ2
+bC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\metadata_generation_command.txt �³üâÔ2
« ¨õ‘×Ñ2Y
W
-UC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\prefab_config.json Ó½ùêÑ2
( ©õ‘×Ñ2^
+UC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\prefab_config.json �³üâÔ2
( ©õ‘×Ñ2^
\
-ZC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\symbol_folder_index.txt Ó½ùêÑ2
Q «õ‘×Ñ2V
+ZC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\arm64-v8a\symbol_folder_index.txt �³üâÔ2
Q «õ‘×Ñ2V
T
-RC:\Users\Alex\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt Ó½ùêÑ2
§ �¶ðÖÑ2
\ No newline at end of file
+RC:\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/5y6c3x6h/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/5y6c3x6h/armeabi-v7a/configure_fingerprint.bin
index 10948e63..557aff8a 100644
--- a/android/app/.cxx/Debug/5y6c3x6h/armeabi-v7a/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/5y6c3x6h/armeabi-v7a/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Loge
c
aC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ¥¾ùêÑ2 ·É“×Ñ2b
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint Ÿ³üâÔ2 ·É“×Ñ2b
`
-^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\android_gradle_build.json ¦¾ùêÑ2¥ ¿É“×Ñ2g
+^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\android_gradle_build.json Ÿ³üâÔ2¥ ¿É“×Ñ2g
e
-cC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\android_gradle_build_mini.json ¦¾ùêÑ2„ ÆÉ“×Ñ2T
+cC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\android_gradle_build_mini.json Ÿ³üâÔ2„ ÆÉ“×Ñ2T
R
-PC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build.ninja ¦¾ùêÑ2¯Ò ´È“×Ñ2X
+PC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build.ninja Ÿ³üâÔ2¯Ò ´È“×Ñ2X
V
-TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build.ninja.txt ¦¾ùêÑ2]
+TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build.ninja.txt Ÿ³üâÔ2]
[
-YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build_file_index.txt ¦¾ùêÑ2
R ÊÉ“×Ñ2^
+YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\build_file_index.txt Ÿ³üâÔ2
R ÊÉ“×Ñ2^
\
-ZC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\compile_commands.json §¾ùêÑ2b
+ZC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\compile_commands.json Ÿ³üâÔ2b
`
-^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\compile_commands.json.bin §¾ùêÑ2 h
+^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\compile_commands.json.bin ³üâÔ2 h
f
-dC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\metadata_generation_command.txt §¾ùêÑ2
+dC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\metadata_generation_command.txt ³üâÔ2
µ ÇÉ“×Ñ2[
Y
-WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\prefab_config.json §¾ùêÑ2
( ÈÉ“×Ñ2`
+WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\prefab_config.json ³üâÔ2
( ÈÉ“×Ñ2`
^
-\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\symbol_folder_index.txt §¾ùêÑ2
S ÉÉ“×Ñ2V
+\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\armeabi-v7a\symbol_folder_index.txt ³üâÔ2
S ÉÉ“×Ñ2V
T
-RC:\Users\Alex\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt ©¾ùêÑ2
§ �¶ðÖÑ2
\ No newline at end of file
+RC:\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/5y6c3x6h/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/5y6c3x6h/x86/configure_fingerprint.bin
index a5f9e007..740fa00d 100644
--- a/android/app/.cxx/Debug/5y6c3x6h/x86/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/5y6c3x6h/x86/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log]
[
YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\additional_project_files.txtC
A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint â¾ùêÑ2 “‚”×Ñ2Z
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint ±³üâÔ2 “‚”×Ñ2Z
X
-VC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\android_gradle_build.json â¾ùêÑ2• ™‚”×Ñ2_
+VC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\android_gradle_build.json ±³üâÔ2• ™‚”×Ñ2_
]
-[C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\android_gradle_build_mini.json â¾ùêÑ2ô Ÿ‚”×Ñ2L
+[C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\android_gradle_build_mini.json ²³üâÔ2ô Ÿ‚”×Ñ2L
J
-HC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build.ninja â¾ùêÑ2‡Ò ¾�”×Ñ2P
+HC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build.ninja ²³üâÔ2‡Ò ¾�”×Ñ2P
N
-LC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build.ninja.txt â¾ùêÑ2U
+LC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build.ninja.txt ²³üâÔ2U
S
-QC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build_file_index.txt â¾ùêÑ2
R §‚”×Ñ2V
+QC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\build_file_index.txt ²³üâÔ2
R §‚”×Ñ2V
T
-RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\compile_commands.json â¾ùêÑ2Z
+RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\compile_commands.json ²³üâÔ2Z
X
-VC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\compile_commands.json.bin â¾ùêÑ2 `
+VC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\compile_commands.json.bin ²³üâÔ2 `
^
-\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\metadata_generation_command.txt â¾ùêÑ2
+\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\metadata_generation_command.txt ²³üâÔ2
� ‚”×Ñ2S
Q
-OC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\prefab_config.json â¾ùêÑ2
( £‚”×Ñ2X
+OC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\prefab_config.json ²³üâÔ2
( £‚”×Ñ2X
V
-TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\symbol_folder_index.txt â¾ùêÑ2
K ¥‚”×Ñ2V
+TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86\symbol_folder_index.txt ²³üâÔ2
K ¥‚”×Ñ2V
T
-RC:\Users\Alex\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt â¾ùêÑ2
§ �¶ðÖÑ2
\ No newline at end of file
+RC:\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/5y6c3x6h/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/5y6c3x6h/x86_64/configure_fingerprint.bin
index d1302ace..bcc36e44 100644
--- a/android/app/.cxx/Debug/5y6c3x6h/x86_64/configure_fingerprint.bin
+++ b/android/app/.cxx/Debug/5y6c3x6h/x86_64/configure_fingerprint.bin
@@ -2,27 +2,27 @@ C/C++ Structured Log`
^
\C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\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]
[
-YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\android_gradle_build.json ˜¿ùêÑ2› ¥�”×Ñ2b
+YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\android_gradle_build.json ³üâÔ2› ¥�”×Ñ2b
`
-^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\android_gradle_build_mini.json ˜¿ùêÑ2ú ¬�”×Ñ2O
+^C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\android_gradle_build_mini.json ³üâÔ2ú ¬�”×Ñ2O
M
-KC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build.ninja ˜¿ùêÑ2–Ò ÈŒ”×Ñ2S
+KC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build.ninja ³üâÔ2–Ò ÈŒ”×Ñ2S
Q
-OC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build.ninja.txt ˜¿ùêÑ2X
+OC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build.ninja.txt ³üâÔ2X
V
-TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build_file_index.txt ˜¿ùêÑ2
R ¹�”×Ñ2Y
+TC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\build_file_index.txt ³üâÔ2
R ¹�”×Ñ2Y
W
-UC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\compile_commands.json ˜¿ùêÑ2]
+UC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\compile_commands.json ³üâÔ2]
[
-YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\compile_commands.json.bin ˜¿ùêÑ2 c
+YC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\compile_commands.json.bin ³üâÔ2 c
a
-_C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\metadata_generation_command.txt ˜¿ùêÑ2
+_C:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\metadata_generation_command.txt ³üâÔ2
œ ®�”×Ñ2V
T
-RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\prefab_config.json ˜¿ùêÑ2
( °�”×Ñ2[
+RC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\prefab_config.json ³üâÔ2
( °�”×Ñ2[
Y
-WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\symbol_folder_index.txt ˜¿ùêÑ2
N ·�”×Ñ2V
+WC:\Users\Alex\eatvio_app\android\app\.cxx\Debug\5y6c3x6h\x86_64\symbol_folder_index.txt ³üâÔ2
N ·�”×Ñ2V
T
-RC:\Users\Alex\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt ˜¿ùêÑ2
§ �¶ðÖÑ2
\ No newline at end of file
+RC:\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/mir.svg b/assets/icons/mir.svg
new file mode 100644
index 00000000..6fcc4027
--- /dev/null
+++ b/assets/icons/mir.svg
@@ -0,0 +1,17 @@
+
diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart
index 135b465e..eed56e2c 100644
--- a/lib/core/app_router.dart
+++ b/lib/core/app_router.dart
@@ -29,6 +29,9 @@ import 'package:eatvio_app/features/feed/presentation/pages/feed_screen.dart';
import 'package:eatvio_app/features/glossary/presentation/pages/glossary_screen.dart';
import 'package:eatvio_app/features/menu/presentation/pages/menu_screen.dart';
import 'package:eatvio_app/features/my_diets/presentation/my_diets_screen.dart';
+import 'package:eatvio_app/features/my_finance/presentation/pages/card_settings.dart';
+import 'package:eatvio_app/features/my_finance/presentation/pages/consultant_finance_screen.dart';
+import 'package:eatvio_app/features/my_finance/presentation/pages/user_finance_screen.dart';
import 'package:eatvio_app/features/my_plans/presentation/my_plans_screen.dart';
import 'package:eatvio_app/features/notifications/presentation/pages/notifications_screen.dart';
import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart';
@@ -138,10 +141,34 @@ class AppRouter {
GoRoute(
path: '/menu-screen',
name: 'menuScreen',
- pageBuilder: (context, state) => NoTransitionPage(child: MenuScreen()),
+ pageBuilder: (context, state) => NoTransitionPage(
+ child: BlocBuilder(
+ builder: (BuildContext context, ProfileAvatarState state) {
+ if (state is ProfileAvatarStateLoaded) {
+ return MenuScreen(profileModel: state.profile);
+ }
+ return SizedBox.shrink();
+ },
+ ),
+ ),
),
],
),
+ GoRoute(
+ path: '/consultant-finance-screen',
+ name: 'consultantFinanceScreen',
+ builder: (context, state) => ConsultantFinanceScreen(),
+ ),
+ GoRoute(
+ path: '/user-finance-screen',
+ name: 'userFinanceScreen',
+ builder: (context, state) => UserFinanceScreen(),
+ ),
+ GoRoute(
+ path: '/card-settings-screen',
+ name: 'cardSettingsScreen',
+ builder: (context, state) => CardSettingsScreen(),
+ ),
GoRoute(
path: '/about-plan-screen',
name: 'aboutPlanScreen',
@@ -156,7 +183,7 @@ class AppRouter {
),
GoRoute(
path: '/glossary-screen',
- name: '/glossaryScreen',
+ name: 'glossaryScreen',
builder: (context, state) => GlossaryScreen(),
),
GoRoute(
diff --git a/lib/features/consultations/presentation/pages/consultations_screen.dart b/lib/features/consultations/presentation/pages/consultations_screen.dart
index 5fd3086b..b64bf260 100644
--- a/lib/features/consultations/presentation/pages/consultations_screen.dart
+++ b/lib/features/consultations/presentation/pages/consultations_screen.dart
@@ -12,6 +12,11 @@ class ConsultationsScreen extends StatelessWidget {
appBar: AppBar(
title: Text('Кон�ультации'),
centerTitle: true,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadiusDirectional.vertical(
+ bottom: Radius.circular(12),
+ ),
+ ),
),
body: ListView.separated(
padding: EdgeInsets.symmetric(vertical: 12),
diff --git a/lib/features/menu/presentation/pages/menu_screen.dart b/lib/features/menu/presentation/pages/menu_screen.dart
index cfc2e8a1..45728f70 100644
--- a/lib/features/menu/presentation/pages/menu_screen.dart
+++ b/lib/features/menu/presentation/pages/menu_screen.dart
@@ -7,12 +7,18 @@ import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/dev_tools/presentation/dev_tools_screen.dart';
import 'package:eatvio_app/features/my_diets/presentation/my_diets_screen.dart';
import 'package:eatvio_app/features/my_plans/presentation/my_plans_screen.dart';
+import 'package:eatvio_app/features/profile/models/profile_model.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
class MenuScreen extends StatelessWidget {
- MenuScreen({super.key});
+ final ProfileModel profileModel;
+
+ const MenuScreen({
+ super.key,
+ required this.profileModel,
+ });
@override
Widget build(BuildContext context) {
@@ -29,23 +35,38 @@ class MenuScreen extends StatelessWidget {
leading: ImageConstant.icnProfileSettings,
onTap: () => GoRouter.of(context).push('/settings-screen'),
),
+ if (profileModel.roles.contains('consultant')) _divider(context),
+ if (profileModel.roles.contains('consultant'))
+ _tile(
+ leading: ImageConstant.icnRecipes,
+ title: 'Мои рецепты',
+ onTap: () => GoRouter.of(context).push('/recipe-select-screen'),
+ ),
+ if (profileModel.roles.contains('consultant')) _divider(context),
+ if (profileModel.roles.contains('consultant'))
+ _tile(
+ leading: 'assets/icons/diets.svg',
+ title: 'Мои диеты',
+ onTap: () => GoRouter.of(context).push(MyDietsScreen.path),
+ ),
+ if (profileModel.roles.contains('consultant')) _divider(context),
+ if (profileModel.roles.contains('consultant'))
+ _tile(
+ leading: ImageConstant.icnPlans,
+ title: 'Мои планы',
+ onTap: () => GoRouter.of(context).push(MyPlansScreen.path),
+ ),
_divider(context),
_tile(
- leading: ImageConstant.icnRecipes,
- title: 'Мои рецепты',
- onTap: () => GoRouter.of(context).push('/recipe-select-screen'),
- ),
- _divider(context),
- _tile(
- leading: 'assets/icons/diets.svg',
- title: 'Мои диеты',
- onTap: () => GoRouter.of(context).push(MyDietsScreen.path),
- ),
- _divider(context),
- _tile(
- leading: ImageConstant.icnPlans,
- title: 'Мои планы',
- onTap: () => GoRouter.of(context).push(MyPlansScreen.path),
+ leading: 'assets/icons/finance.svg',
+ title: 'Мои финан�ы',
+ onTap: () {
+ if (profileModel.roles.contains('consultant')) {
+ GoRouter.of(context).pushNamed('consultantFinanceScreen');
+ } else {
+ GoRouter.of(context).pushNamed('userFinanceScreen');
+ }
+ },
),
_divider(context),
_tile(
diff --git a/lib/features/my_finance/entities/consultant_finance_entity.dart b/lib/features/my_finance/entities/consultant_finance_entity.dart
new file mode 100644
index 00000000..48f0eceb
--- /dev/null
+++ b/lib/features/my_finance/entities/consultant_finance_entity.dart
@@ -0,0 +1,80 @@
+enum ConsultationStatus {
+ Completed,
+ Canceled,
+ CanceledByInitiator,
+}
+
+class ConsultantFinanceEntity {
+ final int totalConsultationsCount;
+ final int completedCount;
+ final int canceledCount;
+ final int canceledByInitiatorCount;
+ final List consultationsList;
+
+ ConsultantFinanceEntity({
+ required this.totalConsultationsCount,
+ required this.completedCount,
+ required this.canceledCount,
+ required this.canceledByInitiatorCount,
+ required this.consultationsList,
+ });
+}
+
+class ConsultationFinanceCardEntity {
+ final String id;
+ final DateTime date;
+ final String title;
+ final String clientName;
+ final int planDuration;
+ final int price;
+ final ConsultationStatus status;
+
+ ConsultationFinanceCardEntity({
+ required this.id,
+ required this.date,
+ required this.title,
+ required this.clientName,
+ required this.planDuration,
+ required this.price,
+ required this.status,
+ });
+}
+
+// Test data
+final testConsultations = [
+ ConsultationFinanceCardEntity(
+ id: '1',
+ date: DateTime.now(),
+ title: 'Consultation A',
+ clientName: 'Alice',
+ planDuration: 30,
+ price: 100,
+ status: ConsultationStatus.Completed,
+ ),
+ ConsultationFinanceCardEntity(
+ id: '2',
+ date: DateTime.now().subtract(Duration(days: 1)),
+ title: 'Consultation B',
+ clientName: 'Bob',
+ planDuration: 45,
+ price: 150,
+ status: ConsultationStatus.Canceled,
+ ),
+ ConsultationFinanceCardEntity(
+ id: '3',
+ date: DateTime.now().subtract(Duration(days: 2)),
+ title: 'Consultation C',
+ clientName: 'Charlie',
+ planDuration: 60,
+ price: 200,
+ status: ConsultationStatus.CanceledByInitiator,
+ ),
+];
+
+final testFinanceEntity = ConsultantFinanceEntity(
+ totalConsultationsCount: testConsultations.length,
+ completedCount: testConsultations.where((c) => c.status == ConsultationStatus.Completed).length,
+ canceledCount: testConsultations.where((c) => c.status == ConsultationStatus.Canceled).length,
+ canceledByInitiatorCount: testConsultations.where((c) => c.status == ConsultationStatus.CanceledByInitiator).length,
+ consultationsList: testConsultations,
+);
diff --git a/lib/features/my_finance/presentation/pages/card_settings.dart b/lib/features/my_finance/presentation/pages/card_settings.dart
new file mode 100644
index 00000000..abba517d
--- /dev/null
+++ b/lib/features/my_finance/presentation/pages/card_settings.dart
@@ -0,0 +1,114 @@
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+class CardSettingsScreen extends StatelessWidget {
+ const CardSettingsScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Color(0xFFF0F2F5),
+ appBar: AppBar(
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.vertical(
+ bottom: Radius.circular(12),
+ ),
+ ),
+ title: Text('Мои карты'),
+ centerTitle: true,
+ ),
+ body: Column(
+ children: [
+ const SizedBox(height: 16),
+ Material(
+ borderRadius: BorderRadius.circular(12),
+ color: Colors.white,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 16),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ 'Прив�занные карты',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ height: 1,
+ ),
+ ),
+ ),
+ const SizedBox(height: 8),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ 'Выплату будут производить��\nна карту ** 0278',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ height: 1,
+ ),
+ ),
+ ),
+ const SizedBox(height: 16),
+ SingleChildScrollView(
+ padding: EdgeInsets.symmetric(horizontal: 16),
+ scrollDirection: Axis.horizontal,
+ child: Row(
+ children: [
+ _card(true),
+ const SizedBox(width: 8),
+ _card(),
+ const SizedBox(width: 8),
+ _card(),
+ ],
+ ),
+ ),
+ const SizedBox(height: 16),
+ ],
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+
+ _card([bool isSelected = false]) {
+ return Container(
+ padding: EdgeInsets.all(4),
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(8),
+ border: Border.all(
+ color: isSelected ? appTheme.blueA400 : Color(0xFFF1F2F6),
+ width: 2,
+ ),
+ ),
+ child: Container(
+ width: 148,
+ padding: EdgeInsets.all(10),
+ decoration: BoxDecoration(
+ color: Color(0xFFF1F2F6),
+ borderRadius: BorderRadius.circular(4),
+ ),
+ child: Column(
+ children: [
+ SvgPicture.asset('assets/icons/mir.svg'),
+ const SizedBox(height: 24),
+ Text(
+ '** 0278',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ fontSize: 14,
+ height: 1,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/my_finance/presentation/pages/consultant_finance_screen.dart b/lib/features/my_finance/presentation/pages/consultant_finance_screen.dart
new file mode 100644
index 00000000..ac0d32f8
--- /dev/null
+++ b/lib/features/my_finance/presentation/pages/consultant_finance_screen.dart
@@ -0,0 +1,239 @@
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/core/utils/date_time_utils.dart';
+import 'package:eatvio_app/core/widgets/custom_drop_down_button.dart';
+import 'package:eatvio_app/features/my_finance/entities/consultant_finance_entity.dart';
+import 'package:flutter/material.dart';
+
+class ConsultantFinanceScreen extends StatelessWidget {
+ const ConsultantFinanceScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Color(0xFFF0F2F5),
+ appBar: AppBar(
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadiusDirectional.vertical(
+ bottom: Radius.circular(12),
+ ),
+ ),
+ title: Text('�рхив кон�ультаций'),
+ centerTitle: true,
+ ),
+ body: SingleChildScrollView(
+ padding: const EdgeInsets.symmetric(vertical: 8),
+ child: Column(
+ children: [
+ Material(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 16),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text(
+ 'В�его кон�ультаций: ${testFinanceEntity.totalConsultationsCount}',
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ color: Color(0xFF6D6F71),
+ height: 1,
+ ),
+ ),
+ ),
+ const SizedBox(height: 12),
+ SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Row(
+ children: [
+ Material(
+ color: Color(0xFF0BB450).withAlpha(11),
+ borderRadius: BorderRadius.circular(8),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+ child: Text(
+ 'Завершено: ${testFinanceEntity.completedCount}',
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ color: Color(0xFF0BB450),
+ height: 1,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(width: 8),
+ Material(
+ color: Color(0xFFD01717).withAlpha(11),
+ borderRadius: BorderRadius.circular(8),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+ child: Text(
+ 'Отменено: ${testFinanceEntity.canceledCount}',
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ color: Color(0xFFD01717),
+ height: 1,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(width: 8),
+ Material(
+ color: Color(0xFFD07317).withAlpha(11),
+ borderRadius: BorderRadius.circular(8),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+ child: Text(
+ 'Отменено инициатором: ${testFinanceEntity.canceledByInitiatorCount}',
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ color: Color(0xFFD07317),
+ height: 1,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 16),
+ ],
+ ),
+ ),
+ const SizedBox(height: 8),
+ Material(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12),
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
+ child: SingleChildScrollView(
+ physics: const NeverScrollableScrollPhysics(),
+ child: Column(
+ children: [
+ CustomDropDownButton(
+ items: [],
+ onChanged: (value) {},
+ ),
+ const SizedBox(height: 12),
+ CustomDropDownButton(
+ items: [],
+ onChanged: (value) {},
+ ),
+ const SizedBox(height: 12),
+ ListView.separated(
+ shrinkWrap: true,
+ physics: const NeverScrollableScrollPhysics(),
+ itemBuilder: (context, index) => Material(
+ color: Color(0xFFF6F6F6),
+ borderRadius: BorderRadius.circular(20),
+ child: Padding(
+ padding: const EdgeInsets.all(12),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ testFinanceEntity.consultationsList[index].id,
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ Text(
+ testFinanceEntity.consultationsList[index].date.format('dd.MM.yyy', 'RU'),
+ style: TextStyle(
+ color: Color(0xFF6D6F71),
+ height: 1,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 8),
+ Text(
+ testFinanceEntity.consultationsList[index].title,
+ style: TextStyle(
+ color: appTheme.blueA400,
+ height: 1,
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Text(
+ 'Покупатель: ' + testFinanceEntity.consultationsList[index].clientName,
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Text(
+ testFinanceEntity.consultationsList[index].planDuration.toString() + ' дней',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ testFinanceEntity.consultationsList[index].price.toString() + ' ₽',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Material(
+ color: Color(0xFF0BB450).withAlpha(11),
+ borderRadius: BorderRadius.circular(8),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+ child: Text(
+ testFinanceEntity.consultationsList[index].status.name,
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ color: Color(0xFF0BB450),
+ height: 1,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ separatorBuilder: (context, index) => const SizedBox(height: 12),
+ itemCount: testFinanceEntity.consultationsList.length,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/my_finance/presentation/pages/user_finance_screen.dart b/lib/features/my_finance/presentation/pages/user_finance_screen.dart
new file mode 100644
index 00000000..2ac71c30
--- /dev/null
+++ b/lib/features/my_finance/presentation/pages/user_finance_screen.dart
@@ -0,0 +1,180 @@
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/core/utils/date_time_utils.dart';
+import 'package:eatvio_app/core/widgets/custom_drop_down_button.dart';
+import 'package:eatvio_app/features/my_finance/entities/consultant_finance_entity.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class UserFinanceScreen extends StatelessWidget {
+ const UserFinanceScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Color(0xFFF0F2F5),
+ appBar: AppBar(
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadiusDirectional.vertical(
+ bottom: Radius.circular(12),
+ ),
+ ),
+ title: Text('И�тори� операций'),
+ centerTitle: true,
+ ),
+ body: SingleChildScrollView(
+ padding: const EdgeInsets.symmetric(vertical: 8),
+ child: Column(
+ children: [
+ const SizedBox(height: 8),
+ InkWell(
+ onTap: () {
+ GoRouter.of(context).pushNamed('cardSettingsScreen');
+ },
+ borderRadius: BorderRadius.circular(20),
+ child: Ink(
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(20),
+ color: appTheme.blueA400,
+ ),
+ width: MediaQuery.of(context).size.width - 32,
+ child: Center(
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Text(
+ 'Управление картами',
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 16),
+ Material(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12),
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
+ child: SingleChildScrollView(
+ physics: const NeverScrollableScrollPhysics(),
+ child: Column(
+ children: [
+ CustomDropDownButton(
+ items: [],
+ onChanged: (value) {},
+ ),
+ const SizedBox(height: 12),
+ ListView.separated(
+ shrinkWrap: true,
+ physics: const NeverScrollableScrollPhysics(),
+ itemBuilder: (context, index) => Material(
+ color: Color(0xFFF6F6F6),
+ borderRadius: BorderRadius.circular(20),
+ child: Padding(
+ padding: const EdgeInsets.all(12),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ testFinanceEntity.consultationsList[index].id,
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ Text(
+ testFinanceEntity.consultationsList[index].date.format('dd.MM.yyy', 'RU'),
+ style: TextStyle(
+ color: Color(0xFF6D6F71),
+ height: 1,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 8),
+ Text(
+ testFinanceEntity.consultationsList[index].title,
+ style: TextStyle(
+ color: appTheme.blueA400,
+ height: 1,
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Text(
+ 'Покупатель: ' + testFinanceEntity.consultationsList[index].clientName,
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Text(
+ testFinanceEntity.consultationsList[index].planDuration.toString() + ' дней',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ const SizedBox(height: 8),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ testFinanceEntity.consultationsList[index].price.toString() + ' ₽',
+ style: TextStyle(
+ color: Color(0xFF323F4B),
+ height: 1,
+ fontSize: 18,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Material(
+ color: Color(0xFF0BB450).withAlpha(11),
+ borderRadius: BorderRadius.circular(8),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
+ child: Text(
+ testFinanceEntity.consultationsList[index].status.name,
+ style: TextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ color: Color(0xFF0BB450),
+ height: 1,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ separatorBuilder: (context, index) => const SizedBox(height: 12),
+ itemCount: testFinanceEntity.consultationsList.length,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}