Skip to content

Commit

Permalink
locally cache subscription info
Browse files Browse the repository at this point in the history
  • Loading branch information
ggurdin committed Nov 14, 2024
1 parent 1a341cc commit 0add6b1
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 28 deletions.
1 change: 1 addition & 0 deletions lib/pangea/constants/local.key.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}
21 changes: 21 additions & 0 deletions lib/pangea/controllers/subscription_controller.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -409,4 +410,24 @@ class SubscriptionDetails {
? AppConfig.appleMangementUrl
: 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'],
);
}
}
76 changes: 58 additions & 18 deletions lib/pangea/models/base_subscription_info.dart
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -87,28 +90,65 @@ class AvailableSubscriptionsInfo {
SubscriptionAppIds? appIds;
List<SubscriptionDetails>? allProducts;

AvailableSubscriptionsInfo({
this.appIds,
this.allProducts,
});

Future<void> 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<void> _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<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;
}
}
11 changes: 1 addition & 10 deletions lib/pangea/repo/subscription_repo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -91,16 +91,7 @@ class RCProductsResponseModel {
) {
final List<dynamic> offerings = json["items"] as List<dynamic>;
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<SubscriptionDetails>();
return RCProductsResponseModel(allProducts: res);
Expand Down
8 changes: 8 additions & 0 deletions lib/pangea/utils/subscription_app_id.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ class SubscriptionAppIds {
..androidId = json['android_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 {
Expand Down

0 comments on commit 0add6b1

Please sign in to comment.