Merge pull request #1011 from pangeachat/1008-locally-cache-app-ids-and-products

locally cache subscription info
pull/1490/head
ggurdin 1 year ago committed by GitHub
commit 5067e9a922
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -7,4 +7,5 @@ class PLocalKey {
static const String messagesSinceUpdate = 'messagesSinceLastUpdate'; static const String messagesSinceUpdate = 'messagesSinceLastUpdate';
static const String completedActivities = 'completedActivities'; static const String completedActivities = 'completedActivities';
static const String justInputtedCode = 'justInputtedCode'; static const String justInputtedCode = 'justInputtedCode';
static const String availableSubscriptionInfo = 'availableSubscriptionInfo';
} }

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/config/environment.dart';
import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/local.key.dart';
@ -409,4 +410,24 @@ class SubscriptionDetails {
? AppConfig.appleMangementUrl ? AppConfig.appleMangementUrl
: Environment.stripeManagementUrl; : Environment.stripeManagementUrl;
} }
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['price'] = price;
data['id'] = id;
data['duration'] = duration?.value;
data['appId'] = appId;
return data;
}
factory SubscriptionDetails.fromJson(Map<String, dynamic> json) {
return SubscriptionDetails(
price: json['price'],
duration: SubscriptionDuration.values.firstWhereOrNull(
(duration) => duration.value == json['duration'],
),
id: json['id'],
appId: json['appId'],
);
}
} }

@ -1,8 +1,11 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:fluffychat/config/app_config.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/controllers/subscription_controller.dart';
import 'package:fluffychat/pangea/repo/subscription_repo.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/pangea/utils/subscription_app_id.dart';
import 'package:fluffychat/widgets/matrix.dart';
/// Contains information about the users's current subscription /// Contains information about the users's current subscription
class CurrentSubscriptionInfo { class CurrentSubscriptionInfo {
@ -87,28 +90,65 @@ class AvailableSubscriptionsInfo {
SubscriptionAppIds? appIds; SubscriptionAppIds? appIds;
List<SubscriptionDetails>? allProducts; List<SubscriptionDetails>? allProducts;
AvailableSubscriptionsInfo({
this.appIds,
this.allProducts,
});
Future<void> setAvailableSubscriptions() async { Future<void> setAvailableSubscriptions() async {
appIds ??= await SubscriptionRepo.getAppIds(); final cachedInfo = _getCachedSubscriptionInfo();
allProducts ??= await SubscriptionRepo.getAllProducts(); appIds ??= cachedInfo?.appIds ?? await SubscriptionRepo.getAppIds();
allProducts ??=
cachedInfo?.allProducts ?? await SubscriptionRepo.getAllProducts();
if (cachedInfo == null) await _cacheSubscriptionInfo();
availableSubscriptions = (allProducts ?? []) availableSubscriptions = (allProducts ?? [])
.where((product) => product.appId == appIds!.currentAppId) .where((product) => product.appId == appIds!.currentAppId)
.sorted((a, b) => a.price.compareTo(b.price)) .sorted((a, b) => a.price.compareTo(b.price))
.toList(); .toList();
// //@Gabby - temporary solution to add trial to list }
// if (currentSubscriptionId == null && !hasSubscribed) {
// final id = availableSubscriptions[0].id; Future<void> _cacheSubscriptionInfo() async {
// final package = availableSubscriptions[0].package; await MatrixState.pangeaController.pStoreService.save(
// final duration = availableSubscriptions[0].duration; PLocalKey.availableSubscriptionInfo,
// availableSubscriptions.insert( toJson(),
// 0, );
// SubscriptionDetails( }
// price: 0,
// id: id, static AvailableSubscriptionsInfo? _getCachedSubscriptionInfo() {
// duration: duration, final json = MatrixState.pangeaController.pStoreService.read(
// package: package, PLocalKey.availableSubscriptionInfo,
// periodType: SubscriptionPeriodType.trial, );
// ), if (json is! Map<String, dynamic>) {
// ); return null;
// } }
try {
return AvailableSubscriptionsInfo.fromJson(json);
} catch (e, s) {
ErrorHandler.logError(e: e, s: s);
return null;
}
}
factory AvailableSubscriptionsInfo.fromJson(Map<String, dynamic> json) {
final appIds = SubscriptionAppIds.fromJson(json['app_ids']);
final allProducts = (json['all_products'] as List<dynamic>)
.map((product) => SubscriptionDetails.fromJson(product))
.toList()
.cast<SubscriptionDetails>();
return AvailableSubscriptionsInfo(
appIds: appIds,
allProducts: allProducts,
);
}
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['app_ids'] = appIds?.toJson();
data['all_products'] =
allProducts?.map((product) => product.toJson()).toList();
return data;
} }
} }

@ -91,16 +91,7 @@ class RCProductsResponseModel {
) { ) {
final List<dynamic> offerings = json["items"] as List<dynamic>; final List<dynamic> offerings = json["items"] as List<dynamic>;
final res = offerings final res = offerings
.map( .map((offering) => SubscriptionDetails.fromJson(offering))
(offering) => SubscriptionDetails(
price: offering['price'],
duration: SubscriptionDuration.values.firstWhereOrNull(
(duration) => duration.value == offering['duration'],
),
id: offering['id'],
appId: offering['appId'],
),
)
.toList() .toList()
.cast<SubscriptionDetails>(); .cast<SubscriptionDetails>();
return RCProductsResponseModel(allProducts: res); return RCProductsResponseModel(allProducts: res);

@ -28,6 +28,14 @@ class SubscriptionAppIds {
..androidId = json['android_id'] ..androidId = json['android_id']
..appleId = json['apple_id']; ..appleId = json['apple_id'];
} }
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['stripe_id'] = stripeId;
data['android_id'] = androidId;
data['apple_id'] = appleId;
return data;
}
} }
enum RCPlatform { enum RCPlatform {

Loading…
Cancel
Save