Skip to content

Commit 612a709

Browse files
committed
Compiling state of the new architecture support on iOS
1 parent b2784b8 commit 612a709

5 files changed

Lines changed: 319 additions & 125 deletions

File tree

example/app.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"name": "ReactNativeSdkExample",
3-
"displayName": "ReactNativeSdkExample"
2+
"name": "ReactNativeExample",
3+
"displayName": "ReactNativeExample"
44
}

ios/RNNoCodes.mm

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

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

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

88
@end
99

10-
@implementation RNNoCodes
11-
RCT_EXPORT_MODULE()
10+
@implementation RNNoCodes RCT_EXPORT_MODULE()
1211

1312
- (instancetype)init {
14-
self = [super init];
15-
if (self) {
16-
_impl = [[SwiftNoCodes alloc] init];
17-
}
18-
return self;
13+
self = [super init];
14+
if (self) {
15+
_impl = [[RNNoCodesImpl alloc] init];
16+
[_impl setDelegate:self];
17+
}
18+
return self;
1919
}
2020

21-
- (void)initialize:(NSString *)projectKey
22-
resolve:(RCTPromiseResolveBlock)resolve
23-
reject:(RCTPromiseRejectBlock)reject {
24-
[self.impl initialize:projectKey];
21+
- (void)initialize:(NSString *)projectKey {
22+
[self.impl initializeWithProjectKey:projectKey];
2523
}
2624

2725
- (void)setScreenPresentationConfig:(NSDictionary *)configData
2826
contextKey:(NSString *)contextKey
29-
resolve:(RCcdTPromiseResolveBlock)resolve
27+
resolve:(RCTPromiseResolveBlock)resolve
3028
reject:(RCTPromiseRejectBlock)reject {
31-
[self.impl setScreenPresentationConfig:configData forContextKey:contextKey];
29+
[self.impl setScreenPresentationConfig:configData contextKey:contextKey];
3230
}
3331

3432
- (void)showScreen:(NSString *)contextKey
3533
resolve:(RCTPromiseResolveBlock)resolve
3634
reject:(RCTPromiseRejectBlock)reject {
37-
[self.impl showScreen:contextKey];
35+
dispatch_async(dispatch_get_main_queue(), ^{
36+
[self.impl showScreenWithContextKey:contextKey];
37+
});
3838
}
3939

4040
- (void)close:(RCTPromiseResolveBlock)resolve
4141
reject:(RCTPromiseRejectBlock)reject {
42-
dispatch_async(dispatch_get_main_queue(), ^{
43-
[self.impl close];
44-
});
42+
dispatch_async(dispatch_get_main_queue(), ^{
43+
[self.impl close];
44+
});
45+
}
46+
47+
- (void)noCodesDidTriggerWithEvent:(NSString * _Nonnull)event payload:(NSDictionary<NSString *,id> * _Nullable)payload {
48+
[self emitOnNoCodeEvent:@{@"name": event, @"payload": payload}];
49+
}
50+
51+
#pragma mark - TurboModule
52+
53+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
54+
(const facebook::react::ObjCTurboModule::InitParams &)params
55+
{
56+
return std::make_shared<facebook::react::NativeNoCodesModuleSpecJSI>(params);
4557
}
46-
//
47-
//
48-
//#pragma mark - NoCodesEventListener
49-
//
50-
//- (void)noCodesDidTriggerWithEvent:(NSString * _Nonnull)event payload:(NSDictionary<NSString *,id> * _Nullable)payload {
51-
// [self emitOnNoCodeEvent:@{@"name": event, @"payload": payload}];
52-
//}
53-
//
54-
//#pragma mark - TurboModule
55-
//
56-
//- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
57-
// (const facebook::react::ObjCTurboModule::InitParams &)params
58-
//{
59-
// return std::make_shared<facebook::react::NativeNoCodesModuleSpecJSI>(params);
60-
//}
6158

6259
@end

ios/RNNoCodesImpl.swift

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,59 @@ import QonversionSandwich
1010
import React
1111

1212
@objc
13-
class RNNoCodesImpl: NSObject, NoCodesEventListener {
13+
public protocol NoCodesEventDelegate {
14+
func noCodesDidTrigger(event: String, payload: [String: Any]?)
15+
}
16+
17+
class NoCodesEventHandler: NoCodesEventListener {
18+
weak var delegate: NoCodesEventDelegate?
19+
20+
init(delegate: NoCodesEventDelegate?) {
21+
self.delegate = delegate
22+
}
23+
24+
func noCodesDidTrigger(event: String, payload: [String : Any]?) {
25+
delegate?.noCodesDidTrigger(event: event, payload: payload)
26+
}
27+
}
28+
29+
@objc
30+
public class RNNoCodesImpl: NSObject {
1431

1532
var noCodesSandwich: NoCodesSandwich?
33+
var eventHandler: NoCodesEventHandler
1634

17-
override init() {
35+
@objc
36+
public override init() {
37+
eventHandler = NoCodesEventHandler(delegate: nil)
38+
1839
super.init()
19-
noCodesSandwich = NoCodesSandwich(noCodesEventListener: self)
40+
41+
noCodesSandwich = NoCodesSandwich(noCodesEventListener: eventHandler)
2042
}
2143

2244
@objc
23-
func initialize(projectKey: String) {
45+
public func initialize(projectKey: String) {
2446
noCodesSandwich?.initialize(projectKey: projectKey)
2547
}
2648

2749
@MainActor @objc
28-
func setScreenPresentationConfig(configData: [String: Any], contextKey: String) {
50+
public func setScreenPresentationConfig(_ configData: [String: Any], contextKey: String) {
2951
noCodesSandwich?.setScreenPresentationConfig(configData, forContextKey: contextKey)
3052
}
3153

3254
@MainActor @objc
33-
func showScreen(contextKey: String) {
55+
public func showScreen(contextKey: String) {
3456
noCodesSandwich?.showScreen(contextKey)
3557
}
3658

3759
@MainActor @objc
38-
func close() {
60+
public func close() {
3961
noCodesSandwich?.close()
4062
}
4163

42-
func noCodesDidTrigger(event: String, payload: [String : Any]?) {
43-
64+
@objc
65+
public func setDelegate(_ delegate: NoCodesEventDelegate?) {
66+
eventHandler.delegate = delegate
4467
}
4568
}

ios/RNQonversion.mm

Lines changed: 189 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,189 @@
1-
#import <React/RCTBridgeModule.h>
2-
3-
@interface RCT_EXTERN_MODULE(RNQonversion, NSObject)
4-
5-
RCT_EXTERN_METHOD(storeSDKInfo:(NSString *)source version:(NSString *)version)
6-
RCT_EXTERN_METHOD(initializeSdk:(NSString *)key launchModeKey:(NSString *)launchModeKey environmentKey:(NSString *)environmentKey cacheLifetimeKey:(NSString *)cacheLifetimeKey proxyUrl:(NSString *)proxyUrl kidsMode:(BOOL)kidsMode)
7-
RCT_EXTERN_METHOD(syncHistoricalData)
8-
RCT_EXTERN_METHOD(syncStoreKit2Purchases)
9-
RCT_EXTERN_METHOD(getPromotionalOffer:(NSString *)productId discountId:(NSString *)discountId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
10-
RCT_EXTERN_METHOD(purchase:(NSString *)productId quantity:(NSInteger)quantity contextKeys:(NSArray *)contextKeys promoOffer:(NSDictionary *)promoOffer resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
11-
RCT_EXTERN_METHOD(setDefinedProperty:(NSString *)property value:(NSString *)value)
12-
RCT_EXTERN_METHOD(setCustomProperty:(NSString *)property value:(NSString *)value)
13-
RCT_EXTERN_METHOD(userProperties:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
14-
RCT_EXTERN_METHOD(addAttributionData:(NSDictionary *)data provider:(NSString *)provider)
15-
RCT_EXTERN_METHOD(checkEntitlements:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
16-
RCT_EXTERN_METHOD(products:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
17-
RCT_EXTERN_METHOD(offerings:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
18-
RCT_EXTERN_METHOD(checkTrialIntroEligibilityForProductIds:(NSArray *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
19-
RCT_EXTERN_METHOD(restore:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
20-
RCT_EXTERN_METHOD(identify:(NSString *)userId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
21-
RCT_EXTERN_METHOD(logout)
22-
RCT_EXTERN_METHOD(userInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
23-
RCT_EXTERN_METHOD(remoteConfig:(NSString *)contextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
24-
RCT_EXTERN_METHOD(remoteConfigList:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
25-
RCT_EXTERN_METHOD(remoteConfigListForContextKeys:(NSArray<NSString *> *)contextKeys includeEmptyContextKey:(BOOL)includeEmptyContextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
26-
RCT_EXTERN_METHOD(attachUserToExperiment:(NSString *)experimentId groupId:(NSString *)groupId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
27-
RCT_EXTERN_METHOD(detachUserFromExperiment:(NSString *)experimentId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
28-
RCT_EXTERN_METHOD(attachUserToRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
29-
RCT_EXTERN_METHOD(detachUserFromRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
30-
RCT_EXTERN_METHOD(isFallbackFileAccessible:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
31-
RCT_EXTERN_METHOD(collectAdvertisingID)
32-
RCT_EXTERN_METHOD(collectAppleSearchAdsAttribution)
33-
RCT_EXTERN_METHOD(promoPurchase:(NSString *)storeProductId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
34-
RCT_EXTERN_METHOD(presentCodeRedemptionSheet)
35-
36-
@end
1+
#import "RNQonversion.h"
2+
#import "qonversion_react_native_sdk-Swift.h"
3+
4+
@interface RNQonversion () <QonversionEventDelegate>
5+
6+
@property (nonatomic, strong) RNQonversionImpl *impl;
7+
8+
@end
9+
10+
@implementation RNQonversion RCT_EXPORT_MODULE()
11+
12+
- (instancetype)init {
13+
self = [super init];
14+
if (self) {
15+
_impl = [[RNQonversionImpl alloc] init];
16+
[_impl setDelegate:self];
17+
}
18+
return self;
19+
}
20+
21+
- (void)storeSDKInfo:(nonnull NSString *)sdkName sdkVersion:(nonnull NSString *)sdkVersion {
22+
[self.impl storeSDKInfo:sdkName version:sdkVersion];
23+
}
24+
25+
- (void)initializeSdk:(nonnull NSString *)projectKey launchMode:(nonnull NSString *)launchModeKey environment:(nonnull NSString *)environmentKey entitlementsCacheLifetime:(nonnull NSString *)cacheLifetimeKey proxyUrl:(NSString * _Nullable)proxyUrl kidsMode:(BOOL)kidsMode {
26+
[self.impl initializeSdk:projectKey launchModeKey:launchModeKey environmentKey:environmentKey cacheLifetimeKey:cacheLifetimeKey proxyUrl:proxyUrl kidsMode:kidsMode];
27+
}
28+
29+
- (void)syncHistoricalData {
30+
[self.impl syncHistoricalData];
31+
}
32+
33+
- (void)syncStoreKit2Purchases {
34+
[self.impl syncStoreKit2Purchases];
35+
}
36+
37+
- (void)getPromotionalOffer:(nonnull NSString *)productId discount:(NSString * _Nullable)discountId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
38+
[self.impl getPromotionalOffer:productId discountId:discountId resolve:resolve reject:reject];
39+
}
40+
41+
- (void)purchase:(nonnull NSString *)productId quantity:(double)quantity contextKeys:(NSArray * _Nullable)contextKeys promoOffer:(JS::NativeQonversionModule::QPromoOfferDetails &)promoOffer offerId:(NSString * _Nullable)offerId applyOffer:(BOOL)applyOffer oldProductId:(NSString * _Nullable)oldProductId updatePolicyKey:(NSString * _Nullable)updatePolicyKey resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
42+
NSDictionary *promoOfferDict = convertPromoOfferDetailsToDictionary(promoOffer);
43+
[self.impl purchase:productId quantity:quantity contextKeys:contextKeys promoOffer:promoOfferDict resolve:resolve reject:reject];
44+
}
45+
46+
- (void)setDefinedProperty:(NSString *)property value:(NSString *)value {
47+
[self.impl setDefinedProperty:property value:value];
48+
}
49+
50+
- (void)setCustomProperty:(NSString *)property value:(NSString *)value {
51+
[self.impl setCustomProperty:property value:value];
52+
}
53+
54+
- (void)userProperties:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
55+
[self.impl userProperties:resolve reject:reject];
56+
}
57+
58+
- (void)addAttributionData:(NSDictionary *)data provider:(NSString *)provider {
59+
[self.impl addAttributionData:data provider:provider];
60+
}
61+
62+
- (void)checkEntitlements:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
63+
[self.impl checkEntitlements:resolve reject:reject];
64+
}
65+
66+
- (void)products:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
67+
[self.impl products:resolve reject:reject];
68+
}
69+
70+
- (void)offerings:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
71+
[self.impl offerings:resolve reject:reject];
72+
}
73+
74+
- (void)checkTrialIntroEligibilityForProductIds:(NSArray *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
75+
[self.impl checkTrialIntroEligibilityForProductIds:data resolve:resolve reject:reject];
76+
}
77+
78+
- (void)restore:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
79+
[self.impl restore:resolve reject:reject];
80+
}
81+
82+
- (void)identify:(NSString *)userId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
83+
[self.impl identify:userId resolve:resolve reject:reject];
84+
}
85+
86+
- (void)logout {
87+
[self.impl logout];
88+
}
89+
90+
- (void)userInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
91+
[self.impl userInfo:resolve reject:reject];
92+
}
93+
94+
- (void)remoteConfig:(NSString *)contextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
95+
[self.impl remoteConfig:contextKey resolve:resolve reject:reject];
96+
}
97+
98+
- (void)remoteConfigList:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
99+
[self.impl remoteConfigList:resolve reject:reject];
100+
}
101+
102+
- (void)remoteConfigListForContextKeys:(NSArray<NSString *> *)contextKeys includeEmptyContextKey:(BOOL)includeEmptyContextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
103+
[self.impl remoteConfigListForContextKeys:contextKeys includeEmptyContextKey:includeEmptyContextKey resolve:resolve reject:reject];
104+
}
105+
106+
- (void)attachUserToExperiment:(NSString *)experimentId groupId:(NSString *)groupId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
107+
[self.impl attachUserToExperiment:experimentId groupId:groupId resolve:resolve reject:reject];
108+
}
109+
110+
- (void)detachUserFromExperiment:(NSString *)experimentId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
111+
[self.impl detachUserFromExperiment:experimentId resolve:resolve reject:reject];
112+
}
113+
114+
- (void)attachUserToRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
115+
[self.impl attachUserToRemoteConfiguration:remoteConfigurationId resolve:resolve reject:reject];
116+
}
117+
118+
- (void)detachUserFromRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
119+
[self.impl detachUserFromRemoteConfiguration:remoteConfigurationId resolve:resolve reject:reject];
120+
}
121+
122+
- (void)isFallbackFileAccessible:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
123+
[self.impl isFallbackFileAccessible:resolve reject:reject];
124+
}
125+
126+
- (void)collectAdvertisingId {
127+
[self.impl collectAdvertisingID];
128+
}
129+
130+
- (void)collectAppleSearchAdsAttribution {
131+
[self.impl collectAppleSearchAdsAttribution];
132+
}
133+
134+
- (void)promoPurchase:(NSString *)storeProductId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
135+
[self.impl promoPurchase:storeProductId resolve:resolve reject:reject];
136+
}
137+
138+
- (void)presentCodeRedemptionSheet {
139+
[self.impl presentCodeRedemptionSheet];
140+
}
141+
142+
- (void)syncPurchases {
143+
// Android only.
144+
}
145+
146+
- (void)updatePurchase:(nonnull NSString *)productId offerId:(NSString * _Nullable)offerId applyOffer:(BOOL)applyOffer oldProductId:(NSString * _Nullable)oldProductId updatePolicyKey:(NSString * _Nullable)updatePolicyKey resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
147+
// Android only
148+
}
149+
150+
151+
- (void)qonversionDidReceiveUpdatedEntitlements:(NSDictionary<NSString *,id> * _Nonnull)entitlements {
152+
[self emitOnEntitlementsUpdated:entitlements];
153+
}
154+
155+
- (void)shouldPurchasePromoProductWith:(NSString * _Nonnull)productId {
156+
[self emitOnPromoPurchaseReceived:productId];
157+
}
158+
159+
#pragma mark - Private
160+
161+
NSDictionary *convertPromoOfferDetailsToDictionary(JS::NativeQonversionModule::QPromoOfferDetails &promoOffer) {
162+
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
163+
if (promoOffer.productDiscountId()) {
164+
dict[@"productDiscountId"] = promoOffer.productDiscountId();
165+
}
166+
if (promoOffer.keyIdentifier()) {
167+
dict[@"keyIdentifier"] = promoOffer.keyIdentifier();
168+
}
169+
if (promoOffer.nonce()) {
170+
dict[@"nonce"] = promoOffer.nonce();
171+
}
172+
if (promoOffer.signature()) {
173+
dict[@"signature"] = promoOffer.signature();
174+
}
175+
if (promoOffer.timestamp()) {
176+
dict[@"timestamp"] = @(promoOffer.timestamp().value());
177+
}
178+
return [dict copy];
179+
}
180+
181+
#pragma mark - TurboModule
182+
183+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
184+
(const facebook::react::ObjCTurboModule::InitParams &)params
185+
{
186+
return std::make_shared<facebook::react::NativeQonversionModuleSpecJSI>(params);
187+
}
188+
189+
@end

0 commit comments

Comments
 (0)