Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added RemoteConfig API #145

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions ios/Firestack.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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 */; };
Expand All @@ -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 = "<group>"; };
544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackRemoteConfig.h; path = Firestack/FirestackRemoteConfig.h; sourceTree = "<group>"; };
D90882D41D89C18C00FB6742 /* FirestackCloudMessaging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackCloudMessaging.h; path = Firestack/FirestackCloudMessaging.h; sourceTree = "<group>"; };
D90882D51D89C18C00FB6742 /* FirestackCloudMessaging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirestackCloudMessaging.m; path = Firestack/FirestackCloudMessaging.m; sourceTree = "<group>"; };
D950369C1D19C77400F7094D /* Firestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Firestack.h; path = Firestack/Firestack.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -92,6 +95,8 @@
D96290841D6D28B80099A3EC /* FirestackDatabase.m */,
D9D62E7A1D6D86FD003D826D /* FirestackStorage.h */,
D9D62E7B1D6D86FD003D826D /* FirestackStorage.m */,
544B47031DDE64610057E78B /* FirestackRemoteConfig.m */,
544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */,
);
name = Modules;
sourceTree = "<group>";
Expand Down Expand Up @@ -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;
Expand Down
24 changes: 24 additions & 0 deletions ios/Firestack/FirestackRemoteConfig.h
Original file line number Diff line number Diff line change
@@ -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 <RCTBridgeModule> {

}

@property (nonatomic, strong) FIRRemoteConfig *remoteConfigInstance;

@end

#endif /* FirestackRemoteConfig_h */
87 changes: 87 additions & 0 deletions ios/Firestack/FirestackRemoteConfig.m
Original file line number Diff line number Diff line change
@@ -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<NSString *> *)supportedEvents {
return @[];
}

@end
16 changes: 6 additions & 10 deletions lib/firestack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}

/**
Expand Down
25 changes: 12 additions & 13 deletions lib/modules/remoteConfig.js
Original file line number Diff line number Diff line change
@@ -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;
export default RemoteConfig;