diff --git a/ios/RNMParticle/RNMParticle.mm b/ios/RNMParticle/RNMParticle.mm index f2968d0..db3a8b1 100644 --- a/ios/RNMParticle/RNMParticle.mm +++ b/ios/RNMParticle/RNMParticle.mm @@ -19,6 +19,13 @@ @interface MParticleUser () - (void)setUserId:(NSNumber *)userId; @end +// Forward declare so New Arch `logCommerceEvent` can use the same JS→native +// mappings as `RCTConvert (MPCommerceEvent)` (defined later in this file). +@interface RCTConvert (MPCommerceEvent) ++ (MPCommerceEventAction)MPCommerceEventAction:(id)json; ++ (MPPromotionAction)MPPromotionAction:(id)json; +@end + @implementation RNMParticle RCT_EXTERN void RCTRegisterModule(Class); @@ -447,11 +454,14 @@ - (void)logCommerceEvent:(JS::NativeMParticle::CommerceEvent &)commerceEvent { MPCommerceEvent *mpCommerceEvent = [[MPCommerceEvent alloc] init]; if (commerceEvent.productActionType().has_value()) { - mpCommerceEvent.action = (MPCommerceEventAction)commerceEvent.productActionType().value(); + mpCommerceEvent.action = [RCTConvert MPCommerceEventAction:@(commerceEvent.productActionType().value())]; } if (commerceEvent.promotionActionType().has_value()) { - mpCommerceEvent.promotionContainer = [[MPPromotionContainer alloc] initWithAction:(MPPromotionAction)commerceEvent.promotionActionType().value() promotion:nil]; + MPPromotionAction promotionAction = + [RCTConvert MPPromotionAction:@(commerceEvent.promotionActionType().value())]; + mpCommerceEvent.promotionContainer = + [[MPPromotionContainer alloc] initWithAction:promotionAction promotion:nil]; } if (commerceEvent.products().has_value()) { @@ -778,7 +788,7 @@ + (MPCommerceEvent *)MPCommerceEvent:(NSDictionary *)dict { MPCommerceEvent *commerceEvent = [[MPCommerceEvent alloc] init]; if (dict[@"productActionType"] && dict[@"productActionType"] != [NSNull null]) { - commerceEvent.action = (MPCommerceEventAction)[dict[@"productActionType"] integerValue]; + commerceEvent.action = [RCTConvert MPCommerceEventAction:dict[@"productActionType"]]; } if (dict[@"products"] && dict[@"products"] != [NSNull null]) { @@ -920,6 +930,7 @@ + (MPPromotion *)MPPromotion:(id)json; + (MPTransactionAttributes *)MPTransactionAttributes:(id)json; + (MPProduct *)MPProduct:(id)json; + (MPCommerceEventAction)MPCommerceEventAction:(id)json; ++ (MPPromotionAction)MPPromotionAction:(id)json; + (MPIdentityApiRequest *)MPIdentityApiRequest:(id)json; + (MPIdentityApiResult *)MPIdentityApiResult:(id)json; + (MPAliasRequest *)MPAliasRequest:(id)json; @@ -989,7 +1000,7 @@ + (MPCommerceEvent *)MPCommerceEvent:(id)json { } + (MPPromotionContainer *)MPPromotionContainer:(id)json { - MPPromotionAction promotionAction = (MPPromotionAction)[json[@"promotionActionType"] intValue]; + MPPromotionAction promotionAction = [RCTConvert MPPromotionAction:json[@"promotionActionType"]]; MPPromotionContainer *promotionContainer = [[MPPromotionContainer alloc] initWithAction:promotionAction promotion:nil]; NSArray *jsonPromotions = json[@"promotions"]; [jsonPromotions enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { @@ -1039,6 +1050,20 @@ + (MPProduct *)MPProduct:(id)json { return product; } ++ (MPPromotionAction)MPPromotionAction:(NSNumber *)json { + // JS `PromotionActionType`: View = 0, Click = 1 (js/index.tsx). + // Apple `MPPromotionAction`: Click = 0, View = 1 (MPPromotion.h). + switch ([json intValue]) { + case 0: + return MPPromotionActionView; + case 1: + return MPPromotionActionClick; + default: + // Match Android `convertPromotionActionType`: non-zero → Click + return MPPromotionActionClick; + } +} + + (MPCommerceEventAction)MPCommerceEventAction:(NSNumber *)json { int actionInt = [json intValue]; MPCommerceEventAction action;