Skip to content

Commit a971038

Browse files
committed
Added RemoteConfig API
1 parent e214b6d commit a971038

File tree

5 files changed

+135
-23
lines changed

5 files changed

+135
-23
lines changed

ios/Firestack.xcodeproj/project.pbxproj

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
544B47041DDE64610057E78B /* FirestackRemoteConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 544B47031DDE64610057E78B /* FirestackRemoteConfig.m */; };
1011
D90882D61D89C18C00FB6742 /* FirestackCloudMessaging.m in Sources */ = {isa = PBXBuildFile; fileRef = D90882D51D89C18C00FB6742 /* FirestackCloudMessaging.m */; };
1112
D950369E1D19C77400F7094D /* Firestack.m in Sources */ = {isa = PBXBuildFile; fileRef = D950369D1D19C77400F7094D /* Firestack.m */; };
1213
D962903F1D6D15B00099A3EC /* FirestackErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = D962903E1D6D15B00099A3EC /* FirestackErrors.m */; };
@@ -30,6 +31,8 @@
3031

3132
/* Begin PBXFileReference section */
3233
134814201AA4EA6300B7C361 /* libFirestack.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFirestack.a; sourceTree = BUILT_PRODUCTS_DIR; };
34+
544B47031DDE64610057E78B /* FirestackRemoteConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirestackRemoteConfig.m; path = Firestack/FirestackRemoteConfig.m; sourceTree = "<group>"; };
35+
544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackRemoteConfig.h; path = Firestack/FirestackRemoteConfig.h; sourceTree = "<group>"; };
3336
D90882D41D89C18C00FB6742 /* FirestackCloudMessaging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirestackCloudMessaging.h; path = Firestack/FirestackCloudMessaging.h; sourceTree = "<group>"; };
3437
D90882D51D89C18C00FB6742 /* FirestackCloudMessaging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirestackCloudMessaging.m; path = Firestack/FirestackCloudMessaging.m; sourceTree = "<group>"; };
3538
D950369C1D19C77400F7094D /* Firestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Firestack.h; path = Firestack/Firestack.h; sourceTree = "<group>"; };
@@ -92,6 +95,8 @@
9295
D96290841D6D28B80099A3EC /* FirestackDatabase.m */,
9396
D9D62E7A1D6D86FD003D826D /* FirestackStorage.h */,
9497
D9D62E7B1D6D86FD003D826D /* FirestackStorage.m */,
98+
544B47031DDE64610057E78B /* FirestackRemoteConfig.m */,
99+
544B47051DDE647E0057E78B /* FirestackRemoteConfig.h */,
95100
);
96101
name = Modules;
97102
sourceTree = "<group>";
@@ -158,6 +163,7 @@
158163
D962903F1D6D15B00099A3EC /* FirestackErrors.m in Sources */,
159164
D950369E1D19C77400F7094D /* Firestack.m in Sources */,
160165
D90882D61D89C18C00FB6742 /* FirestackCloudMessaging.m in Sources */,
166+
544B47041DDE64610057E78B /* FirestackRemoteConfig.m in Sources */,
161167
D96290851D6D28B80099A3EC /* FirestackDatabase.m in Sources */,
162168
);
163169
runOnlyForDeploymentPostprocessing = 0;

ios/Firestack/FirestackRemoteConfig.h

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// FirestackRemoteConfig.h
3+
// Firestack
4+
//
5+
// Created by Jean Silva on 11/17/16.
6+
// Copyright © 2016 Facebook. All rights reserved.
7+
//
8+
9+
#ifndef FirestackRemoteConfig_h
10+
#define FirestackRemoteConfig_h
11+
12+
#import "Firebase.h"
13+
#import "RCTBridgeModule.h"
14+
#import "RCTEventEmitter.h"
15+
16+
@interface FirestackRemoteConfig : RCTEventEmitter <RCTBridgeModule> {
17+
18+
}
19+
20+
@property (nonatomic, strong) FIRRemoteConfig *remoteConfigInstance;
21+
22+
@end
23+
24+
#endif /* FirestackRemoteConfig_h */

ios/Firestack/FirestackRemoteConfig.m

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
//
2+
// FirestackRemoteConfig.m
3+
// Firestack
4+
//
5+
// Created by Jean Silva on 11/17/16.
6+
// Copyright © 2016 Facebook. All rights reserved.
7+
//
8+
9+
#import "FirestackRemoteConfig.h"
10+
11+
@implementation FirestackRemoteConfig
12+
13+
RCT_EXPORT_MODULE(FirestackRemoteConfig);
14+
15+
16+
RCT_EXPORT_METHOD(setDefaultRemoteConfig:(NSDictionary *)props
17+
isDev:(BOOL) devMode
18+
callback:(RCTResponseSenderBlock) callback)
19+
{
20+
if (!self.remoteConfigInstance) {
21+
// Create remote Config instance
22+
self.remoteConfigInstance = [FIRRemoteConfig remoteConfig];
23+
}
24+
FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] initWithDeveloperModeEnabled:devMode];
25+
26+
self.remoteConfigInstance.configSettings = remoteConfigSettings;
27+
[self.remoteConfigInstance setDefaults: props];
28+
callback(@[[NSNull null], props]);
29+
}
30+
31+
RCT_EXPORT_METHOD(configValueForKey:(NSString *)name
32+
callback:(RCTResponseSenderBlock) callback)
33+
{
34+
if (!self.remoteConfigInstance) {
35+
NSDictionary *err = @{
36+
@"error": @"No configuration instance",
37+
@"msg": @"No configuration instance set. Please call setDefaultRemoteConfig before using this feature"
38+
};
39+
callback(@[err]);
40+
}
41+
42+
43+
FIRRemoteConfigValue *value = [self.remoteConfigInstance configValueForKey:name];
44+
NSString *valueStr = value.stringValue;
45+
46+
if (valueStr == nil) {
47+
valueStr = @"";
48+
}
49+
callback(@[[NSNull null], valueStr]);
50+
}
51+
52+
RCT_EXPORT_METHOD(fetchWithExpiration:(nonnull NSNumber*)expirationSeconds
53+
callback:(RCTResponseSenderBlock) callback)
54+
{
55+
if (!self.remoteConfigInstance) {
56+
NSDictionary *err = @{
57+
@"error": @"No configuration instance",
58+
@"msg": @"No configuration instance set. Please call setDefaultRemoteConfig before using this feature"
59+
};
60+
callback(@[err]);
61+
}
62+
63+
NSTimeInterval expirationDuration = [expirationSeconds doubleValue];
64+
65+
[self.remoteConfigInstance fetchWithExpirationDuration:expirationDuration completionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
66+
if (status == FIRRemoteConfigFetchStatusSuccess) {
67+
NSLog(@"Config fetched!");
68+
[self.remoteConfigInstance activateFetched];
69+
callback(@[[NSNull null], @(YES)]);
70+
} else {
71+
NSLog(@"Error %@", error.localizedDescription);
72+
73+
NSDictionary *err = @{
74+
@"error": @"No configuration instance",
75+
@"msg": [error localizedDescription]
76+
};
77+
78+
callback(@[err]);
79+
}
80+
}];
81+
}
82+
83+
- (NSArray<NSString *> *)supportedEvents {
84+
return @[];
85+
}
86+
87+
@end

lib/firestack.js

+6-10
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const FirestackModuleEvt = new NativeEventEmitter(FirestackModule);
1919
import promisify from './utils/promisify'
2020
import Singleton from './utils/singleton'
2121

22-
import RemoteConfig from './modules/remoteConfig'
22+
import {RemoteConfig} from './modules/remoteConfig'
2323
import {Authentication} from './modules/authentication'
2424
import {Database} from './modules/database'
2525
import {Analytics} from './modules/analytics'
@@ -41,8 +41,8 @@ export class Firestack extends Singleton {
4141

4242
log.info('Creating new firestack instance');
4343

44-
instance._remoteConfig = instance.options.remoteConfig || {};
45-
delete instance.options.remoteConfig;
44+
this._remoteConfigOpts = instance._remoteConfigOpts = instance.options.defaultConfig || {};
45+
delete instance.options.defaultConfig;
4646

4747
instance.configured = instance.options.configure || false;
4848
instance.auth = null;
@@ -122,14 +122,10 @@ export class Firestack extends Singleton {
122122
return promisify('serverValue', FirestackModule)();
123123
}
124124

125-
/**
126-
* remote config
127-
*/
125+
// RemoteConfig
128126
get remoteConfig() {
129-
if (!this.remoteConfig) {
130-
this.remoteConfig = new RemoteConfig(this._remoteConfig);
131-
}
132-
return this.remoteConfig;
127+
if (!this._remoteConfig) { this._remoteConfig = new RemoteConfig(this._remoteConfigOpts);}
128+
return this._remoteConfig;
133129
}
134130

135131
/**

lib/modules/remoteConfig.js

+12-13
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,29 @@
1+
import {NativeModules, NativeAppEventEmitter} from 'react-native';
2+
const FirestackRemoteConfig = NativeModules.FirestackRemoteConfig;
3+
4+
import promisify from '../utils/promisify';
15
/**
26
* Configuration class
37
*/
48
const defaultExpiration = 60 * 60 * 24; // one day
59
export class RemoteConfig {
6-
constructor(options) {
7-
this.config = options || {};
8-
9-
this.setDefaultRemoteConfig(options)
10+
constructor(defaultConfig) {
11+
this.defaultConfig = defaultConfig || {};
12+
this.setDefaultRemoteConfig(defaultConfig, process.env.NODE_ENV === 'development')
1013
.then(() => this.configured = true);
1114
}
1215

13-
setDefaultRemoteConfig(options) {
14-
return promisify('setDefaultRemoteConfig')(options);
16+
setDefaultRemoteConfig(options, devMode=false) {
17+
return promisify('setDefaultRemoteConfig', FirestackRemoteConfig)(options, devMode)
1518
}
1619

1720
fetchWithExpiration(expirationSeconds=defaultExpiration) {
18-
return promisify('fetchWithExpiration')(expirationSeconds)
21+
return promisify('fetchWithExpiration', FirestackRemoteConfig)(expirationSeconds)
1922
}
2023

2124
config(name) {
22-
return promisify('configValueForKey')(name);
23-
}
24-
25-
setDev() {
26-
return promisify('setDev')();
25+
return promisify('configValueForKey', FirestackRemoteConfig)(name);
2726
}
2827
}
2928

30-
export default RemoteConfig;
29+
export default RemoteConfig;

0 commit comments

Comments
 (0)