Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -666,8 +666,11 @@ public void generateRewardVerificationToken(String impressionId, final Promise p
}

@ReactMethod
public void pollRewardVerification(String clientTransactionId, final Promise promise) {
CommonKt.pollRewardVerification(clientTransactionId, getOnResult(promise));
public void pollRewardVerification(String clientTransactionId,
@Nullable ReadableMap trackingMetadata,
final Promise promise) {
Map<String, Object> mapTrackingMetadata = trackingMetadata != null ? trackingMetadata.toHashMap() : null;
CommonKt.pollRewardVerification(clientTransactionId, getOnResult(promise), mapTrackingMetadata);
}

// endregion
Expand Down
19 changes: 19 additions & 0 deletions apitesters/rewardVerification.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import Purchases, {
RewardVerificationToken,
RewardVerificationResult,
RewardedAdTrackingMetadata,
VerifiedReward,
VerifiedVirtualCurrencyReward,
VerifiedEntitlementReward,
VerifiedNoReward,
VerifiedUnsupportedReward,
AdMediatorName,
AdFormat,
} from "../src";

async function checkGenerateRewardVerificationToken() {
Expand All @@ -24,6 +27,22 @@ async function checkPollRewardVerification() {
const _moreRewards: VerifiedReward[] = result.moreRewards;
}

async function checkPollRewardVerificationWithTrackingMetadata() {
const trackingMetadata: RewardedAdTrackingMetadata = {
mediatorName: AdMediatorName.adMob,
adFormat: AdFormat.rewarded,
adUnitId: "unit-1",
impressionId: "imp-1",
networkName: "AdNetwork",
placement: "home",
};
const result: RewardVerificationResult =
await Purchases.pollRewardVerification(
"client-transaction-id",
trackingMetadata
);
}

function checkVerifiedRewardTypes(reward: VerifiedReward) {
switch (reward.type) {
case "virtual_currency": {
Expand Down
6 changes: 4 additions & 2 deletions ios/RNPurchases.m
Original file line number Diff line number Diff line change
Expand Up @@ -714,9 +714,11 @@ static void logUnavailablePresentCodeRedemptionSheet() {
}

RCT_EXPORT_METHOD(pollRewardVerification:(NSString *)clientTransactionId
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
trackingMetadata:(nullable NSDictionary *)trackingMetadata
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
[RCCommonFunctionality pollRewardVerificationWithClientTransactionId:clientTransactionId
trackingMetadata:trackingMetadata.mappingNSNullToNil
completion:[self getResponseCompletionBlockWithResolve:resolve
reject:reject]];
}
Expand Down
3 changes: 2 additions & 1 deletion src/browser/nativeModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { validateAndTransform, isCustomerInfo, isPurchasesOfferings, isPurchases
import { isExpoGo, isRorkSandbox } from '../utils/environment';
import { ensurePurchasesConfigured, methodNotSupportedOnWeb } from './utils';
import { purchaseSimulatedPackage } from './simulatedstore/purchaseSimulatedPackageHelper';
import type { RewardedAdTrackingMetadata } from '../purchases';


const packageVersion = '9.1.0';
Expand Down Expand Up @@ -366,7 +367,7 @@ export const browserNativeModuleRNPurchases = {
generateRewardVerificationToken: async (_impressionId: string) => {
methodNotSupportedOnWeb('generateRewardVerificationToken');
},
pollRewardVerification: async (_clientTransactionId: string) => {
pollRewardVerification: async (_clientTransactionId: string, _trackingMetadata?: RewardedAdTrackingMetadata) => {
methodNotSupportedOnWeb('pollRewardVerification');
},
};
25 changes: 23 additions & 2 deletions src/purchases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,20 @@ export interface RewardVerificationResult {
failed: boolean;
}

/**
* Ad metadata for a rewarded ad, passed to {@link Purchases.pollRewardVerification}
* to have the SDK automatically track reward-verification events for it.
* @beta
*/
export interface RewardedAdTrackingMetadata {
mediatorName: AdMediatorName;
adFormat: AdFormat;
adUnitId: string;
impressionId: string;
networkName?: string | null;
placement?: string | null;
}

let debugEventListeners: DebugEventListener[] = [];

eventEmitter?.addListener(
Expand Down Expand Up @@ -2167,14 +2181,21 @@ export default class Purchases {
*
* @param clientTransactionId - The `clientTransactionId` from
* {@link Purchases.generateRewardVerificationToken}.
* @param trackingMetadata - Pass to have the SDK automatically track
* reward-verification events for the ad it belongs to; omit to poll
* without tracking.
* @returns {Promise<RewardVerificationResult>} promise with the verification result.
* @beta
*/
public static async pollRewardVerification(
clientTransactionId: string
clientTransactionId: string,
trackingMetadata?: RewardedAdTrackingMetadata
): Promise<RewardVerificationResult> {
await throwIfNotConfigured();
return RNPurchases.pollRewardVerification(clientTransactionId);
return RNPurchases.pollRewardVerification(
clientTransactionId,
trackingMetadata
);
}

private static async throwIfAndroidPlatform() {
Expand Down