Skip to content
Merged
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
4 changes: 2 additions & 2 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ repositories {
dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation 'com.amplitude:experiment-android-client:1.4.0'
implementation 'com.amplitude:android-sdk:2.26.1'
implementation 'com.amplitude:experiment-android-client:1.5.1'
implementation 'com.amplitude:android-sdk:2.36.1'
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,22 @@ public String getName() {
@ReactMethod
public void initialize(String apiKey, ReadableMap config, Promise promise) {
try {
ExperimentConfig convertedConfig = convertConfig(config);
experimentClient = Experiment.initialize(
(Application) this.reactContext.getApplicationContext(),
apiKey,
convertedConfig
);
ExperimentConfig convertedConfig = convertConfig(config, false);
experimentClient = Experiment.initialize((Application) this.reactContext.getApplicationContext(), apiKey,
convertedConfig);
promise.resolve(true);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
promise.reject(e);
}
}

@ReactMethod
public void initializeWithAmplitudeAnalytics(String apiKey, ReadableMap config, Promise promise) {
try {
ExperimentConfig convertedConfig = convertConfig(config, true);
experimentClient = Experiment.initializeWithAmplitudeAnalytics(
(Application) this.reactContext.getApplicationContext(), apiKey, convertedConfig);
promise.resolve(true);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
Expand Down Expand Up @@ -120,13 +130,22 @@ public void variant(String key, Promise promise) {
}

@ReactMethod
public void variantWithFallback(String flagKey, ReadableMap fallback,
Promise promise) {
public void exposure(String key, Promise promise) {
try {
experimentClient.exposure(key);
promise.resolve(true);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
promise.reject(e);
}
}

@ReactMethod
public void variantWithFallback(String flagKey, ReadableMap fallback, Promise promise) {
try {
Variant fallbackVariant = new Variant(null, null);
if (fallback != null) {
fallbackVariant = new Variant(safeGetString(fallback, "value"),
safeGetObject(fallback, "payload"));
fallbackVariant = new Variant(safeGetString(fallback, "value"), safeGetObject(fallback, "payload"));
}
Variant variant = experimentClient.variant(flagKey, fallbackVariant);
promise.resolve(variantToMap(variant));
Expand Down Expand Up @@ -166,20 +185,20 @@ public void setAmplitudeUserProvider(String amplitudeInstanceName, Promise promi
}

// Conversion methods
private ExperimentConfig convertConfig(ReadableMap config) {
private ExperimentConfig convertConfig(ReadableMap config, boolean integrated) {
ExperimentConfig.Builder builder = ExperimentConfig.builder();
if (config == null) {
return builder.build();
}
if (config.hasKey("debug")) {
builder.debug(config.getBoolean("debug"));
}
if (config.hasKey("instanceName")) {
builder.instanceName(config.getString("instanceName"));
}
if (config.hasKey("fallbackVariant")) {
ReadableMap map = config.getMap("fallbackVariant");
Variant fallbackVariant = new Variant(
safeGetString(map, "value"),
safeGetObject(map, "payload")
);
Variant fallbackVariant = new Variant(safeGetString(map, "value"), safeGetObject(map, "payload"));
builder.fallbackVariant(fallbackVariant);
}
if (config.hasKey("initialVariants")) {
Expand All @@ -204,18 +223,29 @@ private ExperimentConfig convertConfig(ReadableMap config) {
if (config.hasKey("retryFetchOnFailure")) {
builder.retryFetchOnFailure(config.getBoolean("retryFetchOnFailure"));
}
if (config.hasKey("amplitudeUserProviderInstanceName")) {
String instanceName = config.getString("amplitudeUserProviderInstanceName");
AmplitudeClient amplitudeInstance = Amplitude.getInstance(instanceName);
if (amplitudeInstance != null) {
builder.userProvider(new AmplitudeUserProvider(amplitudeInstance));
}
if (config.hasKey("automaticExposureTracking")) {
builder.automaticExposureTracking(config.getBoolean("automaticExposureTracking"));
}
if (config.hasKey("amplitudeAnalyticsProviderInstanceName")) {
String instanceName = config.getString("amplitudeAnalyticsProviderInstanceName");
AmplitudeClient amplitudeInstance = Amplitude.getInstance(instanceName);
if (amplitudeInstance != null) {
builder.analyticsProvider(new AmplitudeAnalyticsProvider(amplitudeInstance));
if (config.hasKey("automaticFetchOnAmplitudeIdentityChange")) {
builder.automaticFetchOnAmplitudeIdentityChange(
config.getBoolean("automaticFetchOnAmplitudeIdentityChange"));
}

if (!integrated) {
// Deprecated
if (config.hasKey("amplitudeUserProviderInstanceName")) {
String instanceName = config.getString("amplitudeUserProviderInstanceName");
AmplitudeClient amplitudeInstance = Amplitude.getInstance(instanceName);
if (amplitudeInstance != null) {
builder.userProvider(new AmplitudeUserProvider(amplitudeInstance));
}
}
if (config.hasKey("amplitudeAnalyticsProviderInstanceName")) {
String instanceName = config.getString("amplitudeAnalyticsProviderInstanceName");
AmplitudeClient amplitudeInstance = Amplitude.getInstance(instanceName);
if (amplitudeInstance != null) {
builder.analyticsProvider(new AmplitudeAnalyticsProvider(amplitudeInstance));
}
}
}
return builder.build();
Expand Down Expand Up @@ -282,22 +312,14 @@ private ExperimentUser convertUser(ReadableMap user) {
return null;
}
ExperimentUser.Builder builder = ExperimentUser.builder();
builder.deviceId(safeGetString(user, "device_id"))
.userId(safeGetString(user, "user_id"))
.version(safeGetString(user, "version"))
.country(safeGetString(user, "country"))
.region(safeGetString(user, "region"))
.dma(safeGetString(user, "dma"))
.city(safeGetString(user, "city"))
.language(safeGetString(user, "language"))
.platform(safeGetString(user, "platform"))
.os(safeGetString(user, "os"))
.deviceBrand(safeGetString(user, "device_brand"))
builder.deviceId(safeGetString(user, "device_id")).userId(safeGetString(user, "user_id"))
.version(safeGetString(user, "version")).country(safeGetString(user, "country"))
.region(safeGetString(user, "region")).dma(safeGetString(user, "dma")).city(safeGetString(user, "city"))
.language(safeGetString(user, "language")).platform(safeGetString(user, "platform"))
.os(safeGetString(user, "os")).deviceBrand(safeGetString(user, "device_brand"))
.deviceManufacturer(safeGetString(user, "device_manufacturer"))
.deviceModel(safeGetString(user, "device_model"))
.carrier(safeGetString(user, "carrier"))
.library(safeGetString(user, "library"))
.userProperties(safeGetMap(user, "user_properties"));
.deviceModel(safeGetString(user, "device_model")).carrier(safeGetString(user, "carrier"))
.library(safeGetString(user, "library")).userProperties(safeGetMap(user, "user_properties"));
return builder.build();
}
}
27 changes: 16 additions & 11 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
PODS:
- Amplitude (8.5.0)
- amplitude-react-native (2.6.0):
- Amplitude (= 8.5.0)
- Amplitude (8.8.0):
- AnalyticsConnector (~> 1.0.0)
- amplitude-react-native (2.8.0):
- Amplitude (= 8.8.0)
- React-Core
- AmplitudeExperiment (1.5.0)
- AmplitudeExperiment (1.6.0):
- AnalyticsConnector (~> 1.0.0)
- AnalyticsConnector (1.0.0)
- boost-for-react-native (1.63.0)
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
- experiment-react-native-client (0.5.1):
- Amplitude
- AmplitudeExperiment (= 1.5.0)
- experiment-react-native-client (0.5.2):
- Amplitude (~> 8.8.0)
- AmplitudeExperiment (~> 1.6.0)
- React-Core
- FBLazyVector (0.63.3)
- FBReactNativeSpec (0.63.3):
Expand Down Expand Up @@ -373,6 +376,7 @@ SPEC REPOS:
trunk:
- Amplitude
- AmplitudeExperiment
- AnalyticsConnector
- boost-for-react-native
- CocoaAsyncSocket
- Flipper
Expand Down Expand Up @@ -445,13 +449,14 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"

SPEC CHECKSUMS:
Amplitude: ef9ed339ddd33c9183edf63fa4bbaa86cf873321
amplitude-react-native: fa5e830e59fd8ed440a74d58fd72ad4b37e7c946
AmplitudeExperiment: 56180276d6dfc277659acac6495764de3e848d80
Amplitude: 710116f3539c225e86fb70a8abdcd20015683132
amplitude-react-native: acb8a0659b3f713185457f18642a8feb77652b4c
AmplitudeExperiment: 2ae761f52e7d7d15f9516bcf796a06d0c57e97b8
AnalyticsConnector: 4c386d5972ac9da86e22d668564dbbac97558754
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: cde416483dac037923206447da6e1454df403714
experiment-react-native-client: 2691b4bd4d9b58e35e5ed79ba5c18f162e3f2180
experiment-react-native-client: aa18cd70fa8b71d174733e2d091a4dfd5eba9f23
FBLazyVector: 878b59e31113e289e275165efbe4b54fa614d43d
FBReactNativeSpec: 7da9338acfb98d4ef9e5536805a0704572d33c2f
Flipper: 1bd2db48dcc31e4b167b9a33ec1df01c2ded4893
Expand Down
2 changes: 1 addition & 1 deletion example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"start": "react-native start"
},
"dependencies": {
"@amplitude/react-native": "^2.1.2",
"@amplitude/react-native": "2.8.0",
"react": "16.13.1",
"react-native": "0.63.3"
},
Expand Down
24 changes: 9 additions & 15 deletions example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,18 @@ export default function App() {
const [allVariants, setAllVariants] = React.useState<Variants | undefined>();
React.useEffect(() => {
(async () => {
let amplitudeInstanceName;
if (Amplitude) {
const amplitude = Amplitude.getInstance();
amplitude.init('a6dd847b9d2f03c816d4f3f8458cdc1d');
amplitudeInstanceName = amplitude.instanceName;
await Amplitude.getInstance().init('a6dd847b9d2f03c816d4f3f8458cdc1d');
await Amplitude.getInstance().setUserId('brian.giori@amplitude.com');
}
if (Experiment) {
await Experiment.initialize('client-IAxMYws9vVQESrrK88aTcToyqMxiiJoR', {
debug: true,
fallbackVariant: { value: 'defaultFallback' },
initialVariants: {
'flag-does-not-exist': {
value: 'asdf',
},
},
amplitudeUserProviderInstanceName: amplitudeInstanceName,
amplitudeAnalyticsProviderInstanceName: amplitudeInstanceName,
});
await Experiment.initializeWithAmplitudeAnalytics(
'client-IAxMYws9vVQESrrK88aTcToyqMxiiJoR',
{
debug: true,
fallbackVariant: { value: 'defaultFallback' },
}
);
await Experiment.fetch({
user_properties: { test: 'true', test2: 4.3 },
});
Expand Down
8 changes: 4 additions & 4 deletions example/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
# yarn lockfile v1


"@amplitude/react-native@^2.1.2":
version "2.6.0"
resolved "https://registry.yarnpkg.com/@amplitude/react-native/-/react-native-2.6.0.tgz#9bde1e4a7e684f949c5cd8e1067ea4006e654c29"
integrity sha512-AIEN8zfgmjvG9IaWgQFQE2XkijtvLRxns9jFQrO5GKA7DLw3z+PvCnY2g4TcAMOftH2+Sp6zpItE2RS38y/4bQ==
"@amplitude/react-native@2.8.0":
version "2.8.0"
resolved "https://registry.yarnpkg.com/@amplitude/react-native/-/react-native-2.8.0.tgz#f4d08f84c9662761f2f3af8dc35080240229a1b7"
integrity sha512-Stw61MwcX7BoFwJisfqEauaNCk0kxS/Co0V3MkD6QLXkKjqwESaLmJiKP+ZqcvBDbb/3uU4h1HxF1HuTn0+/WQ==

"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0":
version "7.16.0"
Expand Down
4 changes: 2 additions & 2 deletions experiment-react-native-client.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ Pod::Spec.new do |s|
s.source_files = "ios/**/*.{h,m,mm,swift}"

s.dependency "React-Core"
s.dependency "Amplitude"
s.dependency "AmplitudeExperiment", "1.5.0"
s.dependency "Amplitude", "~> 8.8.0"
s.dependency "AmplitudeExperiment", "~> 1.6.0"
end
4 changes: 4 additions & 0 deletions ios/ExperimentReactNativeClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ @interface RCT_EXTERN_MODULE(ExperimentReactNativeClient, NSObject)

RCT_EXTERN_METHOD(initialize:(NSString *)apiKey config:(NSDictionary *)config resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(initializeWithAmplitudeAnalytics:(NSString *)apiKey config:(NSDictionary *)config resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(fetch:(NSDictionary *)user resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(setUser:(NSDictionary *)user resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(variant:(NSString *)key resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(exposure:(NSString *)key resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(variantWithFallback:(NSString *)key fallback:(NSDictionary *)fallback resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(all: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
Expand Down
Loading