From f047efb756fa0c3b5602753da1f3457e3ab7708e Mon Sep 17 00:00:00 2001 From: joe goodall Date: Thu, 18 Jun 2026 15:05:28 +0100 Subject: [PATCH 1/8] fix: remove RCTBridge instance dependency from Config, use static NativeConfig store --- ios/Config.swift | 14 ++++-------- ios/RCTNativeConfig.h | 4 ++++ ios/RCTNativeConfig.mm | 48 ++++++++++++++++++++++++++++++------------ 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/ios/Config.swift b/ios/Config.swift index 7892192..3b96072 100644 --- a/ios/Config.swift +++ b/ios/Config.swift @@ -6,25 +6,19 @@ final class Config: NSObject { static let shared = Config() - private var nativeConfig: RCTNativeConfig? { - RCTBridge.current()?.module(forName: "NativeConfig") as? RCTNativeConfig - } - func get(for key: String) -> String { - return nativeConfig?.getConfig(key) ?? "" + return RCTNativeConfig.getConfig(forKey: key) ?? "" } func set(for key: String, value: String) { - print("Swift set key=\(key) value=\(value)") - nativeConfig?.setConfig(key, value: value) + RCTNativeConfig.setConfig(value, forKey: key) } func optionalString(for key: String) -> String? { - let value = nativeConfig?.getConfig(key) - return value == nil ? nil : value + return RCTNativeConfig.getConfig(forKey: key) } func getImage(for key: String) -> UIImage? { - return nativeConfig?.getImage(key) + return RCTNativeConfig.getImage(forKey: key) } } diff --git a/ios/RCTNativeConfig.h b/ios/RCTNativeConfig.h index b3e33ea..7408bca 100644 --- a/ios/RCTNativeConfig.h +++ b/ios/RCTNativeConfig.h @@ -12,6 +12,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)setConfig:(NSString *)key value:(NSString *)value; - (void)setImage:(NSString *)key uri:(NSString *)uri; ++ (nullable NSString *)getConfigForKey:(NSString *)key; ++ (void)setConfig:(nullable NSString *)value forKey:(NSString *)key; ++ (nullable UIImage *)getImageForKey:(NSString *)key; + @end NS_ASSUME_NONNULL_END diff --git a/ios/RCTNativeConfig.mm b/ios/RCTNativeConfig.mm index 384cc03..d8f95fb 100644 --- a/ios/RCTNativeConfig.mm +++ b/ios/RCTNativeConfig.mm @@ -4,17 +4,17 @@ #import #import - -@implementation RCTNativeConfig { - NSMutableDictionary *_configValues; +static NSMutableDictionary *NativeConfigStore(void) { + static NSMutableDictionary *store = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + store = [NSMutableDictionary new]; + }); + return store; } -- (instancetype)init { - if (self = [super init]) { - _configValues = [NSMutableDictionary new]; - } - return self; -} + +@implementation RCTNativeConfig - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params @@ -24,20 +24,42 @@ - (instancetype)init { - (void)setConfig:(NSString *)key value:(NSString *)value { - _configValues[key] = value; + [RCTNativeConfig setConfig:value forKey:key]; } - (void)setImage:(NSString *)key uri:(NSString *)uri { - _configValues[key] = uri; + [RCTNativeConfig setConfig:uri forKey:key]; } - (NSString *)getConfig:(NSString *)key { - return _configValues[key]; + return [RCTNativeConfig getConfigForKey:key]; } - (UIImage *)getImage:(NSString *)key { - NSString *imagePath = _configValues[key]; + return [RCTNativeConfig getImageForKey:key]; +} + ++ (NSString *)getConfigForKey:(NSString *)key { + if (!key) return nil; + @synchronized (NativeConfigStore()) { + return NativeConfigStore()[key]; + } +} + ++ (void)setConfig:(nullable NSString *)value forKey:(NSString *)key { + if (!key) return; + @synchronized (NativeConfigStore()) { + if (value) { + NativeConfigStore()[key] = value; + } else { + [NativeConfigStore() removeObjectForKey:key]; + } + } +} + ++ (UIImage *)getImageForKey:(NSString *)key { + NSString *imagePath = [RCTNativeConfig getConfigForKey:key]; if (!imagePath) return nil; NSURL *url = [NSURL URLWithString:imagePath]; From 98f6382d9c90458a4ac9cab5835f7be91815855b Mon Sep 17 00:00:00 2001 From: joe goodall Date: Thu, 18 Jun 2026 16:50:39 +0100 Subject: [PATCH 2/8] update Config.swift --- ios/Config.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Config.swift b/ios/Config.swift index 3b96072..ce97ba4 100644 --- a/ios/Config.swift +++ b/ios/Config.swift @@ -7,18 +7,18 @@ final class Config: NSObject { static let shared = Config() func get(for key: String) -> String { - return RCTNativeConfig.getConfig(forKey: key) ?? "" + return RCTNativeConfig.getForKey(key) ?? "" } - + func set(for key: String, value: String) { RCTNativeConfig.setConfig(value, forKey: key) } - + func optionalString(for key: String) -> String? { - return RCTNativeConfig.getConfig(forKey: key) + return RCTNativeConfig.getForKey(key) } - + func getImage(for key: String) -> UIImage? { - return RCTNativeConfig.getImage(forKey: key) + return RCTNativeConfig.getImageForKey(key) } } From 3bd855584158e53e979b5f4cd553d3d48bd58387 Mon Sep 17 00:00:00 2001 From: joe goodall Date: Thu, 18 Jun 2026 20:19:27 +0100 Subject: [PATCH 3/8] fix: add static getConfig/getImage class methods to RCTNativeConfig for Swift compatibility --- ios/RCTNativeConfig.h | 2 ++ ios/RCTNativeConfig.mm | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/ios/RCTNativeConfig.h b/ios/RCTNativeConfig.h index 7408bca..45fca2d 100644 --- a/ios/RCTNativeConfig.h +++ b/ios/RCTNativeConfig.h @@ -12,6 +12,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)setConfig:(NSString *)key value:(NSString *)value; - (void)setImage:(NSString *)key uri:(NSString *)uri; ++ (nullable NSString *)getConfig:(NSString *)key; ++ (nullable UIImage *)getImage:(NSString *)key; + (nullable NSString *)getConfigForKey:(NSString *)key; + (void)setConfig:(nullable NSString *)value forKey:(NSString *)key; + (nullable UIImage *)getImageForKey:(NSString *)key; diff --git a/ios/RCTNativeConfig.mm b/ios/RCTNativeConfig.mm index d8f95fb..004cfc9 100644 --- a/ios/RCTNativeConfig.mm +++ b/ios/RCTNativeConfig.mm @@ -40,6 +40,14 @@ - (UIImage *)getImage:(NSString *)key { return [RCTNativeConfig getImageForKey:key]; } ++ (NSString *)getConfig:(NSString *)key { + return [RCTNativeConfig getConfigForKey:key]; +} + ++ (UIImage *)getImage:(NSString *)key { + return [RCTNativeConfig getImageForKey:key]; +} + + (NSString *)getConfigForKey:(NSString *)key { if (!key) return nil; @synchronized (NativeConfigStore()) { From c7b1c018c2f9834985ee8873d0ac90524ecc4bea Mon Sep 17 00:00:00 2001 From: joe goodall Date: Thu, 18 Jun 2026 20:43:56 +0100 Subject: [PATCH 4/8] fix: use RCTNativeConfig class getters in Config.swift and remove duplicate getter API --- ios/Config.swift | 6 +++--- ios/RCTNativeConfig.h | 2 -- ios/RCTNativeConfig.mm | 16 ++++------------ 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/ios/Config.swift b/ios/Config.swift index ce97ba4..4f1f615 100644 --- a/ios/Config.swift +++ b/ios/Config.swift @@ -7,7 +7,7 @@ final class Config: NSObject { static let shared = Config() func get(for key: String) -> String { - return RCTNativeConfig.getForKey(key) ?? "" + return RCTNativeConfig.getConfig(key) ?? "" } func set(for key: String, value: String) { @@ -15,10 +15,10 @@ final class Config: NSObject { } func optionalString(for key: String) -> String? { - return RCTNativeConfig.getForKey(key) + return RCTNativeConfig.getConfig(key) } func getImage(for key: String) -> UIImage? { - return RCTNativeConfig.getImageForKey(key) + return RCTNativeConfig.getImage(key) } } diff --git a/ios/RCTNativeConfig.h b/ios/RCTNativeConfig.h index 45fca2d..f2ac10e 100644 --- a/ios/RCTNativeConfig.h +++ b/ios/RCTNativeConfig.h @@ -14,9 +14,7 @@ NS_ASSUME_NONNULL_BEGIN + (nullable NSString *)getConfig:(NSString *)key; + (nullable UIImage *)getImage:(NSString *)key; -+ (nullable NSString *)getConfigForKey:(NSString *)key; + (void)setConfig:(nullable NSString *)value forKey:(NSString *)key; -+ (nullable UIImage *)getImageForKey:(NSString *)key; @end diff --git a/ios/RCTNativeConfig.mm b/ios/RCTNativeConfig.mm index 004cfc9..a3792af 100644 --- a/ios/RCTNativeConfig.mm +++ b/ios/RCTNativeConfig.mm @@ -33,22 +33,14 @@ - (void)setImage:(NSString *)key uri:(NSString *)uri { - (NSString *)getConfig:(NSString *)key { - return [RCTNativeConfig getConfigForKey:key]; + return [RCTNativeConfig getConfig:key]; } - (UIImage *)getImage:(NSString *)key { - return [RCTNativeConfig getImageForKey:key]; + return [RCTNativeConfig getImage:key]; } + (NSString *)getConfig:(NSString *)key { - return [RCTNativeConfig getConfigForKey:key]; -} - -+ (UIImage *)getImage:(NSString *)key { - return [RCTNativeConfig getImageForKey:key]; -} - -+ (NSString *)getConfigForKey:(NSString *)key { if (!key) return nil; @synchronized (NativeConfigStore()) { return NativeConfigStore()[key]; @@ -66,8 +58,8 @@ + (void)setConfig:(nullable NSString *)value forKey:(NSString *)key { } } -+ (UIImage *)getImageForKey:(NSString *)key { - NSString *imagePath = [RCTNativeConfig getConfigForKey:key]; ++ (UIImage *)getImage:(NSString *)key { + NSString *imagePath = [RCTNativeConfig getConfig:key]; if (!imagePath) return nil; NSURL *url = [NSURL URLWithString:imagePath]; From 895247cc1522ce05b9322ef3d5b4413083eb83a1 Mon Sep 17 00:00:00 2001 From: joe goodall Date: Fri, 19 Jun 2026 09:38:50 +0100 Subject: [PATCH 5/8] remove unused code --- ios/RCTNativeConfig.h | 2 -- ios/RCTNativeConfig.mm | 8 -------- 2 files changed, 10 deletions(-) diff --git a/ios/RCTNativeConfig.h b/ios/RCTNativeConfig.h index f2ac10e..fb4627b 100644 --- a/ios/RCTNativeConfig.h +++ b/ios/RCTNativeConfig.h @@ -7,8 +7,6 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTNativeConfig : NSObject -- (NSString *)getConfig:(NSString *)key; -- (UIImage *)getImage:(NSString *)key; - (void)setConfig:(NSString *)key value:(NSString *)value; - (void)setImage:(NSString *)key uri:(NSString *)uri; diff --git a/ios/RCTNativeConfig.mm b/ios/RCTNativeConfig.mm index a3792af..95ba9f6 100644 --- a/ios/RCTNativeConfig.mm +++ b/ios/RCTNativeConfig.mm @@ -32,14 +32,6 @@ - (void)setImage:(NSString *)key uri:(NSString *)uri { } -- (NSString *)getConfig:(NSString *)key { - return [RCTNativeConfig getConfig:key]; -} - -- (UIImage *)getImage:(NSString *)key { - return [RCTNativeConfig getImage:key]; -} - + (NSString *)getConfig:(NSString *)key { if (!key) return nil; @synchronized (NativeConfigStore()) { From 127cc88b48bc7b23fc175f00501c8b01c10c4202 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 19 Jun 2026 10:49:53 +0100 Subject: [PATCH 6/8] refactor: updates to a singleton approach to avoid duplicate signatures --- ios/Config.swift | 13 ++++---- ios/RCTNativeConfig.h | 8 ++--- ios/RCTNativeConfig.mm | 71 ++++++++++++++++++++++++------------------ 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/ios/Config.swift b/ios/Config.swift index 4f1f615..135354d 100644 --- a/ios/Config.swift +++ b/ios/Config.swift @@ -1,24 +1,23 @@ import Foundation -import React @objc final class Config: NSObject { - + static let shared = Config() - + func get(for key: String) -> String { - return RCTNativeConfig.getConfig(key) ?? "" + return RCTNativeConfig.sharedInstance()?.getConfig(key) ?? "" } func set(for key: String, value: String) { - RCTNativeConfig.setConfig(value, forKey: key) + RCTNativeConfig.sharedInstance()?.setConfig(key, value: value) } func optionalString(for key: String) -> String? { - return RCTNativeConfig.getConfig(key) + return RCTNativeConfig.sharedInstance()?.getConfig(key) } func getImage(for key: String) -> UIImage? { - return RCTNativeConfig.getImage(key) + return RCTNativeConfig.sharedInstance()?.getImage(key) } } diff --git a/ios/RCTNativeConfig.h b/ios/RCTNativeConfig.h index fb4627b..2924d04 100644 --- a/ios/RCTNativeConfig.h +++ b/ios/RCTNativeConfig.h @@ -7,13 +7,13 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTNativeConfig : NSObject ++ (nullable instancetype)sharedInstance; + +- (NSString *)getConfig:(NSString *)key; +- (UIImage *)getImage:(NSString *)key; - (void)setConfig:(NSString *)key value:(NSString *)value; - (void)setImage:(NSString *)key uri:(NSString *)uri; -+ (nullable NSString *)getConfig:(NSString *)key; -+ (nullable UIImage *)getImage:(NSString *)key; -+ (void)setConfig:(nullable NSString *)value forKey:(NSString *)key; - @end NS_ASSUME_NONNULL_END diff --git a/ios/RCTNativeConfig.mm b/ios/RCTNativeConfig.mm index 95ba9f6..dfdba2e 100644 --- a/ios/RCTNativeConfig.mm +++ b/ios/RCTNativeConfig.mm @@ -4,54 +4,64 @@ #import #import -static NSMutableDictionary *NativeConfigStore(void) { - static NSMutableDictionary *store = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - store = [NSMutableDictionary new]; - }); - return store; +static RCTNativeConfig *_sharedInstance = nil; + +@implementation RCTNativeConfig { + NSMutableDictionary *_store; } +- (instancetype)init { + if (self = [super init]) { + _store = [NSMutableDictionary new]; + _sharedInstance = self; + } + return self; +} -@implementation RCTNativeConfig ++ (nullable instancetype)sharedInstance { + return _sharedInstance; +} - (std::shared_ptr)getTurboModule: -(const facebook::react::ObjCTurboModule::InitParams &)params + (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared(params); } - - (void)setConfig:(NSString *)key value:(NSString *)value { - [RCTNativeConfig setConfig:value forKey:key]; + if (!key) return; + @synchronized (_store) { + if (value) { + _store[key] = value; + } else { + [_store removeObjectForKey:key]; + } + } } - (void)setImage:(NSString *)key uri:(NSString *)uri { - [RCTNativeConfig setConfig:uri forKey:key]; + if (!key) return; + @synchronized (_store) { + if (uri) { + _store[key] = uri; + } else { + [_store removeObjectForKey:key]; + } + } } - -+ (NSString *)getConfig:(NSString *)key { +- (NSString *)getConfig:(NSString *)key { if (!key) return nil; - @synchronized (NativeConfigStore()) { - return NativeConfigStore()[key]; + @synchronized (_store) { + return _store[key]; } } -+ (void)setConfig:(nullable NSString *)value forKey:(NSString *)key { - if (!key) return; - @synchronized (NativeConfigStore()) { - if (value) { - NativeConfigStore()[key] = value; - } else { - [NativeConfigStore() removeObjectForKey:key]; - } +- (UIImage *)getImage:(NSString *)key { + NSString *imagePath; + @synchronized (_store) { + imagePath = _store[key]; } -} - -+ (UIImage *)getImage:(NSString *)key { - NSString *imagePath = [RCTNativeConfig getConfig:key]; if (!imagePath) return nil; NSURL *url = [NSURL URLWithString:imagePath]; @@ -63,9 +73,8 @@ + (UIImage *)getImage:(NSString *)key { return [UIImage imageWithContentsOfFile:imagePath]; } -+ (NSString *)moduleName -{ ++ (NSString *)moduleName { return @"NativeConfig"; } -@end \ No newline at end of file +@end From 67b6fd80d03a08673fa5b4747e256ee860bd7c33 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 19 Jun 2026 11:09:54 +0100 Subject: [PATCH 7/8] chore: add comment --- android/src/main/java/com/ticketmasterignite/Config.kt | 1 + ios/Config.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/android/src/main/java/com/ticketmasterignite/Config.kt b/android/src/main/java/com/ticketmasterignite/Config.kt index aea1724..1d9f75e 100644 --- a/android/src/main/java/com/ticketmasterignite/Config.kt +++ b/android/src/main/java/com/ticketmasterignite/Config.kt @@ -14,6 +14,7 @@ object Config { } } + // We want to return null to the SDK's Prebuilt Modules if no image overlay text is provided to enable the SDK's default text fun optionalString(key: String): String? { return configValues[key] } diff --git a/ios/Config.swift b/ios/Config.swift index 135354d..0f11e12 100644 --- a/ios/Config.swift +++ b/ios/Config.swift @@ -13,6 +13,7 @@ final class Config: NSObject { RCTNativeConfig.sharedInstance()?.setConfig(key, value: value) } + // We want to return null to the SDK's Prebuilt Modules if no image overlay text is provided to enable the SDK's default text func optionalString(for key: String) -> String? { return RCTNativeConfig.sharedInstance()?.getConfig(key) } From 6a82f6211ea398312cfe7e0e7f19e32b2e2daa1f Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 19 Jun 2026 11:23:47 +0100 Subject: [PATCH 8/8] fix: read marketDomain at call time to prevent stale value --- ios/MarketDomain.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ios/MarketDomain.swift b/ios/MarketDomain.swift index 06abe8d..0ccb69d 100644 --- a/ios/MarketDomain.swift +++ b/ios/MarketDomain.swift @@ -2,10 +2,9 @@ import TicketmasterFoundation class MarketDomainObject { static let shared = MarketDomainObject() - - let marketDomain = Config.shared.get(for: "marketDomain") - + func getMarketDomain() -> TicketmasterFoundation.MarketDomain { + let marketDomain = Config.shared.get(for: "marketDomain") return MarketDomain(countryCode: marketDomain.lowercased()) ?? MarketDomain.US } }