From 0add6b19ebbd852accb905014a2216a62f225687 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 14 Nov 2024 16:25:36 -0500 Subject: [PATCH] locally cache subscription info --- lib/pangea/constants/local.key.dart | 1 + .../controllers/subscription_controller.dart | 21 +++++ lib/pangea/models/base_subscription_info.dart | 76 ++++++++++++++----- lib/pangea/repo/subscription_repo.dart | 11 +-- lib/pangea/utils/subscription_app_id.dart | 8 ++ 5 files changed, 89 insertions(+), 28 deletions(-) diff --git a/lib/pangea/constants/local.key.dart b/lib/pangea/constants/local.key.dart index 2e2dadc9d..cc2834c72 100644 --- a/lib/pangea/constants/local.key.dart +++ b/lib/pangea/constants/local.key.dart @@ -7,4 +7,5 @@ class PLocalKey { static const String messagesSinceUpdate = 'messagesSinceLastUpdate'; static const String completedActivities = 'completedActivities'; static const String justInputtedCode = 'justInputtedCode'; + static const String availableSubscriptionInfo = 'availableSubscriptionInfo'; } diff --git a/lib/pangea/controllers/subscription_controller.dart b/lib/pangea/controllers/subscription_controller.dart index d9b720129..4b09faf64 100644 --- a/lib/pangea/controllers/subscription_controller.dart +++ b/lib/pangea/controllers/subscription_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/constants/local.key.dart'; @@ -409,4 +410,24 @@ class SubscriptionDetails { ? AppConfig.appleMangementUrl : Environment.stripeManagementUrl; } + + Map toJson() { + final data = {}; + data['price'] = price; + data['id'] = id; + data['duration'] = duration?.value; + data['appId'] = appId; + return data; + } + + factory SubscriptionDetails.fromJson(Map json) { + return SubscriptionDetails( + price: json['price'], + duration: SubscriptionDuration.values.firstWhereOrNull( + (duration) => duration.value == json['duration'], + ), + id: json['id'], + appId: json['appId'], + ); + } } diff --git a/lib/pangea/models/base_subscription_info.dart b/lib/pangea/models/base_subscription_info.dart index eda6d8a4b..ade40543d 100644 --- a/lib/pangea/models/base_subscription_info.dart +++ b/lib/pangea/models/base_subscription_info.dart @@ -1,8 +1,11 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/repo/subscription_repo.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/subscription_app_id.dart'; +import 'package:fluffychat/widgets/matrix.dart'; /// Contains information about the users's current subscription class CurrentSubscriptionInfo { @@ -87,28 +90,65 @@ class AvailableSubscriptionsInfo { SubscriptionAppIds? appIds; List? allProducts; + AvailableSubscriptionsInfo({ + this.appIds, + this.allProducts, + }); + Future setAvailableSubscriptions() async { - appIds ??= await SubscriptionRepo.getAppIds(); - allProducts ??= await SubscriptionRepo.getAllProducts(); + final cachedInfo = _getCachedSubscriptionInfo(); + appIds ??= cachedInfo?.appIds ?? await SubscriptionRepo.getAppIds(); + allProducts ??= + cachedInfo?.allProducts ?? await SubscriptionRepo.getAllProducts(); + + if (cachedInfo == null) await _cacheSubscriptionInfo(); + availableSubscriptions = (allProducts ?? []) .where((product) => product.appId == appIds!.currentAppId) .sorted((a, b) => a.price.compareTo(b.price)) .toList(); - // //@Gabby - temporary solution to add trial to list - // if (currentSubscriptionId == null && !hasSubscribed) { - // final id = availableSubscriptions[0].id; - // final package = availableSubscriptions[0].package; - // final duration = availableSubscriptions[0].duration; - // availableSubscriptions.insert( - // 0, - // SubscriptionDetails( - // price: 0, - // id: id, - // duration: duration, - // package: package, - // periodType: SubscriptionPeriodType.trial, - // ), - // ); - // } + } + + Future _cacheSubscriptionInfo() async { + await MatrixState.pangeaController.pStoreService.save( + PLocalKey.availableSubscriptionInfo, + toJson(), + ); + } + + static AvailableSubscriptionsInfo? _getCachedSubscriptionInfo() { + final json = MatrixState.pangeaController.pStoreService.read( + PLocalKey.availableSubscriptionInfo, + ); + if (json is! Map) { + return null; + } + + try { + return AvailableSubscriptionsInfo.fromJson(json); + } catch (e, s) { + ErrorHandler.logError(e: e, s: s); + return null; + } + } + + factory AvailableSubscriptionsInfo.fromJson(Map json) { + final appIds = SubscriptionAppIds.fromJson(json['app_ids']); + final allProducts = (json['all_products'] as List) + .map((product) => SubscriptionDetails.fromJson(product)) + .toList() + .cast(); + return AvailableSubscriptionsInfo( + appIds: appIds, + allProducts: allProducts, + ); + } + + Map toJson() { + final data = {}; + data['app_ids'] = appIds?.toJson(); + data['all_products'] = + allProducts?.map((product) => product.toJson()).toList(); + return data; } } diff --git a/lib/pangea/repo/subscription_repo.dart b/lib/pangea/repo/subscription_repo.dart index d50cd1c6f..9dd0a4e48 100644 --- a/lib/pangea/repo/subscription_repo.dart +++ b/lib/pangea/repo/subscription_repo.dart @@ -91,16 +91,7 @@ class RCProductsResponseModel { ) { final List offerings = json["items"] as List; final res = offerings - .map( - (offering) => SubscriptionDetails( - price: offering['price'], - duration: SubscriptionDuration.values.firstWhereOrNull( - (duration) => duration.value == offering['duration'], - ), - id: offering['id'], - appId: offering['appId'], - ), - ) + .map((offering) => SubscriptionDetails.fromJson(offering)) .toList() .cast(); return RCProductsResponseModel(allProducts: res); diff --git a/lib/pangea/utils/subscription_app_id.dart b/lib/pangea/utils/subscription_app_id.dart index de2332ed3..4ba71ee7a 100644 --- a/lib/pangea/utils/subscription_app_id.dart +++ b/lib/pangea/utils/subscription_app_id.dart @@ -28,6 +28,14 @@ class SubscriptionAppIds { ..androidId = json['android_id'] ..appleId = json['apple_id']; } + + Map toJson() { + final data = {}; + data['stripe_id'] = stripeId; + data['android_id'] = androidId; + data['apple_id'] = appleId; + return data; + } } enum RCPlatform {