guru_sdk/guru_app/lib/controller/assets_aware.dart

88 lines
3.4 KiB
Dart

import 'package:guru_app/financial/asset/assets_model.dart';
import 'package:guru_app/financial/asset/assets_store.dart';
import 'package:guru_app/financial/financial_manager.dart';
import 'package:guru_app/financial/iap/iap_manager.dart';
import 'package:guru_app/financial/iap/iap_model.dart';
import 'package:guru_app/financial/igc/igc_manager.dart';
import 'package:guru_app/financial/igc/igc_model.dart';
import 'package:guru_app/financial/product/product_store.dart';
import 'package:guru_app/financial/reward/reward_manager.dart';
import 'package:guru_app/financial/reward/reward_model.dart';
import 'package:guru_app/guru_app.dart';
import 'package:guru_app/test/test_guru_app_creator.dart';
import 'package:guru_utils/datetime/datetime_utils.dart';
import 'package:guru_utils/extensions/extensions.dart';
import 'package:guru_utils/controller/controller.dart';
/// Created by Haoyi on 2022/4/7
mixin AssetsAware on LifecycleController {
final BehaviorSubject<ProductStore<IapProduct>> _productStoreSubject =
BehaviorSubject.seeded(ProductStore());
ProductStore<IapProduct> get currentProductStore => _productStoreSubject.value;
AssetsStore<Asset> get currentIapAssetStore => IapManager.instance.purchasedStore;
AssetsStore<Asset> get currentRewardedStore => RewardManager.instance.rewardedStore;
Stream<ProductStore<IapProduct>> get observableProductStore => _productStoreSubject.stream;
Stream<AssetsStore<Asset>> get observableIapPurchased => IapManager.instance.observableAssetStore;
Stream<AssetsStore<Asset>> get observableRewarded => RewardManager.instance.observableAssetStore;
Stream<AssetsStore<Asset>> get observableAssets => FinancialManager.instance.observableAssets;
int _latestRefreshIapProductTimestamp = 0;
bool get isIapCanceled => IapManager.instance.latestIapCause == IapCause.canceled;
bool get isIapError => IapManager.instance.latestIapCause == IapCause.error;
int get currentIgcBalance => IgcManager.instance.currentBalance;
Stream<int> get observableIgcBalance => IgcManager.instance.observableCurrentBalance;
Future restorePurchases() async {
return await IapManager.instance.restorePurchases();
}
Future clearIapAssets() async {
return await IapManager.instance.clearAssetRecord();
}
void observeIapProducts(Set<TransactionIntent> intents) {
addSubscription(IapManager.instance.observableProductDetails.listen((details) async {
final productStore = await IapManager.instance.buildProducts(intents);
_productStoreSubject.addEx(productStore);
}));
}
void refreshIapProducts() async {
final now = DateTimeUtils.currentTimeInMillis();
if (now - _latestRefreshIapProductTimestamp > DateTimeUtils.minuteInMillis) {
IapManager.instance.refreshProducts();
_latestRefreshIapProductTimestamp = now;
} else {
Log.w("refreshIapProducts Too Frequency!", tag: "IAP");
}
}
Future<RewardProduct> buildRewardProduct(TransactionIntent intent) {
return RewardManager.instance.buildRewardProduct(intent);
}
Future<bool> requestProduct(Product product, {String from = ""}) async {
if (product is IapProduct) {
return await IapManager.instance.buy(product);
} else if (product is IgcProduct) {
return await IgcManager.instance.purchase(product);
} else if (product is RewardProduct) {
return await RewardManager.instance.claim(product);
} else {
return false;
}
}
}