diff --git a/ios/Firestack.xcodeproj/project.pbxproj b/ios/Firestack.xcodeproj/project.pbxproj index ba05903..b35d12f 100644 --- a/ios/Firestack.xcodeproj/project.pbxproj +++ b/ios/Firestack.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 544B47041DDE64610057E78B /* FirestackRemoteConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B47031DDE64610057E78B /* FirestackRemoteConfig.m */; }; D90882D61D89C18C00FB6742 /* FirestackCloudMessaging.m in Sources */ = {isa = PBXBuildFile; fileRef = D90882D51D89C18C00FB6742 /* FirestackCloudMessaging.m */; }; D950369E1D19C77400F7094D /* Firestack.m in Sources */ = {isa = PBXBuildFile; fileRef = D950369D1D19C77400F7094D /* Firestack.m */; }; D962903F1D6D15B00099A3EC /* FirestackErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = D962903E1D6D15B00099A3EC /* FirestackErrors.m */; }; @@ -30,6 +31,8 @@ /* Begin PBXFileReference section */ 134814201AA4EA6300B7C361 /* libFirestack.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFirestack.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 544B47031DDE64610057E78B /* FirestackRemoteConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirestackRemoteConfig.m; path = Firestack/FirestackRemoteConfig.m; sourceTree = ""; }; + 544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackRemoteConfig.h; path = Firestack/FirestackRemoteConfig.h; sourceTree = ""; }; D90882D41D89C18C00FB6742 /* FirestackCloudMessaging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackCloudMessaging.h; path = Firestack/FirestackCloudMessaging.h; sourceTree = ""; }; D90882D51D89C18C00FB6742 /* FirestackCloudMessaging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirestackCloudMessaging.m; path = Firestack/FirestackCloudMessaging.m; sourceTree = ""; }; D950369C1D19C77400F7094D /* Firestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Firestack.h; path = Firestack/Firestack.h; sourceTree = ""; }; @@ -92,6 +95,8 @@ D96290841D6D28B80099A3EC /* FirestackDatabase.m */, D9D62E7A1D6D86FD003D826D /* FirestackStorage.h */, D9D62E7B1D6D86FD003D826D /* FirestackStorage.m */, + 544B47031DDE64610057E78B /* FirestackRemoteConfig.m */, + 544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */, ); name = Modules; sourceTree = ""; @@ -158,6 +163,7 @@ D962903F1D6D15B00099A3EC /* FirestackErrors.m in Sources */, D950369E1D19C77400F7094D /* Firestack.m in Sources */, D90882D61D89C18C00FB6742 /* FirestackCloudMessaging.m in Sources */, + 544B47041DDE64610057E78B /* FirestackRemoteConfig.m in Sources */, D96290851D6D28B80099A3EC /* FirestackDatabase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/Firestack/FirestackRemoteConfig.h b/ios/Firestack/FirestackRemoteConfig.h new file mode 100644 index 0000000..ae59163 --- /dev/null +++ b/ios/Firestack/FirestackRemoteConfig.h @@ -0,0 +1,24 @@ +// +// FirestackRemoteConfig.h +// Firestack +// +// Created by Jean Silva on 11/17/16. +// Copyright © 2016 Facebook. All rights reserved. +// + +#ifndef FirestackRemoteConfig_h +#define FirestackRemoteConfig_h + +#import "Firebase.h" +#import "RCTBridgeModule.h" +#import "RCTEventEmitter.h" + +@interface FirestackRemoteConfig : RCTEventEmitter { + +} + +@property (nonatomic, strong) FIRRemoteConfig *remoteConfigInstance; + +@end + +#endif /* FirestackRemoteConfig_h */ diff --git a/ios/Firestack/FirestackRemoteConfig.m b/ios/Firestack/FirestackRemoteConfig.m new file mode 100644 index 0000000..df86a2d --- /dev/null +++ b/ios/Firestack/FirestackRemoteConfig.m @@ -0,0 +1,87 @@ +// +// FirestackRemoteConfig.m +// Firestack +// +// Created by Jean Silva on 11/17/16. +// Copyright © 2016 Facebook. All rights reserved. +// + +#import "FirestackRemoteConfig.h" + +@implementation FirestackRemoteConfig + +RCT_EXPORT_MODULE(FirestackRemoteConfig); + + +RCT_EXPORT_METHOD(setDefaultRemoteConfig:(NSDictionary *)props + isDev:(BOOL) devMode + callback:(RCTResponseSenderBlock) callback) +{ + if (!self.remoteConfigInstance) { + // Create remote Config instance + self.remoteConfigInstance = [FIRRemoteConfig remoteConfig]; + } + FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:devMode]; + + self.remoteConfigInstance.configSettings = remoteConfigSettings; + [self.remoteConfigInstance setDefaults: props]; + callback(@[[NSNull null], props]); +} + +RCT_EXPORT_METHOD(configValueForKey:(NSString *)name + callback:(RCTResponseSenderBlock) callback) +{ + if (!self.remoteConfigInstance) { + NSDictionary *err = @{ + @"error": @"No configuration instance", + @"msg": @"No configuration instance set. Please call setDefaultRemoteConfig before using this feature" + }; + callback(@[err]); + } + + + FIRRemoteConfigValue *value = [self.remoteConfigInstance configValueForKey:name]; + NSString *valueStr = value.stringValue; + + if (valueStr == nil) { + valueStr = @""; + } + callback(@[[NSNull null], valueStr]); +} + +RCT_EXPORT_METHOD(fetchWithExpiration:(nonnull NSNumber*)expirationSeconds + callback:(RCTResponseSenderBlock) callback) +{ + if (!self.remoteConfigInstance) { + NSDictionary *err = @{ + @"error": @"No configuration instance", + @"msg": @"No configuration instance set. Please call setDefaultRemoteConfig before using this feature" + }; + callback(@[err]); + } + + NSTimeInterval expirationDuration = [expirationSeconds doubleValue]; + + [self.remoteConfigInstance fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) { + if (status == FIRRemoteConfigFetchStatusSuccess) { + NSLog(@"Config fetched!"); + [self.remoteConfigInstance activateFetched]; + callback(@[[NSNull null], @(YES)]); + } else { + NSLog(@"Error %@", error.localizedDescription); + + NSDictionary *err = @{ + @"error": @"No configuration instance", + @"msg": [error localizedDescription] + }; + + callback(@[err]); + } + }]; +} + +- (NSArray *)supportedEvents { + return @[]; +} + +@end diff --git a/lib/firestack.js b/lib/firestack.js index 8bcbbfa..64426a0 100644 --- a/lib/firestack.js +++ b/lib/firestack.js @@ -19,7 +19,7 @@ const FirestackModuleEvt = new NativeEventEmitter(FirestackModule); import promisify from './utils/promisify' import Singleton from './utils/singleton' -import RemoteConfig from './modules/remoteConfig' +import {RemoteConfig} from './modules/remoteConfig' import {Authentication} from './modules/authentication' import {Database} from './modules/database' import {Analytics} from './modules/analytics' @@ -41,8 +41,8 @@ export class Firestack extends Singleton { log.info('Creating new firestack instance'); - instance._remoteConfig = instance.options.remoteConfig || {}; - delete instance.options.remoteConfig; + this._remoteConfigOpts = instance._remoteConfigOpts = instance.options.defaultConfig || {}; + delete instance.options.defaultConfig; instance.configured = instance.options.configure || false; instance.auth = null; @@ -122,14 +122,10 @@ export class Firestack extends Singleton { return promisify('serverValue', FirestackModule)(); } - /** - * remote config - */ + // RemoteConfig get remoteConfig() { - if (!this.remoteConfig) { - this.remoteConfig = new RemoteConfig(this._remoteConfig); - } - return this.remoteConfig; + if (!this._remoteConfig) { this._remoteConfig = new RemoteConfig(this._remoteConfigOpts);} + return this._remoteConfig; } /** diff --git a/lib/modules/remoteConfig.js b/lib/modules/remoteConfig.js index 385caf5..0e6a0e4 100644 --- a/lib/modules/remoteConfig.js +++ b/lib/modules/remoteConfig.js @@ -1,30 +1,29 @@ +import {NativeModules, NativeAppEventEmitter} from 'react-native'; +const FirestackRemoteConfig = NativeModules.FirestackRemoteConfig; + +import promisify from '../utils/promisify'; /** * Configuration class */ const defaultExpiration = 60 * 60 * 24; // one day export class RemoteConfig { - constructor(options) { - this.config = options || {}; - - this.setDefaultRemoteConfig(options) + constructor(defaultConfig) { + this.defaultConfig = defaultConfig || {}; + this.setDefaultRemoteConfig(defaultConfig, process.env.NODE_ENV === 'development') .then(() => this.configured = true); } - setDefaultRemoteConfig(options) { - return promisify('setDefaultRemoteConfig')(options); + setDefaultRemoteConfig(options, devMode=false) { + return promisify('setDefaultRemoteConfig', FirestackRemoteConfig)(options, devMode) } fetchWithExpiration(expirationSeconds=defaultExpiration) { - return promisify('fetchWithExpiration')(expirationSeconds) + return promisify('fetchWithExpiration', FirestackRemoteConfig)(expirationSeconds) } config(name) { - return promisify('configValueForKey')(name); - } - - setDev() { - return promisify('setDev')(); + return promisify('configValueForKey', FirestackRemoteConfig)(name); } } -export default RemoteConfig; \ No newline at end of file +export default RemoteConfig; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy