From e374cf126fe43effd470f1ecb9bd389be6f80183 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Sat, 30 Jan 2021 13:44:41 +0530 Subject: [PATCH] Show a check mark next to active subscriptions --- lib/ui/subscription_page.dart | 46 ++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/ui/subscription_page.dart b/lib/ui/subscription_page.dart index 0c2b09cc7..4f097c504 100644 --- a/lib/ui/subscription_page.dart +++ b/lib/ui/subscription_page.dart @@ -13,6 +13,7 @@ import 'package:photos/models/billing_plan.dart'; import 'package:photos/services/billing_service.dart'; import 'package:photos/ui/loading_widget.dart'; import 'package:photos/utils/dialog_util.dart'; +import 'package:progress_dialog/progress_dialog.dart'; class SubscriptionPage extends StatefulWidget { const SubscriptionPage({Key key}) : super(key: key); @@ -24,6 +25,7 @@ class SubscriptionPage extends StatefulWidget { class _SubscriptionPageState extends State { final _logger = Logger("SubscriptionPage"); StreamSubscription _purchaseUpdateSubscription; + ProgressDialog _dialog; @override void initState() { @@ -31,13 +33,12 @@ class _SubscriptionPageState extends State { _purchaseUpdateSubscription = FlutterInappPurchase.purchaseUpdated.listen((item) async { - final dialog = createProgressDialog(context, "verifying purchase..."); - await dialog.show(); + await _dialog.show(); try { await BillingService.instance.verifySubscription(item.productId, Platform.isAndroid ? item.purchaseToken : item.transactionReceipt); await FlutterInappPurchase.instance.finishTransaction(item); - await dialog.hide(); + await _dialog.hide(); Bus.instance.fire(UserAuthenticatedEvent()); AlertDialog alert = AlertDialog( title: Text("thank you"), @@ -59,7 +60,7 @@ class _SubscriptionPageState extends State { ); } catch (e) { _logger.warning("Could not complete payment ", e); - await dialog.hide(); + await _dialog.hide(); showErrorDialog( context, "payment failed", @@ -107,33 +108,40 @@ class _SubscriptionPageState extends State { Widget _buildPlans( BuildContext context, List plans, final appBarSize) { + final subscription = BillingService.instance.getSubscription(); final planWidgets = List(); for (final plan in plans) { + final productID = Platform.isAndroid ? plan.androidID : plan.iosID; + final isActive = + subscription != null && subscription.productID == productID; planWidgets.add( Material( child: InkWell( onTap: () async { - final dialog = createProgressDialog(context, "please wait..."); - await dialog.show(); - List _kIds = [ - Platform.isAndroid ? plan.androidID : plan.iosID - ]; + if (isActive) { + return; + } + _dialog = createProgressDialog(context, "please wait..."); + await _dialog.show(); final items = - await FlutterInappPurchase.instance.getProducts(_kIds); + await FlutterInappPurchase.instance.getProducts([productID]); if (items.isEmpty) { - await dialog.hide(); + await _dialog.hide(); showGenericErrorDialog(context); return; } FlutterInappPurchase.purchaseError.listen((event) async { _logger.info("Purchase error: " + event.toString()); - await dialog.hide(); + await _dialog.hide(); }); await FlutterInappPurchase.instance .requestSubscription(items[0].productId); - await dialog.hide(); + await _dialog.hide(); }, - child: SubscriptionPlanWidget(plan: plan), + child: SubscriptionPlanWidget( + plan: plan, + isActive: isActive, + ), ), ), ); @@ -276,9 +284,11 @@ class SubscriptionPlanWidget extends StatelessWidget { const SubscriptionPlanWidget({ Key key, @required this.plan, + this.isActive = false, }) : super(key: key); final BillingPlan plan; + final bool isActive; @override Widget build(BuildContext context) { @@ -314,6 +324,14 @@ class SubscriptionPlanWidget extends StatelessWidget { ), ), Text(plan.price + " per " + plan.period), + isActive + ? Expanded( + child: Icon( + Icons.check_circle, + color: Colors.cyan[700], + ), + ) + : Container(), ], ), Divider(