import 'dart:async'; import 'package:be_happy/domain/usecase/add_payment_card_usecase.dart'; import 'package:be_happy/domain/usecase/get_profile_usecase.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../core/result.dart'; import '../../core/failures.dart'; import '../../domain/entities/payment_card.dart'; import '../../domain/usecase/get_payment_cards_usecase.dart'; import '../../domain/usecase/remove_payment_card_usecase.dart'; import '../../domain/usecase/set_main_payment_card_usecase.dart'; import '../event/payment_methods_event.dart'; import '../state/payment_methods_state.dart'; class PaymentMethodsBloc extends Bloc { final GetPaymentCardsUsecase _getPaymentCardsUsecase; final RemovePaymentCardUsecase _removePaymentCardUsecase; final SetMainPaymentCardUsecase _setMainPaymentCardUsecase; final GetProfileUseCase _getProfileUseCase; final AddPaymentCardUsecase _addPaymentCardUsecase; PaymentMethodsBloc( this._getPaymentCardsUsecase, this._removePaymentCardUsecase, this._setMainPaymentCardUsecase, this._getProfileUseCase, this._addPaymentCardUsecase, ) : super(PaymentMethodsState(status: PaymentMethodsStatus.initial)) { on(_onStarted); on(_onDeleteCard); on(_onSetMainCard); on(_onAddPayemntCardPressed); } Future _onStarted( PaymentMethodsStarted event, Emitter emit, ) async { emit(state.copyWith(status: PaymentMethodsStatus.loading)); try { final result = await _getPaymentCardsUsecase(); final profile = await _getProfileUseCase(); if (result is Success>) { emit(state.copyWith( status: PaymentMethodsStatus.success, cards: result.data ?? [], balance: profile.balance, )); } else if (result is Failure) { String errorMessage = 'Не удалось загрузить карты'; /*if (result.failure is AuthFailure) { errorMessage = 'Ошибка авторизации'; } else if (result.failure is UnknownFailure) { errorMessage = result.failure.message ?? 'Неизвестная ошибка'; }*/ emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: errorMessage, )); } } catch (e) { emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: e.toString(), )); } } Future _onDeleteCard( PaymentMethodsDeleteCard event, Emitter emit, ) async { emit(state.copyWith( status: PaymentMethodsStatus.loading, isDeleting: true, )); try { final result = await _removePaymentCardUsecase(event.cardId); if (result is Success) { emit(state.copyWith(isDeleting: false, status: PaymentMethodsStatus.success)); add(PaymentMethodsStarted()); } else if (result is Failure) { String errorMessage = 'Не удалось удалить карту'; if (result.failure is AuthFailure) { errorMessage = 'Ошибка авторизации'; } else if (result.failure is UnknownFailure) { errorMessage = result.failure.message ?? 'Неизвестная ошибка'; } emit(state.copyWith( isDeleting: false, errorMessage: errorMessage, )); } } catch (e) { emit(state.copyWith( isDeleting: false, errorMessage: e.toString(), )); } } Future _onSetMainCard( PaymentMethodsSetMainCard event, Emitter emit, ) async { emit(state.copyWith(isSettingMain: true)); try { final result = await _setMainPaymentCardUsecase(event.cardId); if (result is Success) { emit(state.copyWith(isSettingMain: false)); add(PaymentMethodsStarted()); } else if (result is Failure) { String errorMessage = 'Не удалось установить основную карту'; if (result.failure is AuthFailure) { errorMessage = 'Ошибка авторизации'; } else if (result.failure is UnknownFailure) { errorMessage = result.failure.message ?? 'Неизвестная ошибка'; } emit(state.copyWith( isSettingMain: false, errorMessage: errorMessage, )); } } catch (e) { emit(state.copyWith( isSettingMain: false, errorMessage: e.toString(), )); } } FutureOr _onAddPayemntCardPressed( AddPayemntCardPressed event, Emitter emit ) async { emit(state.copyWith(status: PaymentMethodsStatus.loading)); try { final result = await _addPaymentCardUsecase(); if (result is Success>) { final formUrlString = result.data?['formUrl'] as String?; if (formUrlString != null && formUrlString.isNotEmpty) { final url = Uri.parse(formUrlString); if (await canLaunchUrl(url)) { launchUrl( url, mode: LaunchMode.externalApplication, ); emit(state.copyWith(status: PaymentMethodsStatus.success)); } else { emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: 'Не удалось открыть ссылку для оплаты', )); } } else { emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: 'Ссылка для привязки карты не получена от сервера', )); } } else if (result is Failure) { String errorMessage = 'Ошибка при добавлении карты'; emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: errorMessage, )); } } catch (e) { emit(state.copyWith( status: PaymentMethodsStatus.failure, errorMessage: e.toString(), )); } }}