import 'package:be_happy/core/result.dart'; import 'package:be_happy/domain/entities/subscription.dart'; import 'package:be_happy/domain/usecase/activate_subscription_usecase.dart'; import 'package:be_happy/domain/usecase/get_subscription_by_id_usecase.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../domain/entities/client_subscription.dart'; import '../../domain/usecase/get_client_subscriptions_usecase.dart'; import '../event/subscription_details_event.dart'; import '../state/susbcription_details_state.dart'; class SubscriptionDetailsBloc extends Bloc { final GetSubscriptionByIdUsecase getSubscriptionByIdUsecase; final ActivateSubscriptionUsecase activateSubscriptionUsecase; final GetClientSubscriptionsUsecase getClientSubscriptionsUsecase; SubscriptionDetailsBloc( this.getSubscriptionByIdUsecase, this.activateSubscriptionUsecase, this.getClientSubscriptionsUsecase, ) : super(DetailsLoading()) { on((event, emit) async { emit(DetailsLoading()); try { final result = await getSubscriptionByIdUsecase(event.subscriptionId); final clientSubsResult = await getClientSubscriptionsUsecase(); bool isPurchased = false; switch (clientSubsResult) { case Success>(): isPurchased = clientSubsResult.data?.any( (element) => element.subscriptionId == event.subscriptionId, ) ?? false; break; case Failure>(): isPurchased = false; break; } switch (result) { case Success(): final sub = result.data; if (sub == null) return; emit( DetailsContentState( subscription: sub, selectedPeriod: sub.options.first, isAlreadyPurchased: isPurchased, ), ); break; case Failure(): emit(DetailsError("Ошибка при запросе данных")); break; } } catch (e) { emit(DetailsError("Не удалось загрузить данные")); } }); on((event, emit) { if (state is DetailsContentState) { emit( (state as DetailsContentState).copyWith(selectedPeriod: event.period), ); } }); on((event, emit) { if (state is DetailsContentState) { emit((state as DetailsContentState).copyWith(isAgreed: event.value)); } }); on((event, emit) async { switch (state) { case DetailsContentState contentState: if (!contentState.isAgreed) { return; } final result = await activateSubscriptionUsecase(contentState.selectedPeriod.id); if (result is Success) { emit(contentState.copyWith(isSuccess: true)); } else { } break; default: break; } }); } }