From 31b90eab0c290bd0054697eb5cc552b6d0925f6d Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 6 May 2024 11:45:00 -0400 Subject: [PATCH] ensure that subscription initalization finishes before running customer update --- .../controllers/subscription_controller.dart | 32 +++++++++++++++---- lib/pangea/models/mobile_subscriptions.dart | 12 +++---- .../settings_subscription.dart | 2 +- lib/widgets/matrix.dart | 1 + 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index 828fd5365..3cf40f8f5 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -32,8 +32,6 @@ enum CanSendStatus { class SubscriptionController extends BaseController { late PangeaController _pangeaController; SubscriptionInfo? subscription; - - bool initialized = false; final StreamController subscriptionStream = StreamController.broadcast(); SubscriptionController(PangeaController pangeaController) : super() { @@ -45,7 +43,28 @@ class SubscriptionController extends BaseController { (subscription!.currentSubscriptionId != null || subscription!.currentSubscription != null); + bool _isInitializing = false; + Completer initialized = Completer(); + Future initialize() async { + if (initialized.isCompleted) return; + if (_isInitializing) { + await initialized.future; + return; + } + _isInitializing = true; + await _initialize(); + _isInitializing = false; + initialized.complete(); + } + + Future reinitialize() async { + initialized = Completer(); + _isInitializing = false; + await initialize(); + } + + Future _initialize() async { try { if (_pangeaController.matrixState.client.userID == null) { debugPrint( @@ -63,8 +82,6 @@ class SubscriptionController extends BaseController { setNewUserTrial(); } - initialized = true; - if (!kIsWeb) { Purchases.addCustomerInfoUpdateListener( (CustomerInfo info) async { @@ -186,6 +203,9 @@ class SubscriptionController extends BaseController { } Future updateCustomerInfo() async { + if (!initialized.isCompleted) { + await initialize(); + } if (subscription == null) { ErrorHandler.logError( m: "Null subscription info in subscription settings", @@ -220,7 +240,7 @@ class SubscriptionController extends BaseController { } bool get _shouldShowPaywall { - return initialized && + return initialized.isCompleted && !isSubscribed && (_lastDismissedPaywall == null || DateTime.now().difference(_lastDismissedPaywall!).inHours > @@ -245,7 +265,7 @@ class SubscriptionController extends BaseController { Future showPaywall(BuildContext context) async { try { - if (!initialized) { + if (!initialized.isCompleted) { await initialize(); } if (subscription?.availableSubscriptions.isEmpty ?? true) { diff --git a/lib/pangea/models/mobile_subscriptions.dart b/lib/pangea/models/mobile_subscriptions.dart index 4a57d6200..00fc6e3fd 100644 --- a/lib/pangea/models/mobile_subscriptions.dart +++ b/lib/pangea/models/mobile_subscriptions.dart @@ -1,15 +1,13 @@ import 'dart:io'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; -import 'package:purchases_flutter/purchases_flutter.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; - import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/models/base_subscription_info.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/material.dart'; +import 'package:purchases_flutter/purchases_flutter.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; class MobileSubscriptionInfo extends SubscriptionInfo { MobileSubscriptionInfo({required super.pangeaController}) : super(); @@ -119,11 +117,11 @@ class MobileSubscriptionInfo extends SubscriptionInfo { Future setCustomerInfo() async { if (allProducts == null) { ErrorHandler.logError( - m: "Null appProducts in setCustomerInfo", + m: "Null allProducts in setCustomerInfo", s: StackTrace.current, ); debugPrint( - "Null appProducts in setCustomerInfo", + "Null allProducts in setCustomerInfo", ); return; } diff --git a/lib/pangea/pages/settings_subscription/settings_subscription.dart b/lib/pangea/pages/settings_subscription/settings_subscription.dart index 86c43ff47..374abedb3 100644 --- a/lib/pangea/pages/settings_subscription/settings_subscription.dart +++ b/lib/pangea/pages/settings_subscription/settings_subscription.dart @@ -30,7 +30,7 @@ class SubscriptionManagementController extends State { @override void initState() { - if (!subscriptionController.initialized) { + if (!subscriptionController.initialized.isCompleted) { subscriptionController.initialize().then((_) => setState(() {})); } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 5aae2398b..634695a18 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -335,6 +335,7 @@ class MatrixState extends State with WidgetsBindingObserver { // #Pangea if (state == LoginState.loggedIn) { await (await pangeaController.userController.completer).future; + await pangeaController.subscriptionController.reinitialize(); } String routeDestination; if (state == LoginState.loggedIn) {