diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 4f5577c75..0316172e9 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3951,5 +3951,7 @@ }, "freeTrialDesc": "New users recieve a one week free trial of Pangea Chat", "activateTrial": "Activate Trial", - "inNoSpaces": "You are not a member of any classes or exchanges" + "inNoSpaces": "You are not a member of any classes or exchanges", + "successfullySubscribed": "You have successfully subscribed!", + "clickToManageSubscription": "Click here to manage your subscription." } diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 3567d2624..662de6b01 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,19 +1,9 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import 'package:uni_links/uni_links.dart'; - +// Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; @@ -24,10 +14,23 @@ import 'package:fluffychat/pangea/utils/add_to_space.dart'; import 'package:fluffychat/pangea/utils/chat_list_handle_space_tap.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; +import 'package:fluffychat/pangea/widgets/subscription/subscription_snackbar.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/client_stories_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/tor_stub.dart' + if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; +import 'package:uni_links/uni_links.dart'; + import '../../../utils/account_bundles.dart'; import '../../utils/matrix_sdk_extensions/matrix_file_extension.dart'; import '../../utils/url_launcher.dart'; @@ -35,9 +38,6 @@ import '../../utils/voip/callkeep_manager.dart'; import '../../widgets/fluffy_chat_app.dart'; import '../../widgets/matrix.dart'; -import 'package:fluffychat/utils/tor_stub.dart' - if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; - enum SelectMode { normal, share, @@ -445,6 +445,7 @@ class ChatListController extends State //#Pangea StreamSubscription? classStream; StreamSubscription? _invitedSpaceSubscription; + StreamSubscription? _subscriptionStatusStream; //Pangea# @override @@ -502,6 +503,14 @@ class ChatListController extends State } } }); + + _subscriptionStatusStream = pangeaController + .subscriptionController.subscriptionStream.stream + .listen((event) { + if (mounted) { + showSubscribedSnackbar(context); + } + }); //Pangea# super.initState(); @@ -515,6 +524,7 @@ class ChatListController extends State //#Pangea classStream?.cancel(); _invitedSpaceSubscription?.cancel(); + _subscriptionStatusStream?.cancel(); //Pangea# scrollController.removeListener(_onScroll); super.dispose(); diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index 8a2051517..20bd73328 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; -// Package imports: import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; @@ -15,7 +14,6 @@ import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; import 'package:fluffychat/pangea/widgets/subscription/subscription_paywall.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -// Project imports: import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -29,6 +27,7 @@ class SubscriptionController extends BaseController { //convert this logic to use completer bool initialized = false; + final StreamController subscriptionStream = StreamController.broadcast(); SubscriptionController(PangeaController pangeaController) : super() { _pangeaController = pangeaController; @@ -67,7 +66,13 @@ class SubscriptionController extends BaseController { if (!kIsWeb) { Purchases.addCustomerInfoUpdateListener( - (CustomerInfo info) => updateCustomerInfo(), + (CustomerInfo info) async { + final bool wasSubscribed = isSubscribed; + await updateCustomerInfo(); + if (!wasSubscribed && isSubscribed) { + subscriptionStream.add(true); + } + }, ); } setState(); diff --git a/lib/pangea/pages/settings_subscription/settings_subscription.dart b/lib/pangea/pages/settings_subscription/settings_subscription.dart index 7283e58f9..6b1608cd9 100644 --- a/lib/pangea/pages/settings_subscription/settings_subscription.dart +++ b/lib/pangea/pages/settings_subscription/settings_subscription.dart @@ -1,14 +1,18 @@ import 'dart:async'; +// Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/pages/settings_subscription/settings_subscription_view.dart'; import 'package:fluffychat/pangea/utils/subscription_app_id.dart'; +import 'package:fluffychat/pangea/widgets/subscription/subscription_snackbar.dart'; import 'package:fluffychat/widgets/matrix.dart'; // Project imports: import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +// Package imports: import 'package:url_launcher/url_launcher_string.dart'; class SubscriptionManagement extends StatefulWidget { @@ -23,6 +27,7 @@ class SubscriptionManagementController extends State { final PangeaController pangeaController = MatrixState.pangeaController; SubscriptionDetails? selectedSubscription; late StreamSubscription _settingsSubscription; + StreamSubscription? _subscriptionStatusStream; @override void initState() { @@ -39,6 +44,7 @@ class SubscriptionManagementController extends State { void dispose() { super.dispose(); _settingsSubscription.cancel(); + _subscriptionStatusStream?.cancel(); } bool get currentSubscriptionAvailable => @@ -119,6 +125,12 @@ class SubscriptionManagementController extends State { @override Widget build(BuildContext context) { + _subscriptionStatusStream ??= pangeaController + .subscriptionController.subscriptionStream.stream + .listen((_) { + showSubscribedSnackbar(context); + context.go('/rooms'); + }); return SettingsSubscriptionView(this); } } diff --git a/lib/pangea/widgets/subscription/subscription_options.dart b/lib/pangea/widgets/subscription/subscription_options.dart index b755557b8..81073a0b5 100644 --- a/lib/pangea/widgets/subscription/subscription_options.dart +++ b/lib/pangea/widgets/subscription/subscription_options.dart @@ -4,6 +4,7 @@ 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 { @@ -75,7 +76,11 @@ class SubscriptionCard extends StatelessWidget { OutlinedButton( onPressed: () { pangeaController.subscriptionController - .submitSubscriptionChange(subscription, context); + .submitSubscriptionChange( + subscription, + context, + ); + Navigator.of(context).pop(); }, child: Text(L10n.of(context)!.subscribe), ), diff --git a/lib/pangea/widgets/subscription/subscription_snackbar.dart b/lib/pangea/widgets/subscription/subscription_snackbar.dart new file mode 100644 index 000000000..46283a8be --- /dev/null +++ b/lib/pangea/widgets/subscription/subscription_snackbar.dart @@ -0,0 +1,34 @@ +import 'package:fluffychat/config/app_config.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +void showSubscribedSnackbar(BuildContext context) { + final Widget text = RichText( + text: TextSpan( + children: [ + TextSpan( + text: L10n.of(context)!.successfullySubscribed, + style: TextStyle( + color: Theme.of(context).brightness == Brightness.light + ? Colors.white + : Colors.black, + ), + ), + const TextSpan(text: " "), + TextSpan( + text: L10n.of(context)!.clickToManageSubscription, + style: const TextStyle(color: AppConfig.primaryColor), + recognizer: TapGestureRecognizer() + ..onTap = () => context.go('/rooms/settings/subscription'), + ), + ], + ), + ); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: text, + ), + ); +} diff --git a/needed-translations.txt b/needed-translations.txt index 3dbb6ff2f..12029f657 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -759,7 +759,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "bn": [ @@ -1527,7 +1529,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "bo": [ @@ -2295,7 +2299,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ca": [ @@ -3058,7 +3064,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "cs": [ @@ -3821,7 +3829,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "de": [ @@ -4584,7 +4594,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "el": [ @@ -5352,7 +5364,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "eo": [ @@ -6115,7 +6129,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "es": [ @@ -6142,7 +6158,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "et": [ @@ -6905,7 +6923,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "eu": [ @@ -7668,7 +7688,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "fa": [ @@ -8431,7 +8453,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "fi": [ @@ -9194,7 +9218,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "fr": [ @@ -9957,7 +9983,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ga": [ @@ -10720,7 +10748,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "gl": [ @@ -11483,7 +11513,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "he": [ @@ -12246,7 +12278,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "hi": [ @@ -13014,7 +13048,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "hr": [ @@ -13777,7 +13813,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "hu": [ @@ -14540,7 +14578,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "id": [ @@ -15303,7 +15343,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ie": [ @@ -16068,7 +16110,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "it": [ @@ -16831,7 +16875,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ja": [ @@ -17594,7 +17640,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ko": [ @@ -18357,7 +18405,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "lt": [ @@ -19120,7 +19170,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "lv": [ @@ -19888,7 +19940,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "nb": [ @@ -20651,7 +20705,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "nl": [ @@ -21414,7 +21470,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "pl": [ @@ -22177,7 +22235,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "pt": [ @@ -22945,7 +23005,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "pt_BR": [ @@ -23708,7 +23770,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "pt_PT": [ @@ -24471,7 +24535,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ro": [ @@ -25234,7 +25300,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ru": [ @@ -25997,7 +26065,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "sk": [ @@ -26761,7 +26831,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "sl": [ @@ -27527,7 +27599,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "sr": [ @@ -28290,7 +28364,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "sv": [ @@ -29053,7 +29129,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "ta": [ @@ -29821,7 +29899,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "th": [ @@ -30589,7 +30669,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "tr": [ @@ -31352,7 +31434,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "uk": [ @@ -32115,7 +32199,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "vi": [ @@ -32881,7 +32967,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "zh": [ @@ -33644,7 +33732,9 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ], "zh_Hant": [ @@ -34407,6 +34497,8 @@ "trialExpiration", "freeTrialDesc", "activateTrial", - "inNoSpaces" + "inNoSpaces", + "successfullySubscribed", + "clickToManageSubscription" ] }