103 lines
3.2 KiB
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: "Ошибка доступа к хранилищу"));
|
|
}
|
|
}
|
|
} |