Files
be_happy_public/lib/presentation/viewmodel/pin_bloc.dart

103 lines
3.2 KiB
Dart

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<PinEvent, PinState> {
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<PinDigitChanged>(_onPinChanged);
on<PinSubmitted>(_onPinSubmitted);
on<PinScreenStarted>(_onPinScreenStarted);
}
void _onPinChanged(
PinDigitChanged event,
Emitter<PinState> emit,
) {
if (state is PinCreateInProgress) {
emit(PinCreateInProgress(pin: event.pin));
} else if (state is PinLoginInProgress) {
emit(PinLoginInProgress(pin: event.pin));
}
}
Future<void> _onPinSubmitted(
PinSubmitted event,
Emitter<PinState> 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<void> _onPinScreenStarted(
PinScreenStarted event,
Emitter<PinState> 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: "Ошибка доступа к хранилищу"));
}
}
}