#import "RNFirebaseRemoteConfig.h" #if __has_include() #import #else // Compatibility for RN version < 0.40 #import "RCTConvert.h" #endif #if __has_include() #import #else // Compatibility for RN version < 0.40 #import "RCTUtils.h" #endif #import "FirebaseRemoteConfig/FirebaseRemoteConfig.h" NSString *convertFIRRemoteConfigFetchStatusToNSString(FIRRemoteConfigFetchStatus value) { switch(value){ case FIRRemoteConfigFetchStatusNoFetchYet: return @"config/no_fetch_yet"; case FIRRemoteConfigFetchStatusFailure: return @"config/failure"; case FIRRemoteConfigFetchStatusThrottled: return @"config/throttled"; default: return @"config/failure"; } } NSString *convertFIRRemoteConfigSourceToNSString(FIRRemoteConfigSource value) { switch(value) { case FIRRemoteConfigSourceDefault: return @"default"; case FIRRemoteConfigSourceRemote: return @"remote"; default: return @"static"; } } NSDictionary *convertFIRRemoteConfigValueToNSDictionary(FIRRemoteConfigValue *value) { return @{ @"stringValue" : value.stringValue ?: [NSNull null], @"numberValue" : value.numberValue ?: [NSNull null], @"dataValue" : value.dataValue ? [value.dataValue base64EncodedStringWithOptions:0] : [NSNull null], @"boolValue" : @(value.boolValue), @"source" : convertFIRRemoteConfigSourceToNSString(value.source) }; } @interface RNFirebaseRemoteConfig () @property (nonatomic, readwrite, weak) FIRRemoteConfig *remoteConfig; @end @implementation RNFirebaseRemoteConfig RCT_EXPORT_MODULE(RNFirebaseRemoteConfig); - (id)init { if (self = [super init]) { _remoteConfig = [FIRRemoteConfig remoteConfig]; } return self; } RCT_EXPORT_METHOD(enableDeveloperMode) { FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:YES]; self.remoteConfig.configSettings = remoteConfigSettings; } RCT_EXPORT_METHOD(fetch:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { [self.remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *__nullable error) { if (error) { RCTLogError(@"\nError: %@", RCTJSErrorFromNSError(error)); reject(convertFIRRemoteConfigFetchStatusToNSString(status), error.localizedDescription, error); } else { resolve(convertFIRRemoteConfigFetchStatusToNSString(status)); } }]; } RCT_EXPORT_METHOD(fetchWithExpirationDuration:(nonnull NSNumber *)expirationDuration resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { [self.remoteConfig fetchWithExpirationDuration:expirationDuration.doubleValue completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *__nullable error) { if (error) { RCTLogError(@"\nError: %@", RCTJSErrorFromNSError(error)); reject(convertFIRRemoteConfigFetchStatusToNSString(status), error.localizedDescription, error); } else { resolve(convertFIRRemoteConfigFetchStatusToNSString(status)); } }]; } RCT_EXPORT_METHOD(activateFetched:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { BOOL status = [self.remoteConfig activateFetched]; resolve(@(status)); } RCT_EXPORT_METHOD(getValue:(NSString *)key resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { FIRRemoteConfigValue *value = [self.remoteConfig configValueForKey:key]; resolve(convertFIRRemoteConfigValueToNSDictionary(value)); } RCT_EXPORT_METHOD(getValues:(NSArray *)keys resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { NSMutableArray *valuesArray = [[NSMutableArray alloc] init]; for (NSString *key in keys) { FIRRemoteConfigValue *value = [self.remoteConfig configValueForKey:key]; [valuesArray addObject:convertFIRRemoteConfigValueToNSDictionary(value)]; } resolve(valuesArray); } RCT_EXPORT_METHOD(getKeysByPrefix:(NSString *)prefix resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { NSSet *keys = [self.remoteConfig keysWithPrefix:prefix]; NSMutableArray *keysArray = [[NSMutableArray alloc] init]; for (NSString *key in keys) { [keysArray addObject:key]; } resolve(keysArray); } RCT_EXPORT_METHOD(setDefaults:(NSDictionary *)defaults) { [self.remoteConfig setDefaults:defaults]; } RCT_EXPORT_METHOD(setDefaultsFromResource:(NSString *)fileName) { [self.remoteConfig setDefaultsFromPlistFileName:fileName]; } @end