From e91f37325833ed94a625e2e25470cd21133a3d22 Mon Sep 17 00:00:00 2001 From: Polyanka1 Date: Mon, 13 Jul 2026 11:49:00 +0300 Subject: [PATCH] fix add new card in bottomsheet --- lib/di/service_locator.dart | 4 +- .../components/sheet/tariff_sheet.dart | 3 + .../event/payment_method_sheet_event.dart | 2 + lib/presentation/navigation/app_router.dart | 1 + .../screens/edit_profile_screen.dart | 3 +- .../screens/payment_confirm_screen.dart | 2 + .../screens/subscription_details_screen.dart | 2 + lib/presentation/screens/top_up_screen.dart | 2 + .../viewmodel/payment_method_sheet_bloc.dart | 79 ++++++++++++++++--- 9 files changed, 82 insertions(+), 16 deletions(-) diff --git a/lib/di/service_locator.dart b/lib/di/service_locator.dart index 26f8ec0..63f79b3 100644 --- a/lib/di/service_locator.dart +++ b/lib/di/service_locator.dart @@ -307,7 +307,7 @@ Future setupDependencies() async { getIt.registerFactory(() => VerifyCodeBloc(getIt(), getIt(), getIt())); - getIt.registerLazySingleton(() => ProfileBloc(getIt(), getIt(), getIt())); + getIt.registerFactory(() => ProfileBloc(getIt(), getIt(), getIt())); getIt.registerFactory( () => EditProfileBloc(getIt(), getIt()), @@ -337,7 +337,7 @@ Future setupDependencies() async { getIt.registerFactory( - () => PaymentMethodSheetBloc(getIt(), getIt(), getIt()), + () => PaymentMethodSheetBloc(getIt(), getIt(), getIt(), getIt()), ); getIt.registerFactory(() => CurrentRidesBloc(getIt())); diff --git a/lib/presentation/components/sheet/tariff_sheet.dart b/lib/presentation/components/sheet/tariff_sheet.dart index 35cf45e..326ec4a 100644 --- a/lib/presentation/components/sheet/tariff_sheet.dart +++ b/lib/presentation/components/sheet/tariff_sheet.dart @@ -11,6 +11,7 @@ import '../../../di/service_locator.dart'; import '../../../domain/entities/payment_card.dart'; import '../../../domain/entities/scooter.dart'; import '../../../domain/entities/tariff.dart'; +import '../../../domain/usecase/add_payment_card_usecase.dart'; import '../../../domain/usecase/get_payment_cards_usecase.dart'; import '../../../domain/usecase/get_profile_usecase.dart'; import '../../../domain/usecase/set_main_payment_card_usecase.dart'; @@ -322,6 +323,8 @@ class _TariffSheetState extends State { getIt(), getIt(), getIt(), + getIt(), + )..add(PaymentMethodSheetStarted()), child: PaymentMethodSheet( initialSelectedCard: state.useBalance ? null : state.selectedCard, diff --git a/lib/presentation/event/payment_method_sheet_event.dart b/lib/presentation/event/payment_method_sheet_event.dart index 9faaa26..3af9d6e 100644 --- a/lib/presentation/event/payment_method_sheet_event.dart +++ b/lib/presentation/event/payment_method_sheet_event.dart @@ -4,6 +4,8 @@ sealed class PaymentMethodSheetEvent {} class PaymentMethodSheetStarted extends PaymentMethodSheetEvent {} +class AddCardButtonPressed extends PaymentMethodSheetEvent {} + class SelectPaymentCardRequested extends PaymentMethodSheetEvent { final PaymentCard card; SelectPaymentCardRequested(this.card); diff --git a/lib/presentation/navigation/app_router.dart b/lib/presentation/navigation/app_router.dart index d446bb1..1ef67a1 100644 --- a/lib/presentation/navigation/app_router.dart +++ b/lib/presentation/navigation/app_router.dart @@ -264,6 +264,7 @@ class AppRouter { getIt(), getIt(), getIt(), + getIt(), ), child: PaymentMethodSheet(), ), diff --git a/lib/presentation/screens/edit_profile_screen.dart b/lib/presentation/screens/edit_profile_screen.dart index 7541c80..7cb9e2b 100644 --- a/lib/presentation/screens/edit_profile_screen.dart +++ b/lib/presentation/screens/edit_profile_screen.dart @@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import '../../core/app_colors.dart'; -import '../../di/service_locator.dart'; import '../../domain/entities/user_profile.dart'; import '../components/custom_app_bar.dart'; import '../components/gradient_button.dart'; @@ -107,7 +106,7 @@ class _EditProfileScreenState extends State { } if (state.isSuccess) { - getIt().add(ProfileUpdated()); + context.read().add(ProfileUpdated()); context.pop(); } if (state.error != null) { diff --git a/lib/presentation/screens/payment_confirm_screen.dart b/lib/presentation/screens/payment_confirm_screen.dart index 84c3d3f..cb69ff3 100644 --- a/lib/presentation/screens/payment_confirm_screen.dart +++ b/lib/presentation/screens/payment_confirm_screen.dart @@ -1,3 +1,4 @@ +import 'package:be_happy/domain/usecase/add_payment_card_usecase.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; @@ -224,6 +225,7 @@ class _PaymentConfirmScreenContent extends StatelessWidget { getIt(), getIt(), getIt(), + getIt(), )..add(PaymentMethodSheetStarted()), child: PaymentMethodSheet( initialSelectedCard: state.useBalance ? null : state.selectedCard, diff --git a/lib/presentation/screens/subscription_details_screen.dart b/lib/presentation/screens/subscription_details_screen.dart index e881388..ac322ba 100644 --- a/lib/presentation/screens/subscription_details_screen.dart +++ b/lib/presentation/screens/subscription_details_screen.dart @@ -5,6 +5,7 @@ import 'package:go_router/go_router.dart'; import '../../core/app_colors.dart'; import '../../di/service_locator.dart'; import '../../domain/entities/payment_card.dart'; +import '../../domain/usecase/add_payment_card_usecase.dart'; import '../../domain/usecase/get_payment_cards_usecase.dart'; import '../../domain/usecase/get_profile_usecase.dart'; import '../../domain/usecase/set_main_payment_card_usecase.dart'; @@ -172,6 +173,7 @@ class SubscriptionDetailsScreen extends StatelessWidget { getIt(), getIt(), getIt(), + getIt(), )..add(PaymentMethodSheetStarted()), child: const PaymentMethodSheet(showBalance: false), ), diff --git a/lib/presentation/screens/top_up_screen.dart b/lib/presentation/screens/top_up_screen.dart index 916e98b..657055e 100644 --- a/lib/presentation/screens/top_up_screen.dart +++ b/lib/presentation/screens/top_up_screen.dart @@ -6,6 +6,7 @@ import 'package:go_router/go_router.dart'; import '../../core/app_colors.dart'; import '../../di/service_locator.dart'; import '../../domain/entities/payment_card.dart'; +import '../../domain/usecase/add_payment_card_usecase.dart'; import '../../domain/usecase/get_payment_cards_usecase.dart'; import '../../domain/usecase/get_profile_usecase.dart'; import '../../domain/usecase/set_main_payment_card_usecase.dart'; @@ -196,6 +197,7 @@ class TopUpScreen extends StatelessWidget { getIt(), getIt(), getIt(), + getIt(), )..add(PaymentMethodSheetStarted()), child: const PaymentMethodSheet(showBalance: false), ), diff --git a/lib/presentation/viewmodel/payment_method_sheet_bloc.dart b/lib/presentation/viewmodel/payment_method_sheet_bloc.dart index c998cab..6a0ef4f 100644 --- a/lib/presentation/viewmodel/payment_method_sheet_bloc.dart +++ b/lib/presentation/viewmodel/payment_method_sheet_bloc.dart @@ -1,27 +1,36 @@ +import 'dart:async'; + import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../core/result.dart'; import '../../domain/entities/payment_card.dart'; +import '../../domain/usecase/add_payment_card_usecase.dart'; import '../../domain/usecase/get_payment_cards_usecase.dart'; import '../../domain/usecase/get_profile_usecase.dart'; import '../../domain/usecase/set_main_payment_card_usecase.dart'; import '../event/payment_method_sheet_event.dart'; import '../state/payment_method_sheet_state.dart'; -class PaymentMethodSheetBloc extends Bloc { +class PaymentMethodSheetBloc + extends Bloc { final GetPaymentCardsUsecase _getPaymentCardsUsecase; final GetProfileUseCase _getProfileUseCase; final SetMainPaymentCardUsecase _setMainPaymentCardUsecase; + final AddPaymentCardUsecase _addPaymentCardUsecase; - PaymentMethodSheetBloc(this._getPaymentCardsUsecase, this._setMainPaymentCardUsecase, this._getProfileUseCase) - : super(PaymentMethodSheetState(status: PaymentMethodSheetStatus.initial)) { + + PaymentMethodSheetBloc(this._getPaymentCardsUsecase, + this._setMainPaymentCardUsecase, this._getProfileUseCase, + this._addPaymentCardUsecase) + : super( + PaymentMethodSheetState(status: PaymentMethodSheetStatus.initial)) { on(_onStarted); + on(_onAddCardButtonPressed); } - Future _onStarted( - PaymentMethodSheetStarted event, - Emitter emit, - ) async { + Future _onStarted(PaymentMethodSheetStarted event, + Emitter emit,) async { emit(state.copyWith(status: PaymentMethodSheetStatus.loading)); try { @@ -48,10 +57,9 @@ class PaymentMethodSheetBloc extends Bloc _onSelectCard( - SelectPaymentCardRequested event, - Emitter emit, - ) async { + + Future _onSelectCard(SelectPaymentCardRequested event, + Emitter emit,) async { // Включаем локальный лоадер на шторке, либо просто ждем ответа emit(state.copyWith(status: PaymentMethodSheetStatus.loading)); @@ -65,7 +73,8 @@ class PaymentMethodSheetBloc extends Bloc _onAddCardButtonPressed(AddCardButtonPressed event, + Emitter emit) async { + 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: PaymentMethodSheetStatus.success)); + } else { + emit(state.copyWith( + status: PaymentMethodSheetStatus.failure, + errorMessage: 'Не удалось открыть ссылку для оплаты', + )); + } + } else { + emit(state.copyWith( + status: PaymentMethodSheetStatus.failure, + errorMessage: 'Ссылка для привязки карты не получена от сервера', + )); + } + } else if (result is Failure) { + String errorMessage = 'Ошибка при добавлении карты'; + + emit(state.copyWith( + status: PaymentMethodSheetStatus.failure, + errorMessage: errorMessage, + )); + } + } catch (e) { + emit(state.copyWith( + status: PaymentMethodSheetStatus.failure, + errorMessage: e.toString(), + )); + } + } }