import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../domain/usecase/create_pin_usecase.dart'; import '../../domain/usecase/get_profile_usecase.dart'; import '../../domain/usecase/is_pin_set_usecase.dart'; import '../../domain/usecase/verify_pin_usecase.dart'; import '../event/pin_event.dart'; import '../state/pin_state.dart'; class PinBloc extends Bloc { final CreatePinUseCase createPinUseCase; final VerifyPinUseCase verifyPinUsecase; final IsPinSetUsecase isPinSetUsecase; final GetProfileUseCase getProfileUseCase; PinBloc({ required this.createPinUseCase, required this.verifyPinUsecase, required this.isPinSetUsecase, required this.getProfileUseCase, }) : super(const PinLoading()) { on(_onPinChanged); on(_onPinSubmitted); on(_onPinScreenStarted); } void _onPinChanged( PinDigitChanged event, Emitter emit, ) { if (state is PinCreateInProgress) { emit(PinCreateInProgress(pin: event.pin)); } else if (state is PinLoginInProgress) { emit(PinLoginInProgress(pin: event.pin)); } } Future _onPinSubmitted( PinSubmitted event, Emitter emit, ) async { final currentPin = event.pin; final bool isCreateMode = state is PinCreateInProgress; emit(const PinLoading()); try { if (isCreateMode) { await createPinUseCase(currentPin); } else { final isValid = await verifyPinUsecase(currentPin); if (!isValid) { throw Exception("Неверный ПИН-код"); } } // Проверяем заполненность профиля bool isProfileIncomplete = true; try { final profile = await getProfileUseCase(); // Если хотя бы одно из обязательных полей пустое — профиль считается незаполненным isProfileIncomplete = profile.name.trim().isEmpty || profile.birthDate.trim().isEmpty || profile.email.trim().isEmpty || profile.phone.trim().isEmpty; } catch (_) { isProfileIncomplete = true; } emit(PinSuccess(isProfileIncomplete: isProfileIncomplete)); } catch (e) { if (isCreateMode) { emit(PinCreateInProgress(pin: '', error: e.toString())); } else { emit(PinLoginInProgress( pin: '', error: e.toString().contains("Неверный") ? "Неверный ПИН-код" : "Ошибка при проверке", )); } } } FutureOr _onPinScreenStarted( PinScreenStarted event, Emitter emit, ) async { try { final bool hasPin = await isPinSetUsecase(); if (hasPin) { emit(const PinLoginInProgress(pin: '')); } else { emit(const PinCreateInProgress(pin: '')); } } catch (e) { emit(PinLoginInProgress(pin: '', error: "Ошибка доступа к хранилищу")); } } }