ensure that subscription initalization finishes before running customer update

pull/1116/head
ggurdin 2 years ago
parent aca6f62eac
commit 31b90eab0c

@ -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<void> initialized = Completer<void>();
Future<void> initialize() async {
if (initialized.isCompleted) return;
if (_isInitializing) {
await initialized.future;
return;
}
_isInitializing = true;
await _initialize();
_isInitializing = false;
initialized.complete();
}
Future<void> reinitialize() async {
initialized = Completer<void>();
_isInitializing = false;
await initialize();
}
Future<void> _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<void> 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<void> showPaywall(BuildContext context) async {
try {
if (!initialized) {
if (!initialized.isCompleted) {
await initialize();
}
if (subscription?.availableSubscriptions.isEmpty ?? true) {

@ -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<void> 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;
}

@ -30,7 +30,7 @@ class SubscriptionManagementController extends State<SubscriptionManagement> {
@override
void initState() {
if (!subscriptionController.initialized) {
if (!subscriptionController.initialized.isCompleted) {
subscriptionController.initialize().then((_) => setState(() {}));
}

@ -335,6 +335,7 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
// #Pangea
if (state == LoginState.loggedIn) {
await (await pangeaController.userController.completer).future;
await pangeaController.subscriptionController.reinitialize();
}
String routeDestination;
if (state == LoginState.loggedIn) {

Loading…
Cancel
Save