diff --git a/ENV_SETUP.md b/ENV_SETUP.md
index 0873fb1c..092a3bd9 100644
--- a/ENV_SETUP.md
+++ b/ENV_SETUP.md
@@ -54,6 +54,15 @@ cp env.example .env
- `GOOGLE_CHECK_URL` - URL для проверки соединения (Google)
- `YANDEX_CHECK_URL` - URL для проверки соединения (Yandex)
+### VK ID Configuration
+- `VK_CLIENT_ID` - ID приложения VK (числовой)
+- **Примечание**: VK_CLIENT_ID - это числовой "ID приложения" из консоли VK ID, НЕ "Защищённый ключ" или "Сервисный ключ доступа"
+
+### Yandex ID Configuration
+- `YANDEX_CLIENT_ID` - ID приложения Yandex OAuth
+- `YANDEX_CLIENT_SECRET` - секретный ключ приложения Yandex OAuth
+- `YANDEX_REDIRECT_URI` - URI для перенаправления (должен совпадать с настройками в Yandex OAuth приложении)
+
## Безопасность
⚠️ **ВАЖНО**: Файл `.env` добавлен в `.gitignore` и не должен попадать в репозиторий. Все секретные данные должны храниться только в этом файле.
diff --git a/assets/icons/consultant_rating_icon.svg b/assets/icons/consultant_rating_icon.svg
new file mode 100644
index 00000000..493b4d95
--- /dev/null
+++ b/assets/icons/consultant_rating_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/mail_logo.svg b/assets/icons/mail_logo.svg
new file mode 100644
index 00000000..5891b116
--- /dev/null
+++ b/assets/icons/mail_logo.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/icons/ok_logo.svg b/assets/icons/ok_logo.svg
new file mode 100644
index 00000000..07a62fbd
--- /dev/null
+++ b/assets/icons/ok_logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/icons/vk_logo.svg b/assets/icons/vk_logo.svg
new file mode 100644
index 00000000..274b3486
--- /dev/null
+++ b/assets/icons/vk_logo.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/icons/yandex_logo.svg b/assets/icons/yandex_logo.svg
new file mode 100644
index 00000000..51b51eee
--- /dev/null
+++ b/assets/icons/yandex_logo.svg
@@ -0,0 +1,16 @@
+
diff --git a/lib/core/app_config.dart b/lib/core/app_config.dart
new file mode 100644
index 00000000..7017e570
--- /dev/null
+++ b/lib/core/app_config.dart
@@ -0,0 +1,54 @@
+import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_cubit.dart';
+import 'package:eatvio_app/core/locator_service.dart';
+import 'package:eatvio_app/core/views/cubit/views_cubit.dart';
+import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart';
+import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_cubit.dart';
+import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
+import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart';
+import 'package:eatvio_app/features/internet_connection_checker/internet_connection_checker_screen.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_localizations/flutter_localizations.dart';
+
+/// Конфигурация приложения
+class AppConfig {
+ /// Список глобальных BlocProvider'ов
+ static List get globalBlocProviders => [
+ BlocProvider(create: (context) => sl()),
+ BlocProvider(
+ create: (context) => sl()..getNotifications(),
+ ),
+ BlocProvider(
+ create: (context) => sl()..loadFeedBlogPostList(),
+ ),
+ BlocProvider(
+ create: (context) => sl()..getMyProfile(),
+ ),
+ BlocProvider(
+ create: (context) => sl()..getChatRoomsWithLoading(),
+ ),
+ BlocProvider(
+ create: (context) => sl(),
+ ),
+ BlocProvider(
+ lazy: false,
+ create: (context) => sl(),
+ ),
+ ];
+
+ /// Делегаты локализации
+ static const List localizationDelegates = [
+ S.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ GlobalCupertinoLocalizations.delegate,
+ ];
+
+ /// Поддерживаемые локали
+ static const List supportedLocales = [
+ Locale.fromSubtags(languageCode: 'ru'),
+ ];
+
+}
diff --git a/lib/core/app_initializer.dart b/lib/core/app_initializer.dart
new file mode 100644
index 00000000..a3798a34
--- /dev/null
+++ b/lib/core/app_initializer.dart
@@ -0,0 +1,68 @@
+import 'dart:io' as io;
+import 'package:eatvio_app/core/env_config.dart';
+import 'package:eatvio_app/core/locator_service.dart' as di;
+import 'package:eatvio_app/firebase_options.dart';
+import 'package:firebase_core/firebase_core.dart';
+import 'package:firebase_messaging/firebase_messaging.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter_native_splash/flutter_native_splash.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart';
+import 'package:appmetrica_plugin/appmetrica_plugin.dart';
+import 'package:sentry_flutter/sentry_flutter.dart';
+
+/// Класс для инициализации приложения
+class AppInitializer {
+ /// Инициализация всех сервисов приложения
+ static Future initialize() async {
+ await _initializeSentry();
+ await _initializeEnvironment();
+ await _initializeFirebase();
+ await _initializeDependencyInjection();
+ await _initializeDebugMode();
+ await _initializeAnalytics();
+ }
+
+ /// Инициализация Sentry
+ static Future _initializeSentry() async {
+ final widgetsBinding = SentryWidgetsFlutterBinding.ensureInitialized();
+ FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
+ }
+
+ /// Загрузка переменных окружения
+ static Future _initializeEnvironment() async {
+ await dotenv.load(fileName: ".env");
+ }
+
+ /// Инициализация Firebase
+ static Future _initializeFirebase() async {
+ await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
+ await FirebaseMessaging.instance.requestPermission();
+ }
+
+ /// Инициализация системы внедрения зависимостей
+ static Future _initializeDependencyInjection() async {
+ await di.init();
+ }
+
+ /// Настройка режима отладки
+ static Future _initializeDebugMode() async {
+ if (kDebugMode) {
+ io.HttpClient.enableTimelineLogging = true;
+ }
+ }
+
+ /// Инициализация аналитики
+ static Future _initializeAnalytics() async {
+ AppMetrica.activate(AppMetricaConfig(EnvConfig.appMetricaApiKey));
+ AppMetrica.reportEvent('Application started');
+ }
+
+ /// Запуск приложения с Sentry
+ static Future runAppWithSentry(VoidCallback appRunner) async {
+ await SentryFlutter.init((options) {
+ options.dsn = EnvConfig.sentryDsn;
+ options.tracesSampleRate = 1.0;
+ options.debug = false;
+ }, appRunner: appRunner);
+ }
+}
diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart
index cc028255..f3715464 100644
--- a/lib/core/app_router.dart
+++ b/lib/core/app_router.dart
@@ -1,455 +1,53 @@
-import 'package:dio/dio.dart';
-import 'package:eatvio_app/core/const.dart';
-import 'package:eatvio_app/core/firebase_api.dart';
-import 'package:eatvio_app/core/token_storage.dart';
-import 'package:eatvio_app/core/websockets/ws_manager.dart';
-import 'package:eatvio_app/core/locator_service.dart';
-import 'package:eatvio_app/features/auth/presentation/pages/auth_screen.dart';
-import 'package:eatvio_app/features/auth/presentation/pages/forget_password_screen.dart';
-import 'package:eatvio_app/features/auth/presentation/pages/scan_qr_code_screen.dart';
-import 'package:eatvio_app/features/blog_post/presentation/pages/blog_post_screen.dart';
-import 'package:eatvio_app/features/blog_post_create/presentation/pages/blog_post_create_screen.dart';
-import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
-import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart';
-import 'package:eatvio_app/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart';
-import 'package:eatvio_app/features/calendar/presentation/pages/calendar_screen.dart';
-import 'package:eatvio_app/features/chat/presentation/pages/chat_screen.dart';
-import 'package:eatvio_app/features/chat/presentation/pages/chats_screen.dart';
-import 'package:eatvio_app/features/chat/presentation/pages/empty_chat_screen.dart';
-import 'package:eatvio_app/features/chat/presentation/pages/payment_screen.dart';
-import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart';
-import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart';
-import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart';
-import 'package:eatvio_app/features/consultations/presentation/pages/consultations_screen.dart';
-import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/consultant_finances_screen.dart';
-import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/user_purchases_screen.dart';
-import 'package:eatvio_app/features/menu/presentation/pages/blocked_users_screen.dart';
-import 'package:eatvio_app/features/menu/presentation/pages/notifications_settings_screen.dart';
-import 'package:eatvio_app/features/order_info/presentation/info_by_order_screen.dart';
-import 'package:eatvio_app/features/create_diet/presentation/create_diet_screen.dart';
-import 'package:eatvio_app/features/create_diet/presentation/diet_preview_screen.dart';
-import 'package:eatvio_app/features/create_plan/presentation/create_plan_screen.dart';
-import 'package:eatvio_app/features/consultant_rating/presentation/consultant_rating_screen.dart';
-import 'package:eatvio_app/features/dev_tools/presentation/dev_tools_screen.dart';
-import 'package:eatvio_app/features/diary/presentation/pages/diary_screen.dart';
-import 'package:eatvio_app/features/diets/presentation/pages/about_diet_screen.dart';
-import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
-import 'package:eatvio_app/features/feed/models/feed_blog_post_model.dart';
-import 'package:eatvio_app/features/feed/models/recipes_model.dart';
-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/finances_and_consultations_archive/presentation/consultations_archive_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/notifications_screen.dart';
-import 'package:eatvio_app/features/plans/presentation/pages/about_plan_screen.dart';
-import 'package:eatvio_app/features/profile/presentation/pages/profile_screen.dart';
-import 'package:eatvio_app/features/profile/presentation/pages/subs_screen.dart';
-import 'package:eatvio_app/features/recipe/presentation/pages/about_recipe_screen.dart';
-import 'package:eatvio_app/features/create_recipe/presentation/pages/recipe_create_screen.dart';
-import 'package:eatvio_app/features/recipe/presentation/pages/my_recipes_screen.dart';
-import 'package:eatvio_app/features/registration/presentation/pages/registration_screen.dart';
-import 'package:eatvio_app/features/registration/presentation/pages/verify_email_screen.dart';
-import 'package:eatvio_app/features/registration/presentation/pages/verify_screen.dart';
-import 'package:eatvio_app/features/settings/entities/settings_entity.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/change_email_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/change_password_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/general_info_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/other_info_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/physical_activity_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/physical_form_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/pressure_screen.dart';
-import 'package:eatvio_app/features/settings/presentation/pages/settings_screen.dart';
-import 'package:eatvio_app/features/support/presentation/pages/support_screen.dart';
-import 'package:eatvio_app/features/update_screen/presentation/update_screen.dart';
-import 'package:eatvio_app/features/user_details/presentation/user_details_screen.dart';
-import 'package:eatvio_app/features/welcome/presentation/pages/welcome_screen.dart';
+import 'package:eatvio_app/core/routing/auth_routes.dart';
+import 'package:eatvio_app/core/routing/content_routes.dart';
+import 'package:eatvio_app/core/routing/main_navigation_routes.dart';
+import 'package:eatvio_app/core/routing/other_routes.dart';
+import 'package:eatvio_app/core/routing/route_constants.dart';
+import 'package:eatvio_app/core/routing/settings_routes.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:go_router/go_router.dart';
-import 'package:package_info_plus/package_info_plus.dart';
-import 'package:shared_preferences/shared_preferences.dart';
-import 'package:version/version.dart';
-import 'dart:developer';
+/// Главный роутер приложения
class AppRouter {
static GlobalKey navigatorKey = GlobalKey();
static GoRouter appRouter = GoRouter(
- initialLocation: '/update-screen',
+ initialLocation: RouteConstants.updateScreen,
navigatorKey: navigatorKey,
- redirect: (context, state) {
- final segments = state.uri.pathSegments;
- if (segments.length >= 3) {
- final type = segments[1];
- final contentIdentifier = segments[2];
-
- switch (type) {
- case 'recipe':
- FlutterNativeSplash.remove();
- return '/about-recipes-screen?slug=$contentIdentifier';
- case 'blog_post':
- FlutterNativeSplash.remove();
- return '/blog-post-screen?id=$contentIdentifier';
- case 'plan':
- FlutterNativeSplash.remove();
- return '/about-plan-screen?slug=$contentIdentifier';
- case 'diet':
- FlutterNativeSplash.remove();
- return '/about-diet-screen?slug=$contentIdentifier';
- }
- }
-
- return null;
- },
+ redirect: _handleRedirect,
routes: [
- GoRoute(
- path: '/auth-screen',
- name: 'authScreen',
- builder: (context, state) => const AuthScreen(),
- routes: [
- GoRoute(path: 'registration-screen', name: 'registrationScreen', builder: (context, state) => const RegistrationScreen()),
- GoRoute(
- path: 'forget-password-screen',
- name: 'forgetPasswordScreen',
- builder: (context, state) => ForgetPasswordScreen(isAuth: state.extra as bool),
- ),
- GoRoute(path: 'scan-qr-code-screen', name: 'scanQRCodeScreen', builder: (context, state) => const ScanQRCodeScreen()),
- ],
- ),
- ShellRoute(
- builder: (context, state, child) {
- return BlocBuilder(
- builder: (BuildContext context, ProfileAvatarState state) {
- if (state is ProfileAvatarStateLoaded) {
- return BottomNavigationBarWidget(profileModel: state.profile, child: child);
- }
- return const SizedBox.shrink();
- },
- );
- },
- routes: [
- GoRoute(
- path: '/my-profile-screen',
- name: 'myProfileScreen',
- pageBuilder: (context, state) {
- return const NoTransitionPage(child: ProfileScreen());
- },
- ),
- GoRoute(
- path: '/feed-screen',
- name: 'feedScreen',
- pageBuilder: (context, state) => const NoTransitionPage(child: FeedScreen()),
- redirect: (context, state) async {
- try {
- await sl().initialize();
- } catch (e, st) {
- log(e.toString(), stackTrace: st);
- }
- return null;
- },
- ),
- GoRoute(
- path: '/diary-screen',
- name: 'diaryScreen',
- pageBuilder: (context, state) => const NoTransitionPage(child: DiaryScreen()),
- ),
- GoRoute(
- path: ConsultationsScreen.path,
- name: ConsultationsScreen.name,
- pageBuilder: (context, state) => const NoTransitionPage(child: ConsultationsScreen()),
- ),
- GoRoute(
- path: '/chat-select-screen',
- name: 'chatSelectScreen',
- pageBuilder: (context, state) => const NoTransitionPage(child: ChatsScreen()),
- ),
- GoRoute(
- path: '/notifications-screen',
- name: 'notificationsScreen',
- pageBuilder: (context, state) => const NoTransitionPage(child: NotificationsScreen()),
- ),
- GoRoute(
- path: '/menu-screen',
- name: 'menuScreen',
- pageBuilder: (context, state) => NoTransitionPage(
- child: BlocBuilder(
- builder: (BuildContext context, ProfileAvatarState state) {
- if (state is ProfileAvatarStateLoaded) {
- return MenuScreen(profileModel: state.profile);
- }
- return const SizedBox.shrink();
- },
- ),
- ),
- ),
- ],
- ),
- GoRoute(name: 'blockedUsersScreen', path: '/blocked-users-screen', builder: (context, state) => const BlockedUsersScreen()),
- GoRoute(
- path: '/welcome-screen',
- name: 'welcomeScreen',
- builder: (context, state) => const WelcomeScreen(),
- redirect: (context, state) async {
- try {
- final sharedPreferences = await SharedPreferences.getInstance();
- final welcomeScreenWasShowed = sharedPreferences.getBool('welcomeScreenWasShowed') ?? false;
- await sl().registerPushToken();
- if (welcomeScreenWasShowed == false) {
- return null;
- } else if (await TokenStorage.haveTokenInStorage()) {
- return '/feed-screen';
- } else {
- return '/auth-screen';
- }
- } catch (e) {
- return '/feed-screen';
- }
- },
- ),
- GoRoute(
- path: '/update-screen',
- name: 'updateScreen',
- builder: (context, state) => const UpdateScreen(),
- redirect: (context, state) async {
- try {
- final versions = (await sl().get('$baseUrl/api/app_versions')).data;
- PackageInfo packageInfo = await PackageInfo.fromPlatform();
- String version = packageInfo.version;
- Version currentVersion = Version.parse(version);
- Version latestVersion = Version.parse(versions['min_version']);
- if (latestVersion > currentVersion) {
- return null;
- } else {
- return '/welcome-screen';
- }
- } catch (e) {
- return '/welcome-screen';
- }
- },
- ),
- GoRoute(path: ConsultationsArchiveScreen.path, name: ConsultationsArchiveScreen.name, builder: (context, state) => const ConsultationsArchiveScreen()),
- GoRoute(path: ConsultantFinancesScreen.path, name: ConsultantFinancesScreen.name, builder: (context, state) => const ConsultantFinancesScreen()),
- GoRoute(path: UserPurchasesScreen.path, name: UserPurchasesScreen.name, builder: (context, state) => const UserPurchasesScreen()),
- GoRoute(path: '/user-finance-screen', name: 'userFinanceScreen', builder: (context, state) => const UserFinanceScreen()),
- GoRoute(
- path: CardSettingsScreen.path,
- name: CardSettingsScreen.name,
- builder: (context, state) {
- final chosenPlanId = state.extra as int?;
- return CardSettingsScreen(chosenPlanId: chosenPlanId);
- },
- ),
- GoRoute(
- path: '/about-plan-screen',
- name: 'aboutPlanScreen',
- builder: (context, state) {
- final slug = state.uri.queryParameters['slug'];
- if (slug != null) {
- return AboutPlanScreen(slug: slug, navigateToComments: false, index: null);
- }
-
- final data = state.extra as Map;
- return AboutPlanScreen(slug: data['slug'] as String, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
- },
- ),
- GoRoute(path: '/glossary-screen', name: 'glossaryScreen', builder: (context, state) => const GlossaryScreen()),
- GoRoute(
- path: '/about-recipes-screen',
- name: 'aboutRecipesScreen',
- builder: (context, state) {
- final slug = state.uri.queryParameters['slug'];
- if (slug != null) {
- return AboutRecipeScreen(recipeSlug: slug, navigateToComments: false, index: null);
- }
-
- final data = state.extra as Map;
- return AboutRecipeScreen(recipeSlug: data['recipe'] as String, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
- },
- ),
- GoRoute(
- path: RecipeCreateScreen.path,
- name: RecipeCreateScreen.name,
- builder: (context, state) => RecipeCreateScreen(recipe: state.extra != null ? state.extra as Recipe : null),
- ),
- GoRoute(
- path: '/profile-screen',
- name: 'profileScreen',
- builder: (context, state) => ProfileScreen(author: state.extra as Author),
- ),
- GoRoute(
- path: '/subs-screen/:slug',
- name: 'subsScreen',
- builder: (context, state) => SubsScreen(slug: state.pathParameters['slug']!, subType: state.extra as SubType),
- ),
- GoRoute(
- path: '/about-diet-screen',
- name: 'aboutDietScreen',
- builder: (context, state) {
- final slug = state.uri.queryParameters['slug'];
- if (slug != null) {
- return AboutDietScreen(slug: slug, index: null, navigateToComments: false);
- }
- final data = state.extra as Map;
- return AboutDietScreen(slug: data['slug'] as String, index: data['index'] as int?, navigateToComments: data['navigateToComments'] as bool);
- },
- ),
- GoRoute(
- path: '/blog-post-create-screen',
- name: 'blogPostCreateScreen',
- builder: (context, state) => BlogPostCreateScreen(feedBlogPostModel: state.extra != null ? state.extra as FeedBlogPostModel : null),
- ),
- GoRoute(
- path: '/blog-post-screen',
- name: 'blogPostScreen',
- builder: (context, state) {
- final id = state.uri.queryParameters['id'];
- final parsedId = int.tryParse(id ?? '');
- if (parsedId != null) {
- return BlogPostScreen(id: parsedId);
- }
-
- return BlogPostScreen(id: state.extra as int);
- },
- ),
- GoRoute(
- path: '/chat-screen',
- name: 'chatScreen',
- builder: (context, state) {
- final data = state.extra as Map;
- final uuid = data['uuid'] as String;
- final sendInitialMessage = data['sendInitialMessage'] as bool?;
- return ChatScreen(uuid: uuid, sendInitialMessage: sendInitialMessage);
- },
- ),
- GoRoute(
- path: '/empty-chat-screen',
- name: 'emptyChatScreen',
- builder: (context, state) => EmptyChatScreen(author: state.extra as Author),
- ),
- GoRoute(
- path: '/settings-screen',
- name: 'settingsScreen',
- builder: (context, state) => const SettingsScreen(),
- routes: [
- GoRoute(
- path: 'general-info-screen',
- name: 'generalInfoScreen',
- builder: (context, state) => GeneralInfoScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'other-info-screen',
- name: 'otherInfoScreen',
- builder: (context, state) => OtherInfoScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'physical-activity-screen',
- name: 'physicalActivityScreen',
- builder: (context, state) => PhysicalActivityScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'physical-form-screen',
- name: 'physicalFormScreen',
- builder: (context, state) => PhysicalFormScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'pressure-screen',
- name: 'pressureScreen',
- builder: (context, state) => PressureScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'change-password-screen',
- name: 'changePasswordScreen',
- builder: (context, state) => ChangePasswordScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- GoRoute(
- path: 'change-email-screen',
- name: 'changeEmailScreen',
- builder: (context, state) => ChangeEmailScreen(settingsEntity: state.extra as SettingsEntity),
- ),
- ],
- ),
- GoRoute(path: '/become-consultant-screen', name: 'becomeConsultantScreen', builder: (context, state) => const BecomeConsultantScreen()),
- GoRoute(
- path: '/stepper-become-consultant-screen',
- name: 'stepperBecomeConsultantScreen',
- builder: (context, state) => StepperBecomeConsultantScreen(slug: state.extra == null ? null : state.extra as String),
- ),
- GoRoute(path: '/calendar-screen', name: 'calendarScreen', builder: (context, state) => const CalendarScreen()),
- GoRoute(path: '/support-screen', name: 'supportScreen', builder: (context, state) => const SupportScreen()),
- GoRoute(
- path: '/photo-view-screen/:index',
- name: 'photoViewScreen',
- builder: (context, state) => PhotoViewScreen(imageUrls: state.extra as List, index: int.parse(state.pathParameters['index']!)),
- ),
- GoRoute(
- path: CreateDietScreen.path,
- name: CreateDietScreen.name,
- builder: (context, state) {
- final diet = state.extra as Diet?;
- return CreateDietScreen(diet: diet);
- },
- ),
- GoRoute(
- path: DietPreviewScreen.path,
- name: DietPreviewScreen.name,
- builder: (context, state) {
- final data = state.extra as Diet;
- return DietPreviewScreen(diet: data);
- },
- ),
- GoRoute(path: CreatePlanScreen.path, name: CreatePlanScreen.name, builder: (context, state) => const CreatePlanScreen()),
- GoRoute(path: MyDietsScreen.path, name: MyDietsScreen.name, builder: (context, state) => const MyDietsScreen()),
- GoRoute(path: MyPlansScreen.path, name: MyPlansScreen.name, builder: (context, state) => const MyPlansScreen()),
- GoRoute(
- path: UserDetailsScreen.path,
- name: UserDetailsScreen.name,
- builder: (context, state) => UserDetailsScreen(slug: state.extra as String),
- ),
- GoRoute(path: DevToolsScreen.path, name: DevToolsScreen.name, builder: (context, state) => const DevToolsScreen()),
- GoRoute(path: ConsultantRatingScreen.path, name: ConsultantRatingScreen.name, builder: (context, state) => const ConsultantRatingScreen()),
- GoRoute(
- path: InfoByOrderScreen.path,
- name: InfoByOrderScreen.name,
- builder: (context, state) {
- final data = state.extra as Map;
- final planId = data['planId'] as int;
- final successfulPayment = data['successfulPayment'] as bool?;
- return InfoByOrderScreen(planId: planId, successfulPayment: successfulPayment);
- },
- ),
- GoRoute(
- path: PaymentScreen.path,
- name: PaymentScreen.name,
- builder: (context, state) {
- final data = state.extra as Map;
- final planId = data['planId'] as int;
- final url = data['url'] as String;
- return PaymentScreen(url: url, planId: planId);
- },
- ),
- GoRoute(
- path: UserDiaryScreen.path,
- name: UserDiaryScreen.name,
- builder: (context, state) {
- final data = state.extra as Map;
- final diaryId = data['diaryId'] as int;
- final currentPlanDay = data['currentDiaryDay'] as int;
- return UserDiaryScreen(diaryId: diaryId, currentPlanDay: currentPlanDay);
- },
- ),
- GoRoute(
- path: '/verify-screen',
- name: 'verifyScreen',
- builder: (context, state) => VerifyScreen(passKey: state.extra as String),
- ),
- GoRoute(path: '/verify-email-screen', name: 'verifyEmailScreen', builder: (context, state) => const VerifyEmailScreen()),
- GoRoute(path: MyRecipesScreen.path, name: MyRecipesScreen.name, builder: (context, state) => const MyRecipesScreen()),
- GoRoute(path: '/notifications-settings-screen', name: 'notificationsSettingsScreen', builder: (context, state) => const NotificationsSettingsScreen()),
+ ...AuthRoutes.createRoutes(),
+ ...MainNavigationRoutes.createRoutes(),
+ ...ContentRoutes.createRoutes(),
+ ...SettingsRoutes.createRoutes(),
+ ...OtherRoutes.createRoutes(),
],
);
+
+ /// Обработка редиректов для deep links
+ static String? _handleRedirect(BuildContext context, GoRouterState state) {
+ final segments = state.uri.pathSegments;
+ if (segments.length >= 3) {
+ final type = segments[1];
+ final contentIdentifier = segments[2];
+
+ switch (type) {
+ case 'recipe':
+ FlutterNativeSplash.remove();
+ return '${RouteConstants.aboutRecipesScreen}?slug=$contentIdentifier';
+ case 'blog_post':
+ FlutterNativeSplash.remove();
+ return '${RouteConstants.blogPostScreen}?id=$contentIdentifier';
+ case 'plan':
+ FlutterNativeSplash.remove();
+ return '${RouteConstants.aboutPlanScreen}?slug=$contentIdentifier';
+ case 'diet':
+ FlutterNativeSplash.remove();
+ return '${RouteConstants.aboutDietScreen}?slug=$contentIdentifier';
+ }
+ }
+
+ return null;
+ }
}
diff --git a/lib/core/constants/app_constants.dart b/lib/core/constants/app_constants.dart
new file mode 100644
index 00000000..f9c945c9
--- /dev/null
+++ b/lib/core/constants/app_constants.dart
@@ -0,0 +1,72 @@
+/// Константы приложения
+class AppConstants {
+ // Размеры
+ static const double defaultPadding = 16.0;
+ static const double smallPadding = 8.0;
+ static const double largePadding = 24.0;
+ static const double extraLargePadding = 32.0;
+
+ // Радиусы
+ static const double defaultBorderRadius = 8.0;
+ static const double smallBorderRadius = 4.0;
+ static const double largeBorderRadius = 16.0;
+
+ // Высоты
+ static const double defaultButtonHeight = 48.0;
+ static const double smallButtonHeight = 36.0;
+ static const double largeButtonHeight = 56.0;
+
+ // Ширины
+ static const double maxContentWidth = 400.0;
+ static const double minContentWidth = 280.0;
+
+ // Анимации
+ static const Duration defaultAnimationDuration = Duration(milliseconds: 300);
+ static const Duration fastAnimationDuration = Duration(milliseconds: 150);
+ static const Duration slowAnimationDuration = Duration(milliseconds: 500);
+
+ // Таймауты
+ static const Duration defaultTimeout = Duration(seconds: 30);
+ static const Duration shortTimeout = Duration(seconds: 10);
+ static const Duration longTimeout = Duration(minutes: 2);
+
+ // Лимиты
+ static const int maxImageSize = 5 * 1024 * 1024; // 5MB
+ static const int maxVideoSize = 100 * 1024 * 1024; // 100MB
+ static const int maxTextLength = 1000;
+ static const int maxTitleLength = 100;
+ static const int maxDescriptionLength = 500;
+
+ // Пагинация
+ static const int defaultPageSize = 20;
+ static const int smallPageSize = 10;
+ static const int largePageSize = 50;
+
+ // Форматы
+ static const List supportedImageFormats = ['jpg', 'jpeg', 'png', 'webp'];
+ static const List supportedVideoFormats = ['mp4', 'mov', 'avi'];
+
+ // Регулярные выражения
+ static const String emailRegex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
+ static const String phoneRegex = r'^\+?[1-9]\d{1,14}$';
+ static const String urlRegex = r'^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$';
+
+ // Сообщения
+ static const String defaultErrorMessage = 'Произошла ошибка. Попробуйте еще раз.';
+ static const String networkErrorMessage = 'Проблема с подключением к интернету.';
+ static const String timeoutErrorMessage = 'Превышено время ожидания.';
+ static const String unknownErrorMessage = 'Неизвестная ошибка.';
+
+ // Ключи для SharedPreferences
+ static const String welcomeScreenShownKey = 'welcomeScreenWasShowed';
+ static const String userTokenKey = 'userToken';
+ static const String userDataKey = 'userData';
+ static const String settingsKey = 'settings';
+
+ // API endpoints
+ static const String apiVersion = '/api';
+ static const String authEndpoint = '/auth';
+ static const String usersEndpoint = '/users';
+ static const String postsEndpoint = '/posts';
+ static const String commentsEndpoint = '/comments';
+}
diff --git a/lib/core/cubit/base_cubit.dart b/lib/core/cubit/base_cubit.dart
new file mode 100644
index 00000000..03ff3cc2
--- /dev/null
+++ b/lib/core/cubit/base_cubit.dart
@@ -0,0 +1,42 @@
+import 'dart:developer';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+/// Базовый класс для всех Cubit'ов с унифицированной обработкой ошибок
+abstract class BaseCubit extends Cubit {
+ BaseCubit(super.initialState);
+
+ /// Унифицированная обработка ошибок
+ void handleError(Object error, [StackTrace? stackTrace]) {
+ log('Error in $runtimeType: $error', stackTrace: stackTrace);
+ // Здесь можно добавить отправку ошибок в Sentry или другую систему мониторинга
+ }
+
+ /// Безопасное выполнение асинхронных операций
+ Future safeExecute(Future Function() operation) async {
+ try {
+ return await operation();
+ } catch (error, stackTrace) {
+ handleError(error, stackTrace);
+ return null;
+ }
+ }
+
+ /// Безопасное выполнение асинхронных операций с обработкой состояния
+ Future safeExecuteWithState(
+ Future Function() operation, {
+ required State loadingState,
+ required State Function(T result) successState,
+ required State Function(Object error) errorState,
+ }) async {
+ try {
+ emit(loadingState);
+ final result = await operation();
+ emit(successState(result));
+ return result;
+ } catch (error, stackTrace) {
+ handleError(error, stackTrace);
+ emit(errorState(error));
+ return null;
+ }
+ }
+}
diff --git a/lib/core/cubit/state_utils.dart b/lib/core/cubit/state_utils.dart
new file mode 100644
index 00000000..9c6dfb78
--- /dev/null
+++ b/lib/core/cubit/state_utils.dart
@@ -0,0 +1,28 @@
+/// Утилиты для работы с состояниями Cubit'ов
+class StateUtils {
+ /// Проверяет, является ли состояние загрузочным
+ static bool isLoading(dynamic state) {
+ return state.toString().contains('loading') || state.toString().contains('Loading');
+ }
+
+ /// Проверяет, является ли состояние загруженным
+ static bool isLoaded(dynamic state) {
+ return state.toString().contains('loaded') || state.toString().contains('Loaded');
+ }
+
+ /// Проверяет, является ли состояние ошибочным
+ static bool isError(dynamic state) {
+ return state.toString().contains('error') || state.toString().contains('Error');
+ }
+
+ /// Получает сообщение об ошибке из состояния
+ static String? getErrorMessage(dynamic state) {
+ if (isError(state)) {
+ // Попытка извлечь сообщение об ошибке из состояния
+ final stateString = state.toString();
+ final errorMatch = RegExp(r'error[:\s]+([^,}]+)').firstMatch(stateString);
+ return errorMatch?.group(1)?.trim();
+ }
+ return null;
+ }
+}
diff --git a/lib/core/di/cubit_registrations.dart b/lib/core/di/cubit_registrations.dart
new file mode 100644
index 00000000..d2324a9b
--- /dev/null
+++ b/lib/core/di/cubit_registrations.dart
@@ -0,0 +1,144 @@
+import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_cubit.dart';
+import 'package:eatvio_app/core/views/cubit/views_cubit.dart';
+import 'package:eatvio_app/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart';
+import 'package:eatvio_app/features/auth/presentation/bloc/reset_password_cubit/reset_password_cubit.dart';
+import 'package:eatvio_app/features/blog_post/presentation/cubit/blog_post_cubit.dart';
+import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart';
+import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart';
+import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
+import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_cubit.dart';
+import 'package:eatvio_app/features/cancel_plan_bottom_sheet/cubit/cancel_plan_cubit.dart';
+import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart';
+import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart';
+import 'package:eatvio_app/features/complaining/presentation/cubit/complaining_cubit.dart';
+import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart';
+import 'package:eatvio_app/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart';
+import 'package:eatvio_app/features/consultations/presentation/cubit/consultations_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_plan/presentation/cubit/create_plan_cubit.dart';
+import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/consultant_comments_cubit/consultant_comments_cubit.dart';
+import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
+import 'package:eatvio_app/features/diets/presentation/cubit/about_diet_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/plans_cubit/plans_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/profile_cubit/profile_cubit.dart';
+import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart';
+import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/archive/consultations_archive_cubit.dart';
+import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/consultant_finances/consultant_finances_cubit.dart';
+import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/user_purchases/user_purchases_cubit.dart';
+import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_cubit.dart';
+import 'package:eatvio_app/features/menu/presentation/bloc/notification_settings_cubit/notification_settings_cubit.dart';
+import 'package:eatvio_app/features/my_diets/presentation/cubit/my_diets_cubit.dart';
+import 'package:eatvio_app/features/my_finance/presentation/cubit/user_cards_cubit/user_cards_cubit.dart';
+import 'package:eatvio_app/features/my_plans/presentation/cubit/my_plans_cubit.dart';
+import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_cubit.dart';
+import 'package:eatvio_app/features/order_info/cubit/order_info_cubit.dart';
+import 'package:eatvio_app/features/plans/presentation/cubit/about_plan_cubit.dart';
+import 'package:eatvio_app/features/profile/presentation/bloc/plans_cubit/plans_cubit.dart' as profile_plans;
+import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart';
+import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart';
+import 'package:eatvio_app/features/recipe/presentation/cubit/about_recipe_cubit.dart';
+import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart';
+import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
+import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_cubit.dart';
+import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_cubit.dart';
+import 'package:eatvio_app/features/user_details/presentation/cubit/user_details_cubit.dart';
+import 'package:eatvio_app/core/comments/comments_cubit/comments_cubit.dart';
+import 'package:get_it/get_it.dart';
+
+/// Регистрация всех Cubit'ов в системе внедрения зависимостей
+class CubitRegistrations {
+ static final sl = GetIt.instance;
+
+ /// Регистрация всех Cubit'ов
+ static void registerAll() {
+ _registerSingletonCubits();
+ _registerFactoryCubits();
+ }
+
+ /// Регистрация Cubit'ов как синглтонов
+ static void _registerSingletonCubits() {
+ sl.registerLazySingleton(() => NewMessagesCubit());
+ sl.registerLazySingleton(() => NotificationsCubit(wsManager: sl(), notificationsRepository: sl()));
+ sl.registerLazySingleton(() => ProfileAvatarCubit(profileRepository: sl()));
+ sl.registerLazySingleton(() => ChatsCubit(chatRepository: sl(), wsManager: sl(), profileRepository: sl()));
+ sl.registerLazySingleton(() => InternetConnectionCubit());
+ }
+
+ /// Регистрация Cubit'ов как фабрик
+ static void _registerFactoryCubits() {
+ // Auth related cubits
+ sl.registerFactory(() => AuthCubit(authRepository: sl()));
+ sl.registerFactory(() => RegistrationCubit(registrationRepository: sl()));
+ sl.registerFactory(() => ResetPasswordCubit(resetPasswordRepository: sl()));
+ sl.registerFactory(() => VerifyEmailCubit(profileRepository: sl()));
+
+ // Feed related cubits
+ sl.registerFactory(() => FeedCubit(feedRepository: sl()));
+ sl.registerFactory(() => RecipesCubit(feedRepository: sl(), recipeRepository: sl(), aboutRecipeRepository: sl()));
+ sl.registerFactory(() => DietsCubit(feedRepository: sl(), dietsRepository: sl()));
+ sl.registerFactory(() => PlansCubit(feedRepository: sl(), planRepository: sl()));
+ sl.registerFactory(() => ConsultantsCubit(feedRepository: sl()));
+ sl.registerFactory(() => CommentsCubit(feedRepository: sl(), commentsRepository: sl()));
+ sl.registerFactory(() => FeedProfileCubit(profileRepository: sl()));
+
+ // Chat related cubits
+ sl.registerFactory(() => ChatRoomCubit(cardsRepository: sl(), chatRepository: sl(), wsManager: sl()));
+
+ // Profile related cubits
+ sl.registerFactory(() => ProfileCubit(profileRepository: sl(), chatRepository: sl(), consultantRepository: sl()));
+ sl.registerFactory(() => profile_plans.PlansCubit(plansRepository: sl()));
+ sl.registerFactory(() => SubCubit(profileRepository: sl()));
+
+ // Content creation cubits
+ sl.registerFactory(() => CreateDietCubit(profileRepository: sl(), createDietRepository: sl(), glossaryRepository: sl()));
+ sl.registerFactory(() => CreatePlanCubit(createPlanRepository: sl()));
+ sl.registerFactory(() => CreateRecipeCubit(recipeRepository: sl(), glossaryRepository: sl()));
+ sl.registerFactory(() => BlogPostCreateCubit(blogPostRepository: sl()));
+
+ // Content viewing cubits
+ sl.registerFactory(() => AboutDietCubit(dietsRepository: sl(), profileRepository: sl()));
+ sl.registerFactory(() => AboutPlanCubit(planRepository: sl()));
+ sl.registerFactory(() => AboutRecipeCubit(recipeRepository: sl(), profileRepository: sl()));
+ sl.registerFactory(() => BlogPostCubit(sl()));
+
+ // User content cubits
+ sl.registerFactory(() => MyDietsCubit(myDietsRepository: sl(), createDietRepository: sl()));
+ sl.registerFactory(() => MyPlansCubit(myPlansRepository: sl()));
+ sl.registerFactory(() => MyRecipesCubit(myRecipesRepository: sl(), aboutRecipeRepository: sl()));
+
+ // Other feature cubits
+ sl.registerFactory(() => CalendarCubit(calendarRepository: sl()));
+ sl.registerFactory(
+ () => DiaryCubit(
+ chatRepository: sl(),
+ diaryRepository: sl(),
+ glossaryRepository: sl(),
+ profileRepository: sl(),
+ dietRepository: sl(),
+ settingsRepository: sl(),
+ ),
+ );
+ sl.registerFactory(
+ () => SettingsCubit(profileRepository: sl(), settingsRepository: sl(), consultantRepository: sl(), consultationsRepository: sl()),
+ );
+ sl.registerFactory(() => RegisterConsultantCubit(consultantRepository: sl()));
+ sl.registerFactory(() => ComplainingCubit(repository: sl()));
+ sl.registerFactory(() => UserCardsCubit(cardsRepository: sl()));
+ sl.registerFactory(() => OrderInfoCubit(chatRepository: sl()));
+ sl.registerFactory(() => ConsultationsCubit(consultationsRepository: sl()));
+ sl.registerFactory(() => ConsultantCommentsCubit(diaryRepository: sl()));
+ sl.registerFactory(() => CancelPlanCubit(cancelPlanRepository: sl()));
+ sl.registerFactory(() => ConsultationsArchiveCubit(consultationsRepository: sl()));
+ sl.registerFactory(() => ConsultantFinancesCubit(consultationsRepository: sl()));
+ sl.registerFactory(() => UserPurchasesCubit(consultationsRepository: sl()));
+ sl.registerFactory(() => BlockedUsersCubit(blockedUsersRepository: sl()));
+ sl.registerFactory(() => NotificationSettingsCubit(notificationSettingsRepository: sl()));
+ sl.registerFactory(() => ConsultantRatingCubit(feedRepository: sl(), repository: sl(), profileRepository: sl()));
+ sl.registerFactory(() => ViewsCubit(viewsRepository: sl()));
+ sl.registerFactory(() => UserDetailsCubit(profileRepository: sl()));
+ }
+}
diff --git a/lib/core/di/external_registrations.dart b/lib/core/di/external_registrations.dart
new file mode 100644
index 00000000..38b3caa0
--- /dev/null
+++ b/lib/core/di/external_registrations.dart
@@ -0,0 +1,33 @@
+import 'package:dio/dio.dart';
+import 'package:eatvio_app/core/const.dart';
+import 'package:eatvio_app/core/dio/phone_verify_error_interceptor.dart';
+import 'package:eatvio_app/core/interceptors/token_interceptor.dart';
+import 'package:get_it/get_it.dart';
+
+/// Регистрация внешних зависимостей в системе внедрения зависимостей
+class ExternalRegistrations {
+ static final sl = GetIt.instance;
+
+ /// Регистрация всех внешних зависимостей
+ static void registerAll() {
+ _registerDio();
+ }
+
+ /// Регистрация Dio HTTP клиента
+ static void _registerDio() {
+ sl.registerLazySingleton(
+ () => Dio(
+ BaseOptions(
+ baseUrl: baseUrl,
+ headers: {
+ 'accept': 'application/json',
+ 'content-type': 'application/json',
+ },
+ ),
+ )..interceptors.addAll([
+ TokenInterceptor(),
+ PhoneVerifyErrorInterceptor(),
+ ]),
+ );
+ }
+}
diff --git a/lib/core/di/repository_registrations.dart b/lib/core/di/repository_registrations.dart
new file mode 100644
index 00000000..6d467810
--- /dev/null
+++ b/lib/core/di/repository_registrations.dart
@@ -0,0 +1,89 @@
+import 'package:eatvio_app/core/comments/repositories/comments_repository.dart';
+import 'package:eatvio_app/core/views/repository/views_repository.dart';
+import 'package:eatvio_app/features/auth/repositories/auth_repository.dart';
+import 'package:eatvio_app/features/auth/repositories/reset_password_repository.dart';
+import 'package:eatvio_app/features/blog_post_create/repositories/blog_post_repository.dart';
+import 'package:eatvio_app/features/calendar/repositories/calendar_repository.dart';
+import 'package:eatvio_app/features/cancel_plan_bottom_sheet/repository/cancel_plan_repository.dart';
+import 'package:eatvio_app/features/chat/repositories/chat_repository.dart';
+import 'package:eatvio_app/features/complaining/repositories/complaining_repository.dart';
+import 'package:eatvio_app/features/consultant/become_consultant/repositories/consultant_repository.dart';
+import 'package:eatvio_app/features/consultant_rating/repositories/consultant_rating_repository.dart';
+import 'package:eatvio_app/features/consultations/repositories/consultations_repository.dart';
+import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart';
+import 'package:eatvio_app/features/create_plan/repositories/create_plan_repository.dart';
+import 'package:eatvio_app/features/create_recipe/reporitories/recipe_repository.dart';
+import 'package:eatvio_app/features/diary/repositories/diary_repository.dart';
+import 'package:eatvio_app/features/diets/repositories/diet_repository.dart';
+import 'package:eatvio_app/features/feed/repositories/feed_repository.dart';
+import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart';
+import 'package:eatvio_app/features/menu/presentation/repositories/blocked_users_repository.dart';
+import 'package:eatvio_app/features/menu/repositories/notification_settings_repository.dart';
+import 'package:eatvio_app/features/my_diets/repositories/my_diets_repository.dart';
+import 'package:eatvio_app/features/my_finance/repositories/cards_repository.dart';
+import 'package:eatvio_app/features/my_plans/repositories/my_diets_repository.dart';
+import 'package:eatvio_app/features/notifications/repository/notifications_repository.dart';
+import 'package:eatvio_app/features/plans/repositories/plan_repository.dart';
+import 'package:eatvio_app/features/plans/repositories/plans_repository.dart';
+import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
+import 'package:eatvio_app/features/recipe/repositories/about_recipe_repository.dart';
+import 'package:eatvio_app/features/recipe/repositories/my_recipes_repository.dart';
+import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
+import 'package:eatvio_app/features/settings/repositories/service_repository.dart';
+import 'package:get_it/get_it.dart';
+
+/// Регистрация всех Repository в системе внедрения зависимостей
+class RepositoryRegistrations {
+ static final sl = GetIt.instance;
+
+ /// Регистрация всех Repository
+ static void registerAll() {
+ _registerSingletonRepositories();
+ _registerFactoryRepositories();
+ }
+
+ /// Регистрация Repository как синглтонов
+ static void _registerSingletonRepositories() {
+ // Core repositories
+ sl.registerLazySingleton(() => ChatRepository(chatService: sl()));
+ sl.registerLazySingleton(() => FeedRepository(feedService: sl()));
+ sl.registerLazySingleton(() => ProfileRepository(profileService: sl()));
+ sl.registerLazySingleton(() => CalendarRepository(calendarService: sl()));
+ sl.registerLazySingleton(() => SettingsRepository(settingsService: sl()));
+ sl.registerLazySingleton(() => ConsultantRepository(consultantService: sl()));
+ sl.registerLazySingleton(() => DiaryRepository(diaryService: sl()));
+ sl.registerLazySingleton(() => GlossaryRepository(glossaryService: sl()));
+ sl.registerLazySingleton(() => DietRepository(dietsService: sl()));
+ sl.registerLazySingleton(() => PlansRepository(plansService: sl()));
+ sl.registerLazySingleton(() => PlanRepository(planService: sl()));
+ sl.registerLazySingleton(() => AboutRecipeRepository(recipeService: sl()));
+ sl.registerLazySingleton(() => RecipeRepository(recipeService: sl()));
+ sl.registerLazySingleton(() => ComplainingRepository(service: sl()));
+ sl.registerLazySingleton(() => AuthRepository(authService: sl()));
+ sl.registerLazySingleton(() => CardsRepository(cardsService: sl()));
+ sl.registerLazySingleton(() => ConsultationsRepository(consultationService: sl()));
+ sl.registerLazySingleton(() => CancelPlanRepository(cancelService: sl()));
+ sl.registerLazySingleton(() => CreatePlanRepository(createPlanService: sl()));
+ sl.registerLazySingleton(() => NotificationsRepository(notificationsService: sl()));
+ sl.registerLazySingleton(() => BlockedUsersRepository(blockedUserService: sl()));
+ sl.registerLazySingleton(() => CommentsRepository(service: sl()));
+ sl.registerLazySingleton(() => NotificationSettingsRepository(sl()));
+
+ // Content repositories
+ sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl()));
+ sl.registerLazySingleton(() => CreateDietRepository(createDietService: sl()));
+ sl.registerLazySingleton(() => MyDietsRepository(myDietsService: sl()));
+ sl.registerLazySingleton(() => MyPlansRepository(myPlansService: sl()));
+
+ // Auth repositories
+ sl.registerLazySingleton(() => RegistrationRepository(registrationService: sl()));
+ }
+
+ /// Регистрация Repository как фабрик
+ static void _registerFactoryRepositories() {
+ sl.registerFactory(() => MyRecipesRepository(myRecipesService: sl()));
+ sl.registerFactory(() => ResetPasswordRepository(resetPasswordService: sl()));
+ sl.registerFactory(() => ConsultantRatingRepository(sl()));
+ sl.registerFactory(() => ViewsRepository(viewsService: sl()));
+ }
+}
diff --git a/lib/core/di/service_registrations.dart b/lib/core/di/service_registrations.dart
new file mode 100644
index 00000000..454d9064
--- /dev/null
+++ b/lib/core/di/service_registrations.dart
@@ -0,0 +1,88 @@
+import 'package:eatvio_app/core/comments/services/comments_service.dart';
+import 'package:eatvio_app/core/firebase_api.dart';
+import 'package:eatvio_app/core/views/service/views_service.dart';
+import 'package:eatvio_app/core/websockets/ws_service.dart';
+import 'package:eatvio_app/features/auth/services/auth_service.dart';
+import 'package:eatvio_app/features/auth/services/reset_password_service.dart';
+import 'package:eatvio_app/features/blog_post_create/services/blog_post_service.dart';
+import 'package:eatvio_app/features/calendar/services/calendar_service.dart';
+import 'package:eatvio_app/features/cancel_plan_bottom_sheet/service/cancel_plan_service.dart';
+import 'package:eatvio_app/features/chat/services/chat_service.dart';
+import 'package:eatvio_app/features/complaining/services/complaining_service.dart';
+import 'package:eatvio_app/features/consultant/become_consultant/services/consultant_service.dart';
+import 'package:eatvio_app/features/consultant_rating/services/consultant_rating_service.dart';
+import 'package:eatvio_app/features/consultations/services/consultation_service.dart';
+import 'package:eatvio_app/features/create_diet/services/create_diet_service.dart';
+import 'package:eatvio_app/features/create_plan/services/create_plan_service.dart';
+import 'package:eatvio_app/features/create_recipe/services/recipe_service.dart';
+import 'package:eatvio_app/features/diary/services/diary_service.dart';
+import 'package:eatvio_app/features/diets/services/diet_service.dart';
+import 'package:eatvio_app/features/feed/services/feed_service.dart';
+import 'package:eatvio_app/features/glossary/services/glossary_service.dart';
+import 'package:eatvio_app/features/menu/services/blocked_users_service.dart';
+import 'package:eatvio_app/features/menu/services/notification_settings_service.dart';
+import 'package:eatvio_app/features/my_diets/services/my_diets_service.dart';
+import 'package:eatvio_app/features/my_finance/services/cards_service.dart';
+import 'package:eatvio_app/features/my_plans/services/my_plans_service.dart';
+import 'package:eatvio_app/features/notifications/service/notifications_service.dart';
+import 'package:eatvio_app/features/plans/services/plan_service.dart';
+import 'package:eatvio_app/features/plans/services/plans_service.dart';
+import 'package:eatvio_app/features/profile/services/profile_service.dart';
+import 'package:eatvio_app/features/recipe/services/about_recipe_service.dart';
+import 'package:eatvio_app/features/recipe/services/my_recipes_service.dart';
+import 'package:eatvio_app/features/registration/services/registration_service.dart';
+import 'package:eatvio_app/features/settings/services/settings_service.dart';
+import 'package:get_it/get_it.dart';
+
+/// Регистрация всех Service в системе внедрения зависимостей
+class ServiceRegistrations {
+ static final sl = GetIt.instance;
+
+ /// Регистрация всех Service
+ static void registerAll() {
+ _registerSingletonServices();
+ }
+
+ /// Регистрация Service как синглтонов
+ static void _registerSingletonServices() {
+ // Core services
+ sl.registerLazySingleton(() => ChatService(sl()));
+ sl.registerLazySingleton(() => FeedService(sl()));
+ sl.registerLazySingleton(() => ProfileService(sl()));
+ sl.registerLazySingleton(() => CalendarService(sl()));
+ sl.registerLazySingleton(() => SettingsService(sl()));
+ sl.registerLazySingleton(() => ConsultantService(sl()));
+ sl.registerLazySingleton(() => DiaryService(sl()));
+ sl.registerLazySingleton(() => GlossaryService(sl()));
+ sl.registerLazySingleton(() => DietService(sl()));
+ sl.registerLazySingleton(() => PlansService(sl()));
+ sl.registerLazySingleton(() => PlanService(sl()));
+ sl.registerLazySingleton(() => MyDietsService(sl()));
+ sl.registerLazySingleton(() => MyPlansService(sl()));
+ sl.registerLazySingleton(() => WsService(sl()));
+ sl.registerLazySingleton(() => AboutRecipeService(sl()));
+ sl.registerLazySingleton(() => ComplainingService(sl()));
+ sl.registerLazySingleton(() => AuthService(sl()));
+ sl.registerLazySingleton(() => CardsService(sl()));
+ sl.registerLazySingleton(() => ConsultationService(sl()));
+ sl.registerLazySingleton(() => CancelPlanService(sl()));
+ sl.registerLazySingleton(() => CreatePlanService(sl()));
+ sl.registerLazySingleton(() => NotificationsService(sl()));
+ sl.registerLazySingleton(() => FirebaseApi());
+ sl.registerLazySingleton(() => ResetPasswordService(sl()));
+ sl.registerLazySingleton(() => BlockedUserService(sl()));
+ sl.registerLazySingleton(() => CommentsService(sl()));
+ sl.registerLazySingleton(() => MyRecipesService(sl()));
+ sl.registerLazySingleton(() => ConsultantRatingService(sl()));
+ sl.registerLazySingleton(() => NotificationSettingsService(sl()));
+ sl.registerLazySingleton(() => ViewsService(sl()));
+
+ // Content services
+ sl.registerLazySingleton(() => CreateRecipeService(sl()));
+ sl.registerLazySingleton(() => BlogPostService(sl()));
+ sl.registerLazySingleton(() => CreateDietService(sl()));
+
+ // Auth services
+ sl.registerLazySingleton(() => RegistrationService(sl()));
+ }
+}
diff --git a/lib/core/env_config.dart b/lib/core/env_config.dart
index a3404aeb..446bc65b 100644
--- a/lib/core/env_config.dart
+++ b/lib/core/env_config.dart
@@ -43,4 +43,12 @@ class EnvConfig {
// Connection Check URLs
static String get googleCheckUrl => dotenv.env['GOOGLE_CHECK_URL'] ?? '';
static String get yandexCheckUrl => dotenv.env['YANDEX_CHECK_URL'] ?? '';
+
+ // VK ID Configuration
+ static String get vkClientId => dotenv.env['VK_CLIENT_ID'] ?? '';
+
+ // Yandex ID Configuration
+ static String get yandexClientId => dotenv.env['YANDEX_CLIENT_ID'] ?? '';
+ static String get yandexClientSecret => dotenv.env['YANDEX_CLIENT_SECRET'] ?? '';
+ static String get yandexRedirectUri => dotenv.env['YANDEX_REDIRECT_URI'] ?? '';
}
diff --git a/lib/core/locator_service.dart b/lib/core/locator_service.dart
index c9c61e56..8299fea2 100644
--- a/lib/core/locator_service.dart
+++ b/lib/core/locator_service.dart
@@ -1,265 +1,27 @@
-import 'package:dio/dio.dart';
-import 'package:eatvio_app/core/comments/repositories/comments_repository.dart';
-import 'package:eatvio_app/core/comments/services/comments_service.dart';
-import 'package:eatvio_app/core/const.dart';
-import 'package:eatvio_app/core/dio/phone_verify_error_interceptor.dart';
-import 'package:eatvio_app/core/firebase_api.dart';
-import 'package:eatvio_app/core/interceptors/token_interceptor.dart';
-import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_cubit.dart';
-import 'package:eatvio_app/core/views/cubit/views_cubit.dart';
-import 'package:eatvio_app/core/views/repository/views_repository.dart';
-import 'package:eatvio_app/core/views/service/views_service.dart';
+import 'package:eatvio_app/core/di/cubit_registrations.dart';
+import 'package:eatvio_app/core/di/external_registrations.dart';
+import 'package:eatvio_app/core/di/repository_registrations.dart';
+import 'package:eatvio_app/core/di/service_registrations.dart';
import 'package:eatvio_app/core/websockets/ws_manager.dart';
-import 'package:eatvio_app/core/websockets/ws_service.dart';
-import 'package:eatvio_app/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart';
-import 'package:eatvio_app/features/auth/presentation/bloc/reset_password_cubit/reset_password_cubit.dart';
-import 'package:eatvio_app/features/auth/repositories/auth_repository.dart';
-import 'package:eatvio_app/features/auth/repositories/reset_password_repository.dart';
-import 'package:eatvio_app/features/auth/services/auth_service.dart';
-import 'package:eatvio_app/features/auth/services/reset_password_service.dart';
-import 'package:eatvio_app/features/blog_post/presentation/cubit/blog_post_cubit.dart';
-import 'package:eatvio_app/features/cancel_plan_bottom_sheet/cubit/cancel_plan_cubit.dart';
-import 'package:eatvio_app/features/cancel_plan_bottom_sheet/repository/cancel_plan_repository.dart';
-import 'package:eatvio_app/features/cancel_plan_bottom_sheet/service/cancel_plan_service.dart';
-import 'package:eatvio_app/features/complaining/presentation/cubit/complaining_cubit.dart';
-import 'package:eatvio_app/features/complaining/repositories/complaining_repository.dart';
-import 'package:eatvio_app/features/complaining/services/complaining_service.dart';
-import 'package:eatvio_app/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart';
-import 'package:eatvio_app/features/consultant_rating/repositories/consultant_rating_repository.dart';
-import 'package:eatvio_app/features/consultant_rating/services/consultant_rating_service.dart';
-import 'package:eatvio_app/features/consultations/presentation/cubit/consultations_cubit.dart';
-import 'package:eatvio_app/features/consultations/repositories/consultations_repository.dart';
-import 'package:eatvio_app/features/consultations/services/consultation_service.dart';
-import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/archive/consultations_archive_cubit.dart';
-import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
-import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart';
-import 'package:eatvio_app/features/create_diet/services/create_diet_service.dart';
-import 'package:eatvio_app/features/create_plan/presentation/cubit/create_plan_cubit.dart';
-import 'package:eatvio_app/features/create_plan/repositories/create_plan_repository.dart';
-import 'package:eatvio_app/features/create_plan/services/create_plan_service.dart';
-import 'package:eatvio_app/features/diary/presentation/bloc/consultant_comments_cubit/consultant_comments_cubit.dart';
-import 'package:eatvio_app/features/diets/repositories/diet_repository.dart';
-import 'package:eatvio_app/features/diets/services/diet_service.dart';
-import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart';
-import 'package:eatvio_app/features/blog_post_create/repositories/blog_post_repository.dart';
-import 'package:eatvio_app/features/blog_post_create/services/blog_post_service.dart';
-import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart';
-import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/consultant_finances/consultant_finances_cubit.dart';
-import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/user_purchases/user_purchases_cubit.dart';
-import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_cubit.dart';
-import 'package:eatvio_app/features/menu/presentation/bloc/notification_settings_cubit/notification_settings_cubit.dart';
-import 'package:eatvio_app/features/menu/presentation/repositories/blocked_users_repository.dart';
-import 'package:eatvio_app/features/menu/repositories/notification_settings_repository.dart';
-import 'package:eatvio_app/features/menu/services/blocked_users_service.dart';
-import 'package:eatvio_app/features/menu/services/notification_settings_service.dart';
-import 'package:eatvio_app/features/notifications/presentation/notifications_cubit/notifications_cubit.dart';
-import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
-import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_cubit.dart';
-import 'package:eatvio_app/features/calendar/repositories/calendar_repository.dart';
-import 'package:eatvio_app/features/calendar/services/calendar_service.dart';
-import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart';
-import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cubit.dart';
-import 'package:eatvio_app/features/chat/repositories/chat_repository.dart';
-import 'package:eatvio_app/features/chat/services/chat_service.dart';
-import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart';
-import 'package:eatvio_app/features/consultant/become_consultant/repositories/consultant_repository.dart';
-import 'package:eatvio_app/features/consultant/become_consultant/services/consultant_service.dart';
-import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
-import 'package:eatvio_app/features/diary/repositories/diary_repository.dart';
-import 'package:eatvio_app/features/diary/services/diary_service.dart';
-import 'package:eatvio_app/features/diets/presentation/cubit/about_diet_cubit.dart';
-import 'package:eatvio_app/core/comments/comments_cubit/comments_cubit.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_cubit.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_cubit.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/profile_cubit/profile_cubit.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart';
-import 'package:eatvio_app/features/feed/repositories/feed_repository.dart';
-import 'package:eatvio_app/features/feed/services/feed_service.dart';
-import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart';
-import 'package:eatvio_app/features/glossary/services/glossary_service.dart';
-import 'package:eatvio_app/features/feed/presentation/bloc/plans_cubit/plans_cubit.dart';
-import 'package:eatvio_app/features/my_diets/presentation/cubit/my_diets_cubit.dart';
-import 'package:eatvio_app/features/my_diets/repositories/my_diets_repository.dart';
-import 'package:eatvio_app/features/my_diets/services/my_diets_service.dart';
-import 'package:eatvio_app/features/my_finance/presentation/cubit/user_cards_cubit/user_cards_cubit.dart';
-import 'package:eatvio_app/features/my_finance/repositories/cards_repository.dart';
-import 'package:eatvio_app/features/my_finance/services/cards_service.dart';
-import 'package:eatvio_app/features/my_plans/presentation/cubit/my_plans_cubit.dart';
-import 'package:eatvio_app/features/my_plans/repositories/my_diets_repository.dart';
-import 'package:eatvio_app/features/my_plans/services/my_plans_service.dart';
-import 'package:eatvio_app/features/notifications/repository/notifications_repository.dart';
-import 'package:eatvio_app/features/notifications/service/notifications_service.dart';
-import 'package:eatvio_app/features/order_info/cubit/order_info_cubit.dart';
-import 'package:eatvio_app/features/plans/repositories/plans_repository.dart';
-import 'package:eatvio_app/features/plans/services/plans_service.dart';
-import 'package:eatvio_app/features/plans/presentation/cubit/about_plan_cubit.dart';
-import 'package:eatvio_app/features/plans/repositories/plan_repository.dart';
-import 'package:eatvio_app/features/plans/services/plan_service.dart';
-import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart';
-import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart';
-import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
-import 'package:eatvio_app/features/profile/services/profile_service.dart';
-import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
-import 'package:eatvio_app/features/create_recipe/reporitories/recipe_repository.dart';
-import 'package:eatvio_app/features/create_recipe/services/recipe_service.dart';
-import 'package:eatvio_app/features/recipe/presentation/cubit/about_recipe_cubit.dart';
-import 'package:eatvio_app/features/recipe/presentation/cubit/my_recipes_cubit/my_recieps_cubit.dart';
-import 'package:eatvio_app/features/recipe/repositories/about_recipe_repository.dart';
-import 'package:eatvio_app/features/recipe/repositories/my_recipes_repository.dart';
-import 'package:eatvio_app/features/recipe/services/about_recipe_service.dart';
-import 'package:eatvio_app/features/recipe/services/my_recipes_service.dart';
-import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
-import 'package:eatvio_app/features/registration/presentation/bloc/verify_email_cubit/verify_email_cubit.dart';
-import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
-import 'package:eatvio_app/features/registration/services/registration_service.dart';
-import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_cubit.dart';
-import 'package:eatvio_app/features/settings/repositories/service_repository.dart';
-import 'package:eatvio_app/features/settings/services/settings_service.dart';
-import 'package:eatvio_app/features/user_details/presentation/cubit/user_details_cubit.dart';
import 'package:get_it/get_it.dart';
-import 'package:eatvio_app/features/profile/presentation/bloc/plans_cubit/plans_cubit.dart' as profile_plans;
+/// Глобальный экземпляр GetIt для внедрения зависимостей
final sl = GetIt.instance;
+/// Инициализация системы внедрения зависимостей
Future init() async {
- // Cubit singletons
+ // Регистрация внешних зависимостей (Dio, etc.)
+ ExternalRegistrations.registerAll();
+
+ // Регистрация сервисов
+ ServiceRegistrations.registerAll();
+
+ // Регистрация репозиториев
+ RepositoryRegistrations.registerAll();
+
+ // Регистрация Cubit'ов
+ CubitRegistrations.registerAll();
+
+ // Регистрация WebSocket менеджера
sl.registerLazySingleton(() => WsManager(wsService: sl()));
- sl.registerLazySingleton(() => NewMessagesCubit());
- sl.registerLazySingleton(() => NotificationsCubit(wsManager: sl(), notificationsRepository: sl()));
- sl.registerLazySingleton(() => ProfileAvatarCubit(profileRepository: sl()));
- sl.registerLazySingleton(() => ChatsCubit(chatRepository: sl(), wsManager: sl(), profileRepository: sl()));
- sl.registerLazySingleton(() => InternetConnectionCubit());
-
- // Cubit factories
- sl.registerFactory(() => FeedCubit(feedRepository: sl()));
- sl.registerFactory(() => RegistrationCubit(registrationRepository: sl()));
- sl.registerFactory(() => ChatRoomCubit(cardsRepository: sl(), chatRepository: sl(), wsManager: sl()));
- sl.registerFactory(() => RecipesCubit(feedRepository: sl(), recipeRepository: sl(), aboutRecipeRepository: sl()));
- sl.registerFactory(() => CalendarCubit(calendarRepository: sl()));
- sl.registerFactory(() => ProfileCubit(profileRepository: sl(), chatRepository: sl(), consultantRepository: sl()));
- sl.registerFactory(() => profile_plans.PlansCubit(plansRepository: sl()));
- sl.registerFactory(() => DietsCubit(feedRepository: sl(), dietsRepository: sl()));
- sl.registerFactory(() => CommentsCubit(feedRepository: sl(), commentsRepository: sl()));
- sl.registerFactory(() => PlansCubit(feedRepository: sl(), planRepository: sl()));
- sl.registerFactory(() => SettingsCubit(profileRepository: sl(), settingsRepository: sl(), consultantRepository: sl(), consultationsRepository: sl()));
- sl.registerFactory(() => RegisterConsultantCubit(consultantRepository: sl()));
- sl.registerFactory(
- () => DiaryCubit(
- chatRepository: sl(),
- diaryRepository: sl(),
- glossaryRepository: sl(),
- profileRepository: sl(),
- dietRepository: sl(),
- settingsRepository: sl(),
- ),
- );
- sl.registerFactory(() => AboutDietCubit(dietsRepository: sl(), profileRepository: sl()));
- sl.registerFactory(() => BlogPostCreateCubit(blogPostRepository: sl()));
- sl.registerFactory(() => SubCubit(profileRepository: sl()));
- sl.registerFactory(() => CreateDietCubit(profileRepository: sl(), createDietRepository: sl(), glossaryRepository: sl()));
- sl.registerFactory(() => CreatePlanCubit(createPlanRepository: sl()));
- sl.registerFactory(() => FeedProfileCubit(profileRepository: sl()));
- sl.registerFactory(() => AboutPlanCubit(planRepository: sl()));
- sl.registerFactory(() => CreateRecipeCubit(recipeRepository: sl(), glossaryRepository: sl()));
- sl.registerFactory(() => MyDietsCubit(myDietsRepository: sl(), createDietRepository: sl()));
- sl.registerFactory(() => MyPlansCubit(myPlansRepository: sl()));
- sl.registerFactory(() => UserDetailsCubit(profileRepository: sl()));
- sl.registerFactory(() => ConsultantsCubit(feedRepository: sl()));
- sl.registerFactory(() => AboutRecipeCubit(recipeRepository: sl(), profileRepository: sl()));
- sl.registerFactory(() => AuthCubit(authRepository: sl()));
- sl.registerFactory(() => ComplainingCubit(repository: sl()));
- sl.registerFactory(() => UserCardsCubit(cardsRepository: sl()));
- sl.registerFactory(() => OrderInfoCubit(chatRepository: sl()));
- sl.registerFactory(() => ConsultationsCubit(consultationsRepository: sl()));
- sl.registerFactory(() => ConsultantCommentsCubit(diaryRepository: sl()));
- sl.registerFactory(() => CancelPlanCubit(cancelPlanRepository: sl()));
- sl.registerFactory(() => VerifyEmailCubit(profileRepository: sl()));
- sl.registerFactory(() => MyRecipesCubit(myRecipesRepository: sl(), aboutRecipeRepository: sl()));
- sl.registerFactory(() => ConsultationsArchiveCubit(consultationsRepository: sl()));
- sl.registerFactory(() => ConsultantFinancesCubit(consultationsRepository: sl()));
- sl.registerFactory(() => UserPurchasesCubit(consultationsRepository: sl()));
- sl.registerFactory(() => ResetPasswordCubit(resetPasswordRepository: sl()));
- sl.registerFactory(() => BlogPostCubit(sl()));
- sl.registerFactory(() => BlockedUsersCubit(blockedUsersRepository: sl()));
- sl.registerFactory(() => NotificationSettingsCubit(notificationSettingsRepository: sl()));
- sl.registerFactory(() => ConsultantRatingCubit(sl()));
- sl.registerFactory(() => ViewsCubit(viewsRepository: sl()));
-
- // Repository
- sl.registerLazySingleton(() => ChatRepository(chatService: sl()));
- sl.registerLazySingleton(() => FeedRepository(feedService: sl()));
- sl.registerLazySingleton(() => RegistrationRepository(registrationService: sl()));
- sl.registerLazySingleton(() => CalendarRepository(calendarService: sl()));
- sl.registerLazySingleton(() => ProfileRepository(profileService: sl()));
- sl.registerLazySingleton(() => RecipeRepository(recipeService: sl()));
- sl.registerLazySingleton(() => SettingsRepository(settingsService: sl()));
- sl.registerLazySingleton(() => ConsultantRepository(consultantService: sl()));
- sl.registerLazySingleton(() => DiaryRepository(diaryService: sl()));
- sl.registerLazySingleton(() => GlossaryRepository(glossaryService: sl()));
- sl.registerLazySingleton(() => DietRepository(dietsService: sl()));
- sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl()));
- sl.registerLazySingleton(() => CreateDietRepository(createDietService: sl()));
- sl.registerLazySingleton(() => PlansRepository(plansService: sl()));
- sl.registerLazySingleton(() => PlanRepository(planService: sl()));
- sl.registerLazySingleton(() => MyDietsRepository(myDietsService: sl()));
- sl.registerLazySingleton(() => MyPlansRepository(myPlansService: sl()));
- sl.registerLazySingleton(() => AboutRecipeRepository(recipeService: sl()));
- sl.registerLazySingleton(() => ComplainingRepository(service: sl()));
- sl.registerLazySingleton(() => AuthRepository(authService: sl()));
- sl.registerLazySingleton(() => CardsRepository(cardsService: sl()));
- sl.registerLazySingleton(() => ConsultationsRepository(consultationService: sl()));
- sl.registerLazySingleton(() => CancelPlanRepository(cancelService: sl()));
- sl.registerLazySingleton(() => CreatePlanRepository(createPlanService: sl()));
- sl.registerLazySingleton(() => NotificationsRepository(notificationsService: sl()));
- sl.registerFactory(() => MyRecipesRepository(myRecipesService: sl()));
- sl.registerFactory(() => ResetPasswordRepository(resetPasswordService: sl()));
- sl.registerLazySingleton(() => BlockedUsersRepository(blockedUserService: sl()));
- sl.registerLazySingleton(() => CommentsRepository(service: sl()));
- sl.registerLazySingleton(() => NotificationSettingsRepository(sl()));
- sl.registerFactory(() => ConsultantRatingRepository(sl()));
- sl.registerFactory(() => ViewsRepository(viewsService: sl()));
-
- // Services
- sl.registerLazySingleton(() => ChatService(sl()));
- sl.registerLazySingleton(() => FeedService(sl()));
- sl.registerLazySingleton(() => RegistrationService(sl()));
- sl.registerLazySingleton(() => CalendarService(sl()));
- sl.registerLazySingleton(() => ProfileService(sl()));
- sl.registerLazySingleton(() => CreateRecipeService(sl()));
- sl.registerLazySingleton