diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index 895a1fce4..cb9416a3c 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -93,11 +93,10 @@ class SubscriptionController extends BaseController { final String profileCreatedAt = _pangeaController.userController.userModel!.profile!.createdAt; final DateTime creationTimestamp = DateTime.parse(profileCreatedAt); - final int daysRemaining = DateTime.now() - .add(const Duration(days: 7)) - .difference(creationTimestamp) - .inDays; - subscription?.setTrial(daysRemaining); + final DateTime expirationDate = creationTimestamp.add( + const Duration(days: 7), + ); + subscription?.setTrial(expirationDate); } Future updateCustomerInfo() async { diff --git a/lib/pangea/models/base_subscription_info.dart b/lib/pangea/models/base_subscription_info.dart index a6e7a1934..cb04dd57b 100644 --- a/lib/pangea/models/base_subscription_info.dart +++ b/lib/pangea/models/base_subscription_info.dart @@ -75,9 +75,9 @@ class SubscriptionInfo { currentSubscriptionId = null; } - void setTrial(int daysRemaining) { + void setTrial(DateTime expiration) { if (currentSubscription != null) return; - expirationDate = DateTime.now().add(Duration(days: daysRemaining)); + expirationDate = expiration; currentSubscriptionId = AppConfig.trialSubscriptionId; currentSubscription = SubscriptionDetails( price: 0, diff --git a/lib/pangea/models/mobile_subscriptions.dart b/lib/pangea/models/mobile_subscriptions.dart index 7988fee18..81526137f 100644 --- a/lib/pangea/models/mobile_subscriptions.dart +++ b/lib/pangea/models/mobile_subscriptions.dart @@ -1,19 +1,17 @@ // Dart imports: import 'dart:io'; -// Flutter imports: -import 'package:flutter/material.dart'; - // Package imports: import 'package:collection/collection.dart'; -import 'package:purchases_flutter/purchases_flutter.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; - // Project imports: 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'; +// Flutter imports: +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(); @@ -161,17 +159,22 @@ class MobileSubscriptionInfo extends SubscriptionInfo { ); } - final List activeEntitlements = info - .entitlements.all.entries - .where((MapEntry entry) => - entry.value.expirationDate == null || - DateTime.parse(entry.value.expirationDate!).isAfter(DateTime.now())) - .map((MapEntry entry) => entry.value) - .toList(); + final List activeEntitlements = + info.entitlements.all.entries + .where( + (MapEntry entry) => + entry.value.expirationDate == null || + DateTime.parse(entry.value.expirationDate!) + .isAfter(DateTime.now()), + ) + .map((MapEntry entry) => entry.value) + .toList(); allEntitlements = info.entitlements.all.entries - .map((MapEntry entry) => - entry.value.productIdentifier) + .map( + (MapEntry entry) => + entry.value.productIdentifier, + ) .cast() .toList(); @@ -181,7 +184,9 @@ class MobileSubscriptionInfo extends SubscriptionInfo { ); } else if (activeEntitlements.isEmpty) { debugPrint("User has no active entitlements"); - resetSubscription(); + if (!isNewUserTrial) { + resetSubscription(); + } return; } final EntitlementInfo activeEntitlement = activeEntitlements[0]; diff --git a/lib/pangea/widgets/subscription/subscription_options.dart b/lib/pangea/widgets/subscription/subscription_options.dart index 5c3343930..78ff47bad 100644 --- a/lib/pangea/widgets/subscription/subscription_options.dart +++ b/lib/pangea/widgets/subscription/subscription_options.dart @@ -1,13 +1,11 @@ // Flutter imports: -import 'package:flutter/material.dart'; - -// Package imports: -import 'package:flutter_gen/gen_l10n/l10n.dart'; - // Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; +import 'package:flutter/material.dart'; +// Package imports: +import 'package:flutter_gen/gen_l10n/l10n.dart'; class SubscriptionOptions extends StatelessWidget { final PangeaController pangeaController; @@ -19,23 +17,18 @@ class SubscriptionOptions extends StatelessWidget { @override Widget build(BuildContext context) { return Expanded( - child: ListView( - children: [ - const SizedBox(height: 20), - Wrap( - alignment: WrapAlignment.center, - direction: Axis.horizontal, - children: pangeaController - .subscriptionController.subscription!.availableSubscriptions - .map( - (subscription) => SubscriptionCard( - subscription: subscription, - pangeaController: pangeaController, - ), - ) - .toList(), - ), - ], + child: Wrap( + alignment: WrapAlignment.center, + direction: Axis.horizontal, + children: pangeaController + .subscriptionController.subscription!.availableSubscriptions + .map( + (subscription) => SubscriptionCard( + subscription: subscription, + pangeaController: pangeaController, + ), + ) + .toList(), ), ); } @@ -46,10 +39,10 @@ class SubscriptionCard extends StatelessWidget { final PangeaController pangeaController; const SubscriptionCard({ - Key? key, + super.key, required this.subscription, required this.pangeaController, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -86,7 +79,7 @@ class SubscriptionCard extends StatelessWidget { .submitSubscriptionChange(subscription, context); }, child: Text(L10n.of(context)!.subscribe), - ) + ), ], ), ), diff --git a/lib/pangea/widgets/subscription/subscription_paywall.dart b/lib/pangea/widgets/subscription/subscription_paywall.dart index 87ab6941b..9de144bd0 100644 --- a/lib/pangea/widgets/subscription/subscription_paywall.dart +++ b/lib/pangea/widgets/subscription/subscription_paywall.dart @@ -30,32 +30,30 @@ class SubscriptionPaywall extends StatelessWidget { ), body: Padding( padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: Column( - children: [ - if (pangeaController.matrixState.client.rooms.length > 1) ...[ - Text( - L10n.of(context)!.welcomeBack, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 16), - ), - const SizedBox(height: 20), - ], + child: ListView( + children: [ + if (pangeaController.matrixState.client.rooms.length > 1) ...[ Text( - L10n.of(context)!.subscriptionDesc, + L10n.of(context)!.welcomeBack, textAlign: TextAlign.center, style: const TextStyle(fontSize: 16), ), const SizedBox(height: 20), - pangeaController.userController.inTrialWindow - ? FreeTrialCard( - pangeaController: pangeaController, - ) - : SubscriptionOptions( - pangeaController: pangeaController, - ), ], - ), + Text( + L10n.of(context)!.subscriptionDesc, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 16), + ), + const SizedBox(height: 20), + pangeaController.userController.inTrialWindow + ? FreeTrialCard( + pangeaController: pangeaController, + ) + : SubscriptionOptions( + pangeaController: pangeaController, + ), + ], ), ), ); @@ -68,40 +66,42 @@ class FreeTrialCard extends StatelessWidget { @override Widget build(BuildContext context) { - return Card( - shape: RoundedRectangleBorder( - side: BorderSide( - color: AppConfig.primaryColorLight.withAlpha(64), + return Align( + child: Card( + shape: RoundedRectangleBorder( + side: BorderSide( + color: AppConfig.primaryColorLight.withAlpha(64), + ), + borderRadius: const BorderRadius.all(Radius.zero), ), - borderRadius: const BorderRadius.all(Radius.zero), - ), - child: SizedBox( - height: 250, - width: AppConfig.columnWidth * 0.75, - child: Padding( - padding: const EdgeInsets.all(25), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - L10n.of(context)!.freeTrial, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 24), - ), - Text( - L10n.of(context)!.freeTrialDesc, - textAlign: TextAlign.center, - ), - OutlinedButton( - onPressed: () { - pangeaController.subscriptionController - .activateNewUserTrial(); - Navigator.of(context).pop(); - }, - child: Text(L10n.of(context)!.activateTrial), - ), - ], + child: SizedBox( + height: 250, + width: AppConfig.columnWidth * 0.75, + child: Padding( + padding: const EdgeInsets.all(25), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + L10n.of(context)!.freeTrial, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 24), + ), + Text( + L10n.of(context)!.freeTrialDesc, + textAlign: TextAlign.center, + ), + OutlinedButton( + onPressed: () { + pangeaController.subscriptionController + .activateNewUserTrial(); + Navigator.of(context).pop(); + }, + child: Text(L10n.of(context)!.activateTrial), + ), + ], + ), ), ), ),