checkPurchase static method

Future<void> checkPurchase({
  1. required BaseSettings settings,
  2. List<String> productIds = const [],
  3. List<String> subscriptionIds = const [],
  4. void onCompleted()?,
})

Checks previous purchases and queries product details.

Updates settings.unlockFeatures with the purchase status of requested IDs.

Implementation

static Future<void> checkPurchase({
  required BaseSettings settings,
  List<String> productIds = const [],
  List<String> subscriptionIds = const [],
  void Function()? onCompleted,
}) async {
  final List<String> purchasedIds = [];

  final Set<String> allProductIds = {...productIds};
  final Set<String> allSubscriptionIds = {...subscriptionIds};

  try {
    if (!await _iap.isAvailable()) {
      onCompleted?.call();
      return;
    }

    // Handle Cross-platform past purchases
    if (defaultTargetPlatform == TargetPlatform.android) {
      final addition = _iap.getPlatformAddition<InAppPurchaseAndroidPlatformAddition>();
      final purchases = await addition.queryPastPurchases();

      final allIds = {...allProductIds, ...allSubscriptionIds};
      purchasedIds.addAll(
        purchases.pastPurchases
            .where((p) => allIds.contains(p.productID))
            .map((p) => p.productID),
      );
    }

    final Set<String> idList = {...allProductIds, ...allSubscriptionIds};

    if (idList.isNotEmpty) {
      final response = await _iap.queryProductDetails(idList);

      if (response.error != null) {
        LoggerUtil.d('Error fetching product details: ${response.error}');
      } else {
        products = response.productDetails;
      }
    }
  } catch (e) {
    LoggerUtil.d('Error in checkPurchase: $e');
  } finally {
    settings.unlockFeatures = {for (var id in allProductIds) id: purchasedIds.contains(id)};
    settings.subscriptions = {for (var id in allSubscriptionIds) id: purchasedIds.contains(id)};
    onCompleted?.call();
  }
}