diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 56e2c09cc..3ed3d90fa 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3948,5 +3948,7 @@ "placeholders": { "expiration": {} } - } + }, + "freeTrialDesc": "New users recieve a one week free trial of Pangea Chat", + "activateTrial": "Activate Trial" } diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index a3b05b8b3..895a1fce4 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -60,8 +60,8 @@ class SubscriptionController extends BaseController { : MobileSubscriptionInfo(pangeaController: _pangeaController); await subscription!.configure(); - if (!isSubscribed) { - addNewAccountTrial(); + if (activatedNewUserTrial) { + setNewUserTrial(); } initialized = true; @@ -78,31 +78,26 @@ class SubscriptionController extends BaseController { } } - void addNewAccountTrial() { - // determine when profile was created - final String? profileCreatedAt = - _pangeaController.userController.userModel?.profile?.createdAt; - if (profileCreatedAt == null) { - ErrorHandler.logError( - m: "Null profileCreatedAt in addNewAccountTrial", - s: StackTrace.current, - ); - return; - } + final String activatedTrialKey = 'activatedTrial'; + bool get activatedNewUserTrial => + _pangeaController.userController.inTrialWindow && + (_pangeaController.pStoreService.read(activatedTrialKey) ?? false); + + void activateNewUserTrial() { + _pangeaController.pStoreService.save(activatedTrialKey, true); + setNewUserTrial(); + } + + void setNewUserTrial() { + final String profileCreatedAt = + _pangeaController.userController.userModel!.profile!.createdAt; final DateTime creationTimestamp = DateTime.parse(profileCreatedAt); - final bool accountIsNew = creationTimestamp.isAfter( - DateTime.now().subtract(const Duration(days: 7)), - ); - - // if account qualifies, grant trial - if (accountIsNew) { - final int daysRemaining = DateTime.now() - .add(const Duration(days: 7)) - .difference(creationTimestamp) - .inDays; - subscription?.setTrial(daysRemaining); - } + final int daysRemaining = DateTime.now() + .add(const Duration(days: 7)) + .difference(creationTimestamp) + .inDays; + subscription?.setTrial(daysRemaining); } Future updateCustomerInfo() async { diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 33ac91b16..ec16defe6 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -4,14 +4,14 @@ import 'dart:developer'; // Package imports: import 'package:collection/collection.dart'; -import 'package:jwt_decode/jwt_decode.dart'; -import 'package:matrix/matrix.dart' as matrix; - // Project imports: import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:jwt_decode/jwt_decode.dart'; +import 'package:matrix/matrix.dart' as matrix; + import '../constants/local.key.dart'; import '../models/user_model.dart'; import '../repo/user_repo.dart'; @@ -111,6 +111,16 @@ class UserController extends BaseController { } } + bool get inTrialWindow { + final String? createdAt = userModel?.profile?.createdAt; + if (createdAt == null) { + return false; + } + return DateTime.parse(createdAt).isAfter( + DateTime.now().subtract(const Duration(days: 7)), + ); + } + redirectToUserInfo() { // _pangeaController.matrix.router!.currentState!.to( // "/home/connect/user_age", diff --git a/lib/pangea/widgets/subscription/subscription_paywall.dart b/lib/pangea/widgets/subscription/subscription_paywall.dart index cc97871cc..87ab6941b 100644 --- a/lib/pangea/widgets/subscription/subscription_paywall.dart +++ b/lib/pangea/widgets/subscription/subscription_paywall.dart @@ -1,19 +1,18 @@ // 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/widgets/subscription/subscription_options.dart'; +import 'package:flutter/material.dart'; +// Package imports: +import 'package:flutter_gen/gen_l10n/l10n.dart'; class SubscriptionPaywall extends StatelessWidget { final PangeaController pangeaController; const SubscriptionPaywall({ - Key? key, + super.key, required this.pangeaController, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -31,26 +30,79 @@ class SubscriptionPaywall extends StatelessWidget { ), body: Padding( padding: const EdgeInsets.all(20), - child: Column( - children: [ - if (pangeaController.matrixState.client.rooms.length > 1) ...[ + 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), + ], Text( - L10n.of(context)!.welcomeBack, + 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, + ), ], - Text( - L10n.of(context)!.subscriptionDesc, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 16), - ), - const SizedBox(height: 20), - SubscriptionOptions( - pangeaController: pangeaController, - ), - ], + ), + ), + ), + ); + } +} + +class FreeTrialCard extends StatelessWidget { + final PangeaController pangeaController; + const FreeTrialCard({super.key, required this.pangeaController}); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder( + side: BorderSide( + color: AppConfig.primaryColorLight.withAlpha(64), + ), + 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), + ), + ], + ), ), ), ); diff --git a/needed-translations.txt b/needed-translations.txt index 4014d92ab..3eebab64d 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -756,7 +756,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "bn": [ @@ -1521,7 +1523,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "bo": [ @@ -2286,7 +2290,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ca": [ @@ -3046,7 +3052,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "cs": [ @@ -3806,7 +3814,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "de": [ @@ -4566,7 +4576,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "el": [ @@ -5331,7 +5343,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "eo": [ @@ -6091,7 +6105,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "es": [ @@ -6115,7 +6131,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "et": [ @@ -6875,7 +6893,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "eu": [ @@ -7635,7 +7655,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "fa": [ @@ -8395,7 +8417,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "fi": [ @@ -9155,7 +9179,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "fr": [ @@ -9915,7 +9941,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ga": [ @@ -10675,7 +10703,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "gl": [ @@ -11435,7 +11465,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "he": [ @@ -12195,7 +12227,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "hi": [ @@ -12960,7 +12994,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "hr": [ @@ -13720,7 +13756,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "hu": [ @@ -14480,7 +14518,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "id": [ @@ -15240,7 +15280,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ie": [ @@ -16002,7 +16044,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "it": [ @@ -16762,7 +16806,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ja": [ @@ -17522,7 +17568,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ko": [ @@ -18282,7 +18330,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "lt": [ @@ -19042,7 +19092,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "lv": [ @@ -19807,7 +19859,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "nb": [ @@ -20567,7 +20621,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "nl": [ @@ -21327,7 +21383,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "pl": [ @@ -22087,7 +22145,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "pt": [ @@ -22852,7 +22912,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "pt_BR": [ @@ -23612,7 +23674,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "pt_PT": [ @@ -24372,7 +24436,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ro": [ @@ -25132,7 +25198,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ru": [ @@ -25892,7 +25960,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "sk": [ @@ -26653,7 +26723,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "sl": [ @@ -27416,7 +27488,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "sr": [ @@ -28176,7 +28250,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "sv": [ @@ -28936,7 +29012,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "ta": [ @@ -29701,7 +29779,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "th": [ @@ -30466,7 +30546,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "tr": [ @@ -31226,7 +31308,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "uk": [ @@ -31986,7 +32070,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "vi": [ @@ -32749,7 +32835,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "zh": [ @@ -33509,7 +33597,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ], "zh_Hant": [ @@ -34269,6 +34359,8 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "trialExpiration" + "trialExpiration", + "freeTrialDesc", + "activateTrial" ] }