Skip to content

Commit 3dee582

Browse files
committed
Support No-Code screens for analytics mode
1 parent 08dc9dd commit 3dee582

14 files changed

Lines changed: 325 additions & 75 deletions

File tree

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
8080
dependencies {
8181
implementation "com.facebook.react:react-android"
8282
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
83-
implementation "io.qonversion:sandwich:7.1.0"
83+
implementation "io.qonversion:sandwich:7.2.0"
8484
}
8585

8686
if (isNewArchitectureEnabled()) {

android/src/main/java/com/qonversion/reactnativesdk/NoCodesModule.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.facebook.react.bridge.WritableNativeMap
1010
import io.qonversion.sandwich.BridgeData
1111
import io.qonversion.sandwich.NoCodesSandwich
1212
import io.qonversion.sandwich.NoCodesEventListener
13+
import io.qonversion.sandwich.NoCodesPurchaseDelegateBridge
1314

1415
@ReactModule(name = NoCodesModule.NAME)
1516
class NoCodesModule(private val reactContext: ReactApplicationContext) : NativeNoCodesModuleSpec(reactContext) {
@@ -26,6 +27,16 @@ class NoCodesModule(private val reactContext: ReactApplicationContext) : NativeN
2627
emitOnNoCodeEvent(eventMap)
2728
}
2829
}
30+
private val purchaseDelegate: NoCodesPurchaseDelegateBridge = object : NoCodesPurchaseDelegateBridge {
31+
override fun purchase(product: BridgeData) {
32+
val productMap = EntitiesConverter.convertMapToWritableMap(product)
33+
emitOnNoCodePurchase(productMap)
34+
}
35+
36+
override fun restore() {
37+
emitOnNoCodeRestore()
38+
}
39+
}
2940

3041
override fun getName(): String {
3142
return NAME
@@ -70,6 +81,31 @@ class NoCodesModule(private val reactContext: ReactApplicationContext) : NativeN
7081
}
7182
}
7283

84+
@ReactMethod
85+
override fun setPurchaseDelegate() {
86+
noCodesSandwich.setPurchaseDelegate(purchaseDelegate)
87+
}
88+
89+
@ReactMethod
90+
override fun delegatedPurchaseCompleted() {
91+
noCodesSandwich.delegatedPurchaseCompleted()
92+
}
93+
94+
@ReactMethod
95+
override fun delegatedPurchaseFailed(errorMessage: String) {
96+
noCodesSandwich.delegatedPurchaseFailed(errorMessage)
97+
}
98+
99+
@ReactMethod
100+
override fun delegatedRestoreCompleted() {
101+
noCodesSandwich.delegatedRestoreCompleted()
102+
}
103+
104+
@ReactMethod
105+
override fun delegatedRestoreFailed(errorMessage: String) {
106+
noCodesSandwich.delegatedRestoreFailed(errorMessage)
107+
}
108+
73109
companion object {
74110
const val NAME = "RNNoCodes"
75111
}

example/ios/Podfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ if linkage != nil
1616
use_frameworks! :linkage => linkage.to_sym
1717
end
1818

19+
# For testing Sandwich SDK locally, uncomment the following line
20+
# pod 'QonversionSandwich', :path => '../../../sandwich-sdk'
21+
1922
target 'QonversionExample' do
2023
config = use_native_modules!
2124

example/ios/Podfile.lock

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ PODS:
88
- hermes-engine (0.80.1):
99
- hermes-engine/Pre-built (= 0.80.1)
1010
- hermes-engine/Pre-built (0.80.1)
11-
- Qonversion (6.0.0):
12-
- Qonversion/Main (= 6.0.0)
11+
- Qonversion (6.1.0):
12+
- Qonversion/Main (= 6.1.0)
1313
- qonversion-react-native-sdk (10.0.0):
1414
- boost
1515
- DoubleConversion
1616
- fast_float
1717
- fmt
1818
- glog
1919
- hermes-engine
20-
- QonversionSandwich (= 7.0.0)
20+
- QonversionSandwich (= 7.2.0)
2121
- RCT-Folly
2222
- RCT-Folly/Fabric
2323
- RCTRequired
@@ -40,9 +40,9 @@ PODS:
4040
- ReactCommon/turbomodule/core
4141
- SocketRocket
4242
- Yoga
43-
- Qonversion/Main (6.0.0)
44-
- QonversionSandwich (7.0.0):
45-
- Qonversion (= 6.0.0)
43+
- Qonversion/Main (6.1.0)
44+
- QonversionSandwich (7.2.0):
45+
- Qonversion (= 6.1.0)
4646
- RCT-Folly (2024.11.18.00):
4747
- boost
4848
- DoubleConversion
@@ -2200,6 +2200,7 @@ DEPENDENCIES:
22002200
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
22012201
- hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
22022202
- qonversion-react-native-sdk (from `../..`)
2203+
- QonversionSandwich (from `../../../sandwich-sdk`)
22032204
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
22042205
- RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
22052206
- RCTRequired (from `../node_modules/react-native/Libraries/Required`)
@@ -2273,7 +2274,6 @@ DEPENDENCIES:
22732274
SPEC REPOS:
22742275
trunk:
22752276
- Qonversion
2276-
- QonversionSandwich
22772277
- SocketRocket
22782278

22792279
EXTERNAL SOURCES:
@@ -2294,6 +2294,8 @@ EXTERNAL SOURCES:
22942294
:tag: hermes-2025-05-06-RNv0.80.0-4eb6132a5bf0450bf4c6c91987675381d7ac8bca
22952295
qonversion-react-native-sdk:
22962296
:path: "../.."
2297+
QonversionSandwich:
2298+
:path: "../../../sandwich-sdk"
22972299
RCT-Folly:
22982300
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
22992301
RCTDeprecation:
@@ -2437,78 +2439,78 @@ SPEC CHECKSUMS:
24372439
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
24382440
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
24392441
hermes-engine: 4f07404533b808de66cf48ac4200463068d0e95a
2440-
Qonversion: 694b88c4bfc06d827c189908e73ea955a1ddde6c
2441-
qonversion-react-native-sdk: 262513c36e2c4ebd3718ff31af1c2cde4e52eb81
2442-
QonversionSandwich: 1795bd19b40c129e76e976d2e5b88d7a7c9174ef
2443-
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
2442+
Qonversion: 0b64e731cb59f94ab03c132cea2b70552b4dcc2b
2443+
qonversion-react-native-sdk: ce6463d62e5ea60ddf3bf7b4cce582f9415f1c01
2444+
QonversionSandwich: 6aee2b128590545439041bb793a77eaf1d4b325e
2445+
RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
24442446
RCTDeprecation: efa5010912100e944a7ac9a93a157e1def1988fe
24452447
RCTRequired: bbc4cf999ddc4a4b076e076c74dd1d39d0254630
24462448
RCTTypeSafety: d877728097547d0a37786cc9130c43ad71739ac3
24472449
React: 4b0b9cb962e694611e5e8a697c1b0300a2510c21
24482450
React-callinvoker: 70f125c17c7132811a6b473946ac5e7ae93b5e57
2449-
React-Core: bab40f5b1f46fe0c5896895a6f333e861a821a81
2450-
React-CoreModules: 05647d952e521113c128360633896ba7ba652e82
2451-
React-cxxreact: 2b4bac1ec6eecc6288ac8a6caea6afb42585740e
2451+
React-Core: 7cbc3118df2334b2ef597d9a515938b02c82109f
2452+
React-CoreModules: 7d8c14ecb889e7786a04637583b55b7d8f246baf
2453+
React-cxxreact: f32be07cba236c2f20f4e05ca200577ba5358e78
24522454
React-debug: deb3a146ef717fa3e8f4c23e0288369fe53199b7
2453-
React-defaultsnativemodule: 11e2948787a15d3cf1b66d7f29f13770a177bff7
2454-
React-domnativemodule: 2f4b279acdb2963736fb5de2f585811dd90070b5
2455-
React-Fabric: 6f8d1a303c96f1d078c14d74c4005bf457e5b782
2456-
React-FabricComponents: b106410970e9a0c4e592da656c7a7e0947306c23
2457-
React-FabricImage: 1abaf230dfce9b58fdf53c4128f3f40c6e64af6a
2458-
React-featureflags: f7ef58d91079efde3ad223bcca6d197e845d5bcf
2459-
React-featureflagsnativemodule: ae5abc9849d1696f4f8f11ee3744bf5715e032cf
2460-
React-graphics: b306856c6ed9aac32f717a229550406a53b28a6d
2461-
React-hermes: b6edce8fa19388654b1aea30844497cbeade83bc
2462-
React-idlecallbacksnativemodule: cb386712842cb9e479c89311edb234d529b64db4
2463-
React-ImageManager: 8ce94417853eaa22faaad1f4cc1952dd3f8e2275
2464-
React-jserrorhandler: ab827d67dc270a9c8703eef524230baeafaf6876
2465-
React-jsi: 545342ec5c78ab1277af5f0dbe8d489e7e73db14
2466-
React-jsiexecutor: 20210891c7c77255c16dec6762faf68b373f9f74
2467-
React-jsinspector: 4e73460e488132d70d2b4894e5578cc856f2cb74
2468-
React-jsinspectorcdp: 8b2bcb5779289cb2b9ca517f2965ed23eb2fd3e0
2469-
React-jsinspectornetwork: b5e0cb9e488d294eed2d8209dc3dc0f9587210c1
2470-
React-jsinspectortracing: f3c4036e7b984405ac910f878576d325dd9f2834
2471-
React-jsitooling: 75bbfd221b6173a5e848ca5a6680506bac064a56
2472-
React-jsitracing: 11ed7d821864dd988c159d4943e0a1e0937c11b1
2473-
React-logger: 984ebd897afad067555d081deaf03f57c4315723
2474-
React-Mapbuffer: 0c045c844ce6d85cde53e85ab163294c6adad349
2475-
React-microtasksnativemodule: d9499269ad1f484ae71319bac1d9231447f2094e
2476-
React-NativeModulesApple: 983f3483ef0a3446b56d490f09d579fba2442e17
2455+
React-defaultsnativemodule: 2c13a4240c5f96c42d069d1ba2392de6b4145bbd
2456+
React-domnativemodule: 91349b0b1cb20310cec1341b87cdd461aaa85e57
2457+
React-Fabric: bdfc7ec2481f26d7a9b8f59461f29ba4d903c549
2458+
React-FabricComponents: 47898469543d1bfb4528a9846419ec5568be89b1
2459+
React-FabricImage: ac8fc85ef452e5e9ae935c41118814651bd9e7f3
2460+
React-featureflags: 793b911e4c53e680db4a7d9965d0d6dc87b2fa88
2461+
React-featureflagsnativemodule: 25c9516d0dd004493c9bbafeb97da20bf9bde7dc
2462+
React-graphics: e07281690425dd9eeba3875d1faad28bc1f6da3b
2463+
React-hermes: bc1440d0e0662cc813bbf1c5ffbf9e0db2993a0f
2464+
React-idlecallbacksnativemodule: a2a3bb4a1793280b34d06d00169153b094be8c16
2465+
React-ImageManager: c9fa7461f3cab08e7bc98cbf55455b499e71c8b3
2466+
React-jserrorhandler: 15e591702040afed99cfcd088cf2337a8d09d807
2467+
React-jsi: 512ab3a1a628bc8824c41de8bcbbb81b2ac6fa8d
2468+
React-jsiexecutor: 653ccd2dee1e5ea558eecaf2f27b8bba0f09add8
2469+
React-jsinspector: 9121ccd2676a3f7c079ac01c9f90183422e3190e
2470+
React-jsinspectorcdp: 5c723ff2a09d73f2fdc496a545fb7003e7fdc079
2471+
React-jsinspectornetwork: 9cb0173f69e8405cef33fc79030fad26bbc3c073
2472+
React-jsinspectortracing: 65dc04125dc2392d85a82b6916f8cb088ea77566
2473+
React-jsitooling: 21af93cc98f760dd88d65b06b9317e0d4849fbbc
2474+
React-jsitracing: 4cc1b7de8087ae41c61a0eeee2593bc3362908b6
2475+
React-logger: 2f0d40bc8e648fbb1ff3b6580ad54189a8753290
2476+
React-Mapbuffer: 9a7c65078c6851397c1999068989e4fc239d0c80
2477+
React-microtasksnativemodule: 4f1ef719ba6c7ebbd2d75346ffa2916f9b4771c9
2478+
React-NativeModulesApple: f6f696e510b9d89c3c06b7764f56947dc13ae922
24772479
React-oscompat: 114036cd8f064558c9c1a0c04fc9ae5e1453706a
2478-
React-perflogger: e7287fee27c16e3c8bd4d470f2361572b63be16b
2479-
React-performancetimeline: 8ebbaa31d2d0cea680b0a2a567500d3cab8954fc
2480+
React-perflogger: 4b2f88ae059b600daf268528a4a83366338eef05
2481+
React-performancetimeline: e15fd9798123436f99e46898422fe921fecf506b
24802482
React-RCTActionSheet: 68c68b0a7a5d2b0cfc255c64889b6e485974e988
2481-
React-RCTAnimation: d6c5c728b888a967ce9aff1ff71a8ed71a68d069
2482-
React-RCTAppDelegate: 0fc048666bda159cd469a6fb9befb04b3fa62be4
2483-
React-RCTBlob: 12d8c699a1f906840113ee8d8bb575e69a05509f
2484-
React-RCTFabric: 01e815845ebc185f44205dcbf50eeb712fec23fe
2485-
React-RCTFBReactNativeSpec: f57927fb0af6ce2f25c19f8b894e2986138aa89f
2486-
React-RCTImage: a82518168f4ee407913b23ca749ca79ef51959f3
2487-
React-RCTLinking: 7f343b584c36f024f390fea563483568fe763ef6
2488-
React-RCTNetwork: 3165eb757ceb62a7cde4cdad043d63314122e8a3
2489-
React-RCTRuntime: feee590c459c4cb6aaa7a00f3abc8c04709b536f
2490-
React-RCTSettings: 6bad0ae45d8d872c873059f332f586f99875621f
2491-
React-RCTText: 657d60f35983062de8f0cea67c279aa7a3ea9858
2492-
React-RCTVibration: 78f4770515141efb7f55f9b27c49dda95319c3a8
2483+
React-RCTAnimation: 6bf502c89c53076f92cd1a254f5ec8d63ee263de
2484+
React-RCTAppDelegate: c90f5732784684c3dd226d812eccb578cd954ad7
2485+
React-RCTBlob: d2905f01749b80efd6d3b86fb15e30ed26d5450b
2486+
React-RCTFabric: 435b3ffaad113fb1f274c2f2a677c9fcc9b5cf55
2487+
React-RCTFBReactNativeSpec: a3178b419f42af196e90ca4bf07710dce5d68301
2488+
React-RCTImage: 8f5ffa03461339180a68820ea452af6e20ace2c7
2489+
React-RCTLinking: 1151646834d31f97580d8a75d768a84b2533b7f9
2490+
React-RCTNetwork: 52008724d0db90a540f4058ed0de0e41c4b7943c
2491+
React-RCTRuntime: 10ce9a7cb27ba307544d29a2a04e6202dc7b3e9a
2492+
React-RCTSettings: f724cacbd892ee18f985e1aebdd97386e49c76f5
2493+
React-RCTText: 6e1b95d9126d808410dfa96e09bc4441ec6f36f7
2494+
React-RCTVibration: 862a4e5b36d49e6299c8cbfb86486fc31f86f6fa
24932495
React-rendererconsistency: f7baab26c6d0cd5b2eb7afcecfd2d8b957017b18
2494-
React-renderercss: bdd2f83a4a054c3e4321fd61305c202b848e471b
2495-
React-rendererdebug: 9f8865ee038127a9d99d4b034c9da4935d204993
2496+
React-renderercss: 62acb8f010a062309e3bd0e203aa14636162e3b3
2497+
React-rendererdebug: 3a89ac44f15c7160735264d585a29525655238d2
24962498
React-rncore: f7438473c4c71ee1963fb06a8635bb96013c9e1c
2497-
React-RuntimeApple: 4d2ab9f72b9193da86eceded128a67254fc18aeb
2498-
React-RuntimeCore: 5fd73030438d094975ca0f549d162dd97746ae38
2499+
React-RuntimeApple: 81f0a9ba81ce7eb203529b0471dc69bf18f5f637
2500+
React-RuntimeCore: 6356e89b2518ba66a989c39a2adb18122a5e3b7b
24992501
React-runtimeexecutor: 17c70842d5e611130cb66f91e247bc4a609c3508
2500-
React-RuntimeHermes: 3c88e6e1ea7ea0899dcffc77c10d61ea46688cfd
2501-
React-runtimescheduler: 024500621c7c93d65371498abb4ee26d34f5d47d
2502+
React-RuntimeHermes: 0a1d7ce2fe08cf182235de1a9330b51aa6b935cd
2503+
React-runtimescheduler: 10ae98e1417eff159be5df8fdc8fcdaac557aba6
25022504
React-timing: c3c923df2b86194e1682e01167717481232f1dc7
2503-
React-utils: 9154a037543147e1c24098f1a48fc8472602c092
2504-
ReactAppDependencyProvider: afd905e84ee36e1678016ae04d7370c75ed539be
2505-
ReactCodegen: f8d5fb047c4cd9d2caade972cad9edac22521362
2506-
ReactCommon: 17fd88849a174bf9ce45461912291aca711410fc
2507-
RNCClipboard: b228d492733d66e0126e18ce66c6d2f90bacc7e5
2508-
RNSnackbar: c1b235eb606b03938c693ce769ed3059c31dff9b
2505+
React-utils: 7791a96e194eec85cb41dc98a2045b5f07839598
2506+
ReactAppDependencyProvider: ba631a31783569c13056dd57ff39e19764abdd6f
2507+
ReactCodegen: b16d00d43b4e9dc44af53be171b17d93b4b20267
2508+
ReactCommon: 96684b90b235d6ae340d126141edd4563b7a446a
2509+
RNCClipboard: acf8ae07037c21f17d9284ca56e982186ed21465
2510+
RNSnackbar: b0914bd060cdb82862dc1a987be57a8b918610bf
25092511
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
2510-
Yoga: daa1e4de4b971b977b23bc842aaa3e135324f1f3
2512+
Yoga: 703055a9f39562521cdb8657162dfd80f8c174c3
25112513

2512-
PODFILE CHECKSUM: 05782888d88e3a4a4bbc945c42df54704269e6ea
2514+
PODFILE CHECKSUM: f56bbcfb3ee0fbed79b9ce0f06983ea8ea7533f8
25132515

25142516
COCOAPODS: 1.16.2

example/src/screens/NoCodesScreen/index.tsx

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import {
88
TextInput,
99
Platform,
1010
} from 'react-native';
11-
import {
11+
import Qonversion, {
1212
NoCodesAction,
1313
NoCodesConfigBuilder,
1414
ScreenPresentationStyle,
1515
ScreenPresentationConfig,
1616
NoCodes,
17+
NoCodesError,
18+
type PurchaseDelegate,
19+
Product
1720
} from '@qonversion/react-native-sdk';
18-
import type NoCodesError from '../../../../src/dto/NoCodesError';
1921
import { AppContext } from '../../store/AppStore';
2022
import styles from './styles';
2123
import Snackbar from 'react-native-snackbar';
@@ -37,6 +39,42 @@ const NoCodesScreen: React.FC = () => {
3739
// Initialize No-Codes SDK once
3840
const initializeNoCodes = () => {
3941
console.log('🔄 [NoCodes] Starting SDK initialization...');
42+
// @ts-ignore - PurchaseDelegate is not used until the comment below is uncommented
43+
const purchaseDelegate: PurchaseDelegate = {
44+
purchase: async (product: Product) => {
45+
console.log('🔄 [PurchaseDelegate] Starting purchase for product:', product.qonversionId);
46+
try {
47+
const entitlements = await Qonversion.getSharedInstance().purchaseProduct(product);
48+
console.log('✅ [PurchaseDelegate] Purchase successful:', Object.fromEntries(entitlements));
49+
dispatch({ type: 'ADD_NOCODES_EVENT', payload: `Purchase completed: ${product.qonversionId}` });
50+
Snackbar.show({
51+
text: `Purchase completed: ${product.qonversionId}`,
52+
duration: Snackbar.LENGTH_SHORT,
53+
});
54+
} catch (error: any) {
55+
console.error('❌ [PurchaseDelegate] Purchase failed:', error);
56+
dispatch({ type: 'ADD_NOCODES_EVENT', payload: `Purchase failed: ${error.message}` });
57+
throw error; // Re-throw to let NoCodes SDK handle the error
58+
}
59+
},
60+
restore: async () => {
61+
console.log('🔄 [PurchaseDelegate] Starting restore...');
62+
try {
63+
const entitlements = await Qonversion.getSharedInstance().restore();
64+
console.log('✅ [PurchaseDelegate] Restore successful:', Object.fromEntries(entitlements));
65+
dispatch({ type: 'ADD_NOCODES_EVENT', payload: 'Restore completed' });
66+
Snackbar.show({
67+
text: 'Restore completed successfully!',
68+
duration: Snackbar.LENGTH_SHORT,
69+
});
70+
} catch (error: any) {
71+
console.error('❌ [PurchaseDelegate] Restore failed:', error);
72+
dispatch({ type: 'ADD_NOCODES_EVENT', payload: `Restore failed: ${error.message}` });
73+
throw error; // Re-throw to let NoCodes SDK handle the error
74+
}
75+
},
76+
};
77+
4078
const noCodesConfig = new NoCodesConfigBuilder(ProjectKey)
4179
.setNoCodesListener({
4280
onScreenShown: (id: string) => {
@@ -71,6 +109,7 @@ const NoCodesScreen: React.FC = () => {
71109
NoCodes.getSharedInstance().close();
72110
},
73111
})
112+
// .setPurchaseDelegate(purchaseDelegate) // Uncomment this to use the purchase delegate
74113
.build();
75114
console.log('✅ [NoCodes] Config built successfully:', noCodesConfig);
76115

ios/RNNoCodes.mm

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#import "RNNoCodes.h"
22
#import "qonversion_react_native_sdk-Swift.h"
33

4-
@interface RNNoCodes () <NoCodesEventDelegate>
4+
@interface RNNoCodes () <NoCodesEventDelegate, NoCodesPurchaseDelegateProxy>
55

66
@property (nonatomic, strong) RNNoCodesImpl *impl;
77

@@ -47,8 +47,40 @@ - (void)close:(RCTPromiseResolveBlock)resolve
4747
});
4848
}
4949

50+
- (void)setPurchaseDelegate {
51+
[self.impl setPurchaseDelegate:self];
52+
}
53+
54+
- (void)delegatedPurchaseCompleted {
55+
[self.impl delegatedPurchaseCompleted];
56+
}
57+
58+
- (void)delegatedPurchaseFailed:(NSString *)errorMessage {
59+
[self.impl delegatedPurchaseFailed:errorMessage];
60+
}
61+
62+
- (void)delegatedRestoreCompleted {
63+
[self.impl delegatedRestoreCompleted];
64+
}
65+
66+
- (void)delegatedRestoreFailed:(NSString *)errorMessage {
67+
[self.impl delegatedRestoreFailed:errorMessage];
68+
}
69+
70+
#pragma mark - NoCodesEventDelegate
71+
5072
- (void)noCodesDidTriggerWithEvent:(NSString * _Nonnull)event payload:(NSDictionary<NSString *,id> * _Nullable)payload {
51-
[self emitOnNoCodeEvent:@{@"name": event, @"payload": payload ?: [NSNull null]}];
73+
[self emitOnNoCodeEvent:@{@"name": event, @"payload": payload ?: [NSNull null]}];
74+
}
75+
76+
#pragma mark - NoCodesPurchaseDelegateProxy
77+
78+
- (void)purchase:(NSDictionary *)product {
79+
[self emitOnNoCodePurchase:product];
80+
}
81+
82+
- (void)restore {
83+
[self emitOnNoCodeRestore];
5284
}
5385

5486
#pragma mark - TurboModule

0 commit comments

Comments
 (0)