108 lines
3.2 KiB
Dart
108 lines
3.2 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
||
import '../../core/result.dart';import '../../domain/entities/fine.dart';
|
||
|
||
import '../../domain/usecase/get_fine_details_usecase.dart';
|
||
import '../../domain/usecase/pay_fine_usecase.dart';
|
||
import '../event/fine_payment_event.dart';
|
||
import '../state/fine_payment_state.dart';
|
||
|
||
class FinePaymentBloc extends Bloc<FinePaymentEvent, FinePaymentState> {
|
||
final GetFineDetailsUsecase getFineDetailsUsecase;
|
||
final PayFineUsecase payFineUsecase;
|
||
|
||
FinePaymentBloc({
|
||
required this.getFineDetailsUsecase,
|
||
required this.payFineUsecase,
|
||
}) : super(const FinePaymentState()) {
|
||
on<FetchFineDetails>(_onFetchFineDetails);
|
||
on<FinePaymentCardChanged>(_onCardChanged);
|
||
on<SelectFineBalancePressed>(_onSelectBalance);
|
||
on<PayFineSubmitted>(_onPayFineSubmitted);
|
||
}
|
||
|
||
Future<void> _onFetchFineDetails(
|
||
FetchFineDetails event,
|
||
Emitter<FinePaymentState> emit,
|
||
) async {
|
||
emit(state.copyWith(status: FinePaymentStatus.loading));
|
||
try {
|
||
final result = await getFineDetailsUsecase(event.fineId); // Возвращает Result<Fine>
|
||
|
||
// Распаковываем Result
|
||
if (result is Success<Fine>) {
|
||
final fine = result.data; // Fine?
|
||
if (fine != null) {
|
||
emit(state.copyWith(
|
||
status: FinePaymentStatus.initial,
|
||
fine: fine,
|
||
));
|
||
} else {
|
||
emit(
|
||
state.copyWith(
|
||
status: FinePaymentStatus.failure,
|
||
errorMessage: "Не удалось получить данные о штрафе",
|
||
),
|
||
);
|
||
}
|
||
} else if (result is Failure<Fine>) {
|
||
emit(
|
||
state.copyWith(
|
||
status: FinePaymentStatus.failure,
|
||
errorMessage: result.failure.toString(), // или конкретное сообщение
|
||
),
|
||
);
|
||
}
|
||
} catch (e) {
|
||
emit(
|
||
state.copyWith(
|
||
status: FinePaymentStatus.failure,
|
||
errorMessage: 'Не удалось загрузить данные о штрафе',
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
void _onCardChanged(
|
||
FinePaymentCardChanged event,
|
||
Emitter<FinePaymentState> emit,
|
||
) {
|
||
emit(state.copyWith(selectedCard: event.card, useBalance: false));
|
||
}
|
||
|
||
void _onSelectBalance(
|
||
SelectFineBalancePressed event,
|
||
Emitter<FinePaymentState> emit,
|
||
) {
|
||
emit(state.copyWith(useBalance: true, selectedCard: null));
|
||
}
|
||
|
||
Future<void> _onPayFineSubmitted(
|
||
PayFineSubmitted event,
|
||
Emitter<FinePaymentState> emit,
|
||
) async {
|
||
if (state.fine == null) return;
|
||
|
||
emit(state.copyWith(status: FinePaymentStatus.loading));
|
||
try {
|
||
await payFineUsecase(
|
||
orderId: state.fine!.id,
|
||
cardId: state.useBalance ? null : state.selectedCard?.id,
|
||
isBalance: state.useBalance,
|
||
);
|
||
emit(
|
||
state.copyWith(
|
||
status: FinePaymentStatus.success,
|
||
paymentCompleted: true,
|
||
),
|
||
);
|
||
} catch (e) {
|
||
emit(
|
||
state.copyWith(
|
||
status: FinePaymentStatus.failure,
|
||
errorMessage: e.toString(),
|
||
),
|
||
);
|
||
}
|
||
}
|
||
}
|