From f7e0e429e1f4b737f7285b0a6c06f2eb795ca861 Mon Sep 17 00:00:00 2001 From: CowboyGH Date: Sat, 13 Jun 2026 17:16:08 +0700 Subject: [PATCH 1/2] fix(subscriptions): refresh profile subscription section after purchase --- lib/core/di/di.dart | 8 ++++++++ .../profile/presentation/pages/profile_page_builder.dart | 7 ++----- .../presentation/pages/subscriptions_details_page.dart | 3 +++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/core/di/di.dart b/lib/core/di/di.dart index cdddff5..52918c4 100644 --- a/lib/core/di/di.dart +++ b/lib/core/di/di.dart @@ -29,6 +29,7 @@ import '../../features/profile/data/repositories/profile_statistics_repository_i import '../../features/profile/domain/repositories/profile_parameters_repository.dart'; import '../../features/profile/domain/repositories/profile_repository.dart'; import '../../features/profile/domain/repositories/profile_statistics_repository.dart'; +import '../../features/profile/presentation/cubits/profile_subscription_cubit.dart'; import '../../features/subscriptions/data/remote/subscription_payment_api_client.dart'; import '../../features/subscriptions/data/remote/subscriptions_api_client.dart'; import '../../features/subscriptions/data/repositories/subscriptions_repository_impl.dart'; @@ -170,6 +171,13 @@ Future setupDI() async { di(), ), ); + di.registerLazySingleton( + () => ProfileSubscriptionCubit( + di(), + di(), + ), + dispose: (cubit) => cubit.close(), + ); // Fitness Start di.registerLazySingleton(() => FitnessStartApiClient(di())); diff --git a/lib/features/profile/presentation/pages/profile_page_builder.dart b/lib/features/profile/presentation/pages/profile_page_builder.dart index fd73ef6..18b7383 100644 --- a/lib/features/profile/presentation/pages/profile_page_builder.dart +++ b/lib/features/profile/presentation/pages/profile_page_builder.dart @@ -64,11 +64,8 @@ class ProfilePageBuilder extends StatelessWidget { di(), )..loadInitial(), ), - BlocProvider( - create: (_) => ProfileSubscriptionCubit( - di(), - di(), - )..load(), + BlocProvider.value( + value: di()..load(), ), BlocProvider( create: (_) => CardsCubit( diff --git a/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart b/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart index 0d3f3e8..81cba48 100644 --- a/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart +++ b/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart @@ -6,7 +6,9 @@ import 'package:go_router/go_router.dart'; import '../../../../core/constants/app_assets.dart'; import '../../../../core/constants/app_strings.dart'; +import '../../../../core/di/di.dart'; import '../../../../core/router/router_paths.dart'; +import '../../../profile/presentation/cubits/profile_subscription_cubit.dart'; import '../../../../uikit/buttons/app_back_button.dart'; import '../../../../uikit/buttons/main_button.dart'; import '../../../../uikit/cards/app_card.dart'; @@ -48,6 +50,7 @@ class SubscriptionsDetailsPage extends StatelessWidget { paymentCubit: context.read(), ); if (!context.mounted || didPay != true) return; + unawaited(di().load()); context.go(AppRoutePaths.profilePath); } From fe17d61a847737d0b9973cd44a2369ffac3e3281 Mon Sep 17 00:00:00 2001 From: CowboyGH Date: Sat, 13 Jun 2026 17:28:07 +0700 Subject: [PATCH 2/2] refactor(subscriptions): replace singleton refresh with pop(true) result chain --- lib/core/di/di.dart | 8 ------ .../pages/profile_page_builder.dart | 7 +++-- .../profile_subscription_section_widget.dart | 27 ++++++++++++++++--- .../pages/subscriptions_catalog_page.dart | 12 ++++++--- .../pages/subscriptions_details_page.dart | 7 +---- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/lib/core/di/di.dart b/lib/core/di/di.dart index 52918c4..cdddff5 100644 --- a/lib/core/di/di.dart +++ b/lib/core/di/di.dart @@ -29,7 +29,6 @@ import '../../features/profile/data/repositories/profile_statistics_repository_i import '../../features/profile/domain/repositories/profile_parameters_repository.dart'; import '../../features/profile/domain/repositories/profile_repository.dart'; import '../../features/profile/domain/repositories/profile_statistics_repository.dart'; -import '../../features/profile/presentation/cubits/profile_subscription_cubit.dart'; import '../../features/subscriptions/data/remote/subscription_payment_api_client.dart'; import '../../features/subscriptions/data/remote/subscriptions_api_client.dart'; import '../../features/subscriptions/data/repositories/subscriptions_repository_impl.dart'; @@ -171,13 +170,6 @@ Future setupDI() async { di(), ), ); - di.registerLazySingleton( - () => ProfileSubscriptionCubit( - di(), - di(), - ), - dispose: (cubit) => cubit.close(), - ); // Fitness Start di.registerLazySingleton(() => FitnessStartApiClient(di())); diff --git a/lib/features/profile/presentation/pages/profile_page_builder.dart b/lib/features/profile/presentation/pages/profile_page_builder.dart index 18b7383..fd73ef6 100644 --- a/lib/features/profile/presentation/pages/profile_page_builder.dart +++ b/lib/features/profile/presentation/pages/profile_page_builder.dart @@ -64,8 +64,11 @@ class ProfilePageBuilder extends StatelessWidget { di(), )..loadInitial(), ), - BlocProvider.value( - value: di()..load(), + BlocProvider( + create: (_) => ProfileSubscriptionCubit( + di(), + di(), + )..load(), ), BlocProvider( create: (_) => CardsCubit( diff --git a/lib/features/profile/presentation/widgets/profile_subscription_section_widget.dart b/lib/features/profile/presentation/widgets/profile_subscription_section_widget.dart index 351fd02..d08ee14 100644 --- a/lib/features/profile/presentation/widgets/profile_subscription_section_widget.dart +++ b/lib/features/profile/presentation/widgets/profile_subscription_section_widget.dart @@ -31,8 +31,23 @@ class ProfileSubscriptionSectionWidget extends StatefulWidget { class _ProfileSubscriptionSectionWidgetState extends State { bool _isCancelDialogOpen = false; - void _openCatalog() { - unawaited(context.push(AppRoutePaths.subscriptionsCatalogPath)); + Future _openCatalog() async { + final didPurchase = await context.push(AppRoutePaths.subscriptionsCatalogPath); + if (!mounted) return; + if (didPurchase == true) { + unawaited(context.read().load()); + } + } + + Future _openSubscriptionDetails(SubscriptionCatalogItem item) async { + final didPurchase = await context.push( + AppRoutePaths.subscriptionsDetailsConcretePath(item.id), + extra: item, + ); + if (!mounted) return; + if (didPurchase == true) { + unawaited(context.read().load()); + } } void _showCancelDialog() { @@ -131,14 +146,16 @@ class _ProfileSubscriptionSectionWidgetState extends State context.read().retry(), onRenewPressed: _openCatalog, onCancelPressed: _showCancelDialog, + onSubscriptionCardPressed: item == null ? null : () => _openSubscriptionDetails(item), ); }, ), @@ -154,6 +171,7 @@ final class _ProfileSubscriptionActiveState extends StatelessWidget { final VoidCallback onRetryPressed; final VoidCallback onRenewPressed; final VoidCallback onCancelPressed; + final VoidCallback? onSubscriptionCardPressed; const _ProfileSubscriptionActiveState({ required this.activeSubscription, @@ -163,6 +181,7 @@ final class _ProfileSubscriptionActiveState extends StatelessWidget { required this.onRetryPressed, required this.onRenewPressed, required this.onCancelPressed, + required this.onSubscriptionCardPressed, }); @override @@ -202,7 +221,7 @@ final class _ProfileSubscriptionActiveState extends StatelessWidget { if (item != null) SubscriptionCard( item: item!, - onPressed: () => context.push(AppRoutePaths.subscriptionsDetailsConcretePath(item!.id)), + onPressed: onSubscriptionCardPressed, ) else if (isCardLoading) const _ProfileSubscriptionCardLoadingState() diff --git a/lib/features/subscriptions/presentation/pages/subscriptions_catalog_page.dart b/lib/features/subscriptions/presentation/pages/subscriptions_catalog_page.dart index 1875ec1..5c5adb2 100644 --- a/lib/features/subscriptions/presentation/pages/subscriptions_catalog_page.dart +++ b/lib/features/subscriptions/presentation/pages/subscriptions_catalog_page.dart @@ -121,10 +121,14 @@ class SubscriptionsCatalogPage extends StatelessWidget { final item = items[index]; final onPressed = item.id <= 0 ? null - : () => context.push( - AppRoutePaths.subscriptionsDetailsConcretePath(item.id), - extra: item, - ); + : () async { + final didPurchase = await context.push( + AppRoutePaths.subscriptionsDetailsConcretePath(item.id), + extra: item, + ); + if (!context.mounted || didPurchase != true) return; + context.pop(true); + }; return Padding( padding: EdgeInsets.only(bottom: index == items.length - 1 ? 0 : 12), child: SubscriptionCard( diff --git a/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart b/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart index 81cba48..56c5621 100644 --- a/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart +++ b/lib/features/subscriptions/presentation/pages/subscriptions_details_page.dart @@ -1,14 +1,10 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import '../../../../core/constants/app_assets.dart'; import '../../../../core/constants/app_strings.dart'; -import '../../../../core/di/di.dart'; import '../../../../core/router/router_paths.dart'; -import '../../../profile/presentation/cubits/profile_subscription_cubit.dart'; import '../../../../uikit/buttons/app_back_button.dart'; import '../../../../uikit/buttons/main_button.dart'; import '../../../../uikit/cards/app_card.dart'; @@ -50,8 +46,7 @@ class SubscriptionsDetailsPage extends StatelessWidget { paymentCubit: context.read(), ); if (!context.mounted || didPay != true) return; - unawaited(di().load()); - context.go(AppRoutePaths.profilePath); + context.pop(true); } @override