Files
2026-05-12 12:02:40 +03:00

84 lines
2.6 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'package:be_happy/domain/usecase/verify_pin_usecase.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../domain/usecase/is_pin_set_usecase.dart';
import '../event/pin_event.dart';
import '../state/pin_state.dart';
import '../../domain/usecase/create_pin_usecase.dart';
class PinBloc extends Bloc<PinEvent, PinState> {
final CreatePinUseCase createPinUseCase;
final VerifyPinUseCase verifyPinUsecase;
final IsPinSetUsecase isPinSetUsecase;
PinBloc({
required this.createPinUseCase,
required this.verifyPinUsecase,
required this.isPinSetUsecase,
bool isRegistration = true,
}) : 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);
emit(const PinSuccess());
} else {
final isValid = await verifyPinUsecase(currentPin);
if (isValid) {
emit(const PinSuccess());
} else {
throw Exception("Неверный ПИН-код");
}
}
} 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) {
// Пин ЕСТЬ в базе — значит, нужно его ВВЕСТИ (Login)
emit(const PinLoginInProgress(pin: ''));
} else {
// Пина НЕТ в базе — значит, нужно его СОЗДАТЬ (Create)
emit(const PinCreateInProgress(pin: ''));
}
} catch (e) {
emit(PinLoginInProgress(pin: '', error: "Ошибка доступа к хранилищу"));
}
}
}