This commit implements a complete authentication flow, including user registration. - Introduces an `AuthRegisterRequested` event to handle user registration. - Persists the user ID in settings upon successful authentication. - Modifies `AuthBloc` to load the user based on the stored ID, improving app launch persistence. - Refactors `UserCubit` to only manage the user state and removes authentication logic. - Removes `UserCubit` initialization from `main.dart` and triggers `AuthStarted` to initiate the authentication process.
190 lines
7.4 KiB
Dart
190 lines
7.4 KiB
Dart
import 'package:get_it/get_it.dart';
|
|
|
|
import 'data/database/hive_service.dart';
|
|
import 'data/repositories/hive_category_repository.dart';
|
|
import 'data/repositories/hive_global_settings_repository.dart';
|
|
import 'data/repositories/hive_settings_repository.dart';
|
|
import 'data/repositories/hive_sms_handler_repository.dart';
|
|
import 'data/repositories/hive_sms_message_repository.dart';
|
|
import 'data/repositories/hive_tag_repository.dart';
|
|
import 'data/repositories/hive_transaction_repository.dart';
|
|
import 'data/repositories/hive_user_repository.dart';
|
|
import 'data/repositories/interfaces/icategory_repository.dart';
|
|
import 'data/repositories/interfaces/iglobal_settings_repository.dart';
|
|
import 'data/repositories/interfaces/isettings_repository.dart';
|
|
import 'data/repositories/interfaces/isms_handler_repository.dart';
|
|
import 'data/repositories/interfaces/isms_message_repository.dart';
|
|
import 'data/repositories/interfaces/itag_repository.dart';
|
|
import 'data/repositories/interfaces/itransaction_repository.dart';
|
|
import 'data/repositories/interfaces/iuser_repository.dart';
|
|
import 'logic/auth/auth_bloc.dart';
|
|
import 'logic/category/category_cubit.dart';
|
|
import 'logic/settings/settings_cubit.dart';
|
|
import 'logic/sms/sms_cubit.dart';
|
|
import 'logic/tag/tag_cubit.dart';
|
|
import 'logic/transaction/transaction_bloc.dart';
|
|
import 'logic/user/user_cubit.dart';
|
|
import 'services/sms_service.dart';
|
|
|
|
final getIt = GetIt.instance;
|
|
|
|
/// Инициализация глобальных зависимостей, которые не зависят от пользователя.
|
|
/// Вызывается один раз при старте приложения.
|
|
Future<void> initGlobalDependencies() async {
|
|
// Инициализация Hive
|
|
await HiveService.initGlobalBoxes();
|
|
|
|
// Глобальные репозитории
|
|
getIt.registerSingleton<IUserRepository>(
|
|
HiveUserRepository(HiveService.users),
|
|
);
|
|
getIt.registerSingleton<IGlobalSettingsRepository>(
|
|
HiveGlobalSettingsRepository(HiveService.globalSettings),
|
|
);
|
|
|
|
// Сервисы
|
|
getIt.registerSingleton<SmsService>(SmsService());
|
|
|
|
// Cubits & Blocs, которые нужны до входа пользователя
|
|
getIt.registerSingleton<UserCubit>(
|
|
UserCubit(
|
|
settingsRepository: getIt<IGlobalSettingsRepository>(),
|
|
userRepository: getIt<IUserRepository>(),
|
|
// Эти репозитории будут заменены после входа пользователя
|
|
categoryRepository:
|
|
null, // Временно null, будет заменен в initUserSpecificDependencies
|
|
tagRepository:
|
|
null, // Временно null, будет заменен в initUserSpecificDependencies
|
|
transactionRepository:
|
|
null, // Временно null, будет заменен в initUserSpecificDependencies
|
|
),
|
|
);
|
|
getIt.registerFactory<AuthBloc>(() => AuthBloc(
|
|
userCubit: getIt(),
|
|
settingsRepository: getIt(),
|
|
userRepository: getIt(),
|
|
));
|
|
}
|
|
|
|
/// Инициализация зависимостей, специфичных для пользователя.
|
|
/// Вызывается после успешной аутентификации.
|
|
Future<void> initUserSpecificDependencies(String userId) async {
|
|
// Открываем пользовательские Hive Box'ы
|
|
await HiveService.initUserBoxes(userId);
|
|
|
|
// --- Регистрация пользовательских репозиториев ---
|
|
// Используем lazy singletons, чтобы их можно было легко сбросить и создать заново при смене пользователя.
|
|
|
|
// Категории
|
|
if (getIt.isRegistered<ICategoryRepository>()) {
|
|
await getIt.unregister<ICategoryRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ICategoryRepository>(
|
|
() => HiveCategoryRepository(HiveService.categories),
|
|
);
|
|
|
|
// Теги
|
|
if (getIt.isRegistered<ITagRepository>()) {
|
|
await getIt.unregister<ITagRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ITagRepository>(
|
|
() => HiveTagRepository(),
|
|
);
|
|
|
|
// Транзакции
|
|
if (getIt.isRegistered<ITransactionRepository>()) {
|
|
await getIt.unregister<ITransactionRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ITransactionRepository>(
|
|
() => HiveTransactionRepository(HiveService.transactions),
|
|
);
|
|
|
|
// Настройки приложения
|
|
if (getIt.isRegistered<ISettingsRepository>()) {
|
|
await getIt.unregister<ISettingsRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ISettingsRepository>(
|
|
() => HiveSettingsRepository(HiveService.appSettings),
|
|
);
|
|
|
|
// Настройки обработчика SMS
|
|
if (getIt.isRegistered<ISmsHandlerRepository>()) {
|
|
await getIt.unregister<ISmsHandlerRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ISmsHandlerRepository>(
|
|
() => HiveSmsHandlerRepository(HiveService.smsHandlerSettings),
|
|
);
|
|
|
|
// Сообщения SMS
|
|
if (getIt.isRegistered<ISmsMessageRepository>()) {
|
|
await getIt.unregister<ISmsMessageRepository>();
|
|
}
|
|
getIt.registerLazySingleton<ISmsMessageRepository>(
|
|
() => HiveSmsMessageRepository(HiveService.smsMessages),
|
|
);
|
|
|
|
// --- Обновление UserCubit новыми репозиториями ---
|
|
// Мы не пересоздаем UserCubit, а просто обновляем его зависимости.
|
|
final userCubit = getIt<UserCubit>();
|
|
userCubit.categoryRepository = getIt<ICategoryRepository>();
|
|
userCubit.tagRepository = getIt<ITagRepository>();
|
|
userCubit.transactionRepository = getIt<ITransactionRepository>();
|
|
|
|
// --- Регистрация Cubits & Blocs, которые зависят от пользовательских данных ---
|
|
|
|
// Настройки
|
|
if (getIt.isRegistered<SettingsCubit>()) {
|
|
await getIt.unregister<SettingsCubit>();
|
|
}
|
|
getIt.registerSingleton<SettingsCubit>(
|
|
SettingsCubit(getIt()),
|
|
);
|
|
|
|
// Транзакции
|
|
if (getIt.isRegistered<TransactionBloc>()) {
|
|
await getIt.unregister<TransactionBloc>();
|
|
}
|
|
getIt.registerFactory<TransactionBloc>(
|
|
() => TransactionBloc(transactionRepository: getIt()),
|
|
);
|
|
|
|
// SMS
|
|
if (getIt.isRegistered<SmsCubit>()) {
|
|
await getIt.unregister<SmsCubit>();
|
|
}
|
|
getIt.registerFactory<SmsCubit>(() => SmsCubit(getIt(), getIt(), getIt()));
|
|
|
|
// Категории
|
|
if (getIt.isRegistered<CategoryCubit>()) {
|
|
await getIt.unregister<CategoryCubit>();
|
|
}
|
|
getIt.registerFactory<CategoryCubit>(
|
|
() => CategoryCubit(getIt()), // Добавляем userId
|
|
);
|
|
|
|
// Теги
|
|
if (getIt.isRegistered<TagCubit>()) {
|
|
await getIt.unregister<TagCubit>();
|
|
}
|
|
getIt.registerFactory<TagCubit>(() => TagCubit(getIt()));
|
|
}
|
|
|
|
/// Сброс пользовательских зависимостей при выходе из системы.
|
|
Future<void> resetUserSpecificDependencies() async {
|
|
// Закрываем пользовательские Hive Box'ы
|
|
await HiveService.closeUserBoxes();
|
|
|
|
// Разрегистрация всех пользовательских зависимостей
|
|
await getIt.unregister<ICategoryRepository>();
|
|
await getIt.unregister<ITagRepository>();
|
|
await getIt.unregister<ITransactionRepository>();
|
|
await getIt.unregister<ISettingsRepository>();
|
|
await getIt.unregister<ISmsHandlerRepository>();
|
|
await getIt.unregister<ISmsMessageRepository>();
|
|
await getIt.unregister<SettingsCubit>();
|
|
await getIt.unregister<TransactionBloc>();
|
|
await getIt.unregister<SmsCubit>();
|
|
await getIt.unregister<CategoryCubit>();
|
|
await getIt.unregister<TagCubit>();
|
|
}
|