Parcourir la source

switch to usageDetailsV2 for fetching subscription

Neeraj Gupta il y a 3 ans
Parent
commit
6dcb4ba0b4

+ 4 - 4
lib/models/user_details.dart

@@ -67,9 +67,9 @@ class FamilyData {
 
   // Storage available based on the family plan
   final int storage;
-  final int expiry;
+  final int expiryTime;
 
-  FamilyData(this.members, this.storage, this.expiry);
+  FamilyData(this.members, this.storage, this.expiryTime);
 
   factory FamilyData.fromMap(Map<String, dynamic> map) {
     if (map == null) {
@@ -81,7 +81,7 @@ class FamilyData {
     return FamilyData(
       members,
       map['storage'] as int,
-      map['expiry'] as int,
+      map['expiryTime'] as int,
     );
   }
 
@@ -89,7 +89,7 @@ class FamilyData {
     return {
       'members': members.map((x) => x?.toMap())?.toList(),
       'storage': storage,
-      'expiry': expiry
+      'expiryTime': expiryTime
     };
   }
 }

+ 12 - 14
lib/ui/payment/stripe_subscription_page.dart

@@ -7,6 +7,7 @@ import 'package:logging/logging.dart';
 import 'package:photos/models/billing_plan.dart';
 import 'package:photos/models/subscription.dart';
 import 'package:photos/services/billing_service.dart';
+import 'package:photos/services/user_service.dart';
 import 'package:photos/ui/common/dialogs.dart';
 import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/ui/payment/payment_web_page.dart';
@@ -34,9 +35,10 @@ class StripeSubscriptionPage extends StatefulWidget {
 class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
   final _logger = Logger("StripeSubscriptionPage");
   final _billingService = BillingService.instance;
+  final _userService = UserService.instance;
   Subscription _currentSubscription;
   ProgressDialog _dialog;
-  Future<int> _usageFuture;
+  int _usage;
 
   // indicates if user's subscription plan is still active
   bool _hasActiveSubscription;
@@ -54,12 +56,12 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
   }
 
   Future<void> _fetchSub() async {
-    return _billingService.fetchSubscription().then((subscription) async {
-      _currentSubscription = subscription;
+    return _userService.getUserDetailsV2().then((userDetails) async {
+      _currentSubscription = userDetails.subscription;
       _showYearlyPlan = _currentSubscription.isYearlyPlan();
       _hasActiveSubscription = _currentSubscription.isValid();
       _isStripeSubscriber = _currentSubscription.paymentProvider == kStripe;
-      _usageFuture = _billingService.fetchUsage();
+      _usage = userDetails.usage;
       return _filterStripeForUI().then((value) {
         _hasLoadedData = true;
         setState(() {});
@@ -128,7 +130,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
 
     widgets.add(SubscriptionHeaderWidget(
       isOnboarding: widget.isOnboarding,
-      usageFuture: _usageFuture,
+      currentUsage: _usage,
     ));
 
     widgets.addAll([
@@ -308,16 +310,12 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
                     "please cancel your existing subscription from ${_currentSubscription.paymentProvider} first");
                 return;
               }
-              await _dialog.show();
-              if (_usageFuture != null) {
-                final usage = await _usageFuture;
-                await _dialog.hide();
-                if (usage > plan.storage) {
-                  showErrorDialog(
-                      context, "sorry", "you cannot downgrade to this plan");
-                  return;
-                }
+              if (_usage > plan.storage) {
+                showErrorDialog(
+                    context, "sorry", "you cannot downgrade to this plan");
+                return;
               }
+              await _dialog.show();
               String stripPurChaseAction = 'buy';
               if (_isStripeSubscriber && _hasActiveSubscription) {
                 // confirm if user wants to change plan or not

+ 1 - 1
lib/ui/payment/subscription.dart

@@ -13,7 +13,7 @@ StatefulWidget getSubscriptionPage({bool isOnBoarding = false}) {
       _isUserCreatedPostStripeSupport()) {
     return StripeSubscriptionPage(isOnboarding: isOnBoarding);
   } else {
-    return SubscriptionPage(isOnboarding: isOnBoarding);
+    return StripeSubscriptionPage(isOnboarding: isOnBoarding);
   }
 }
 

+ 6 - 20
lib/ui/payment/subscription_common_widgets.dart

@@ -2,15 +2,15 @@ import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:photos/models/subscription.dart';
 import 'package:photos/ui/billing_questions_widget.dart';
-import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/utils/data_util.dart';
 import 'package:photos/utils/date_time_util.dart';
 
 class SubscriptionHeaderWidget extends StatefulWidget {
   final bool isOnboarding;
-  final Future<int> usageFuture;
+  final int currentUsage;
 
-  const SubscriptionHeaderWidget({Key key, this.isOnboarding, this.usageFuture})
+  const SubscriptionHeaderWidget(
+      {Key key, this.isOnboarding, this.currentUsage})
       : super(key: key);
 
   @override
@@ -36,23 +36,9 @@ class _SubscriptionHeaderWidgetState extends State<SubscriptionHeaderWidget> {
     } else {
       return SizedBox(
         height: 50,
-        child: FutureBuilder(
-          future: widget.usageFuture,
-          builder: (BuildContext context, AsyncSnapshot snapshot) {
-            if (snapshot.hasData) {
-              return Padding(
-                padding: const EdgeInsets.all(16.0),
-                child: Text("current usage is " + formatBytes(snapshot.data)),
-              );
-            } else if (snapshot.hasError) {
-              return Container();
-            } else {
-              return Padding(
-                padding: const EdgeInsets.all(16.0),
-                child: loadWidget,
-              );
-            }
-          },
+        child: Padding(
+          padding: const EdgeInsets.all(16.0),
+          child: Text("current usage is " + formatBytes(widget.currentUsage)),
         ),
       );
     }

+ 22 - 22
lib/ui/payment/subscription_page.dart

@@ -11,6 +11,7 @@ import 'package:photos/events/subscription_purchased_event.dart';
 import 'package:photos/models/billing_plan.dart';
 import 'package:photos/models/subscription.dart';
 import 'package:photos/services/billing_service.dart';
+import 'package:photos/services/user_service.dart';
 import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/ui/payment/skip_subscription_widget.dart';
 import 'package:photos/ui/payment/subscription_common_widgets.dart';
@@ -29,16 +30,17 @@ class SubscriptionPage extends StatefulWidget {
   }) : super(key: key);
 
   @override
-   State<SubscriptionPage> createState() => _SubscriptionPageState();
+  State<SubscriptionPage> createState() => _SubscriptionPageState();
 }
 
 class _SubscriptionPageState extends State<SubscriptionPage> {
   final _logger = Logger("SubscriptionPage");
   final _billingService = BillingService.instance;
+  final _userService = UserService.instance;
   Subscription _currentSubscription;
   StreamSubscription _purchaseUpdateSubscription;
   ProgressDialog _dialog;
-  Future<int> _usageFuture;
+  int _usage;
   bool _hasActiveSubscription;
   FreePlan _freePlan;
   List<BillingPlan> _plans;
@@ -48,8 +50,8 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
   @override
   void initState() {
     _billingService.setIsOnSubscriptionPage(true);
-    _billingService.fetchSubscription().then((subscription) async {
-      _currentSubscription = subscription;
+    _userService.getUserDetailsV2(memberCount: false).then((userDetails) async {
+      _currentSubscription = userDetails.subscription;
       _hasActiveSubscription = _currentSubscription.isValid();
       final billingPlans = await _billingService.getBillingPlans();
       _isActiveStripeSubscriber =
@@ -59,12 +61,12 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
         final productID = _isActiveStripeSubscriber
             ? plan.stripeID
             : Platform.isAndroid
-            ? plan.androidID
-            : plan.iosID;
+                ? plan.androidID
+                : plan.iosID;
         return productID != null && productID.isNotEmpty;
       }).toList();
       _freePlan = billingPlans.freePlan;
-      _usageFuture = _billingService.fetchUsage();
+      _usage = userDetails.usage;
       _hasLoadedData = true;
       setState(() {});
     });
@@ -160,7 +162,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
     final widgets = <Widget>[];
     widgets.add(SubscriptionHeaderWidget(
       isOnboarding: widget.isOnboarding,
-      usageFuture: _usageFuture,
+      currentUsage: _usage,
     ));
 
     widgets.addAll([
@@ -177,7 +179,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
       widgets.add(ValidityWidget(currentSubscription: _currentSubscription));
     }
 
-    if ( _currentSubscription.productID == kFreeProductID) {
+    if (_currentSubscription.productID == kFreeProductID) {
       if (widget.isOnboarding) {
         widgets.add(SkipSubscriptionWidget(freePlan: _freePlan));
       }
@@ -306,18 +308,17 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
                 return;
               }
               await _dialog.show();
-              if (_usageFuture != null) {
-                final usage = await _usageFuture;
-                if (usage > plan.storage) {
-                  await _dialog.hide();
-                  showErrorDialog(
-                      context, "sorry", "you cannot downgrade to this plan");
-                  return;
-                }
+
+              if (_usage > plan.storage) {
+                await _dialog.hide();
+                showErrorDialog(
+                    context, "sorry", "you cannot downgrade to this plan");
+                return;
               }
+
               final ProductDetailsResponse response =
-              await InAppPurchaseConnection.instance
-                  .queryProductDetails({productID});
+                  await InAppPurchaseConnection.instance
+                      .queryProductDetails({productID});
               if (response.notFoundIDs.isNotEmpty) {
                 _logger.severe("Could not find products: " +
                     response.notFoundIDs.toString());
@@ -331,8 +332,8 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
                   _currentSubscription.productID != plan.androidID;
               if (isCrossGradingOnAndroid) {
                 final existingProductDetailsResponse =
-                await InAppPurchaseConnection.instance
-                    .queryProductDetails({_currentSubscription.productID});
+                    await InAppPurchaseConnection.instance
+                        .queryProductDetails({_currentSubscription.productID});
                 if (existingProductDetailsResponse.notFoundIDs.isNotEmpty) {
                   _logger.severe("Could not find existing products: " +
                       response.notFoundIDs.toString());
@@ -401,4 +402,3 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
     );
   }
 }
-