Files
be_happy_public/lib/presentation/viewmodel/fine_payment_bloc.dart
2026-08-14 13:47:11 +03:00

108 lines
3.2 KiB
Dart
Raw 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 '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(),
),
);
}
}
}