Skip to content

Commit b90fb4f

Browse files
Fix support for setting custom anonymous IDs from React Native library. (#259)
* Support anon ID from the React Native library. * Ensure Android RN module also parses the anon ID into traits. * Support null trait
1 parent 7a6dcc3 commit b90fb4f

File tree

6 files changed

+37
-16
lines changed

6 files changed

+37
-16
lines changed

packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalyticsModule.kt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,24 @@ class RNAnalyticsModule(context: ReactApplicationContext): ReactContextBaseJavaM
228228
)
229229

230230
@ReactMethod
231-
fun identify(userId: String?, traits: ReadableMap?, integrations: ReadableMap?, context: ReadableMap?) =
232-
analytics.identify(
233-
userId,
234-
Traits() from traits,
235-
optionsFrom(context, integrations)
236-
)
231+
fun identify(userId: String?, traits: ReadableMap?, options: ReadableMap?, integrations: ReadableMap?, context: ReadableMap?) {
232+
233+
val mergedTraits = if (options?.hasKey("anonymousId") == true) {
234+
val map = WritableNativeMap()
235+
map.merge(traits)
236+
map.putString("anonymousId", options.getString("anonymousId"))
237+
map
238+
} else {
239+
traits
240+
}
241+
242+
analytics.identify(
243+
userId,
244+
Traits() from mergedTraits,
245+
optionsFrom(context, integrations)
246+
)
247+
}
248+
237249

238250
@ReactMethod
239251
fun group(groupId: String, traits: ReadableMap?, integrations: ReadableMap, context: ReadableMap) =

packages/core/ios/RNAnalytics/RNAnalytics.m

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,16 @@ - (NSDictionary*)withContextAndIntegrations :(NSDictionary*)context :(NSDictiona
147147
options:[self withContextAndIntegrations :context :integrations]];
148148
}
149149

150-
RCT_EXPORT_METHOD(identify:(NSString*)userId :(NSDictionary*)traits :(NSDictionary*)integrations :(NSDictionary*)context) {
151-
[SEGAnalytics.sharedAnalytics identify:userId
152-
traits:traits
153-
options:[self withContextAndIntegrations :context :integrations]];
150+
RCT_EXPORT_METHOD(identify:(NSString*)userId
151+
:(NSDictionary * _Nullable)traits
152+
:(NSDictionary *)options
153+
:(NSDictionary *)integrations
154+
:(NSDictionary *)context) {
155+
NSMutableDictionary *mergedOptions = [[self withContextAndIntegrations :context :integrations] mutableCopy];
156+
[mergedOptions addEntriesFromDictionary: options ?: @{}];
157+
[SEGAnalytics.sharedAnalytics identify: userId
158+
traits: traits
159+
options: mergedOptions];
154160
}
155161

156162
RCT_EXPORT_METHOD(group:(NSString*)groupId :(NSDictionary*)traits :(NSDictionary*)integrations :(NSDictionary*)context) {

packages/core/src/__tests__/analytics.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ it('does .screen()', () =>
6868
testCall('screen')('Shopping cart', { from: 'Product page' }, {}, ctx))
6969

7070
it('does .identify()', () =>
71-
testCall('identify')('sloth', { eats: 'leaves' }, {}, ctx))
71+
testCall('identify')('sloth', { eats: 'leaves' }, {}, {}, ctx))
7272

7373
it('does .group()', () => testCall('group')('bots', { humans: false }, {}, ctx))
7474

packages/core/src/analytics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ export module Analytics {
302302
* @param options A dictionary of options, e.g. integrations (thigh analytics integration to forward the event to)
303303
*/
304304
public async identify(user: string, traits: JsonMap = {}, options: Options = {}) {
305-
await this.middlewares.run('identify', { user, traits, integrations: options.integrations || {} }, options.context || {})
305+
await this.middlewares.run('identify', { user, traits, options, integrations: options.integrations || {} }, options.context || {})
306306
}
307307

308308
/**

packages/core/src/bridge.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ export interface Context extends JsonMap {
4343
}
4444
}
4545

46-
export interface Options {
46+
export type Options = {
4747
integrations?: Integrations
4848
context?: Context
49-
}
49+
} & JsonMap
5050

5151
export interface Bridge {
5252
setup(configuration: Configuration): Promise<void>
@@ -58,8 +58,9 @@ export interface Bridge {
5858
): Promise<void>
5959
identify(
6060
user: string,
61-
traits: JsonMap,
61+
traits: JsonMap | null,
6262
options: Options,
63+
integrations: Integrations,
6364
context: JsonMap
6465
): Promise<void>
6566
screen(

packages/core/src/middleware.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ export interface IdentifyPayload
3636
'identify',
3737
{
3838
user: string
39-
traits: JsonMap
39+
traits: JsonMap | null
40+
options: JsonMap
4041
integrations: Integrations
4142
}
4243
> {}
@@ -113,6 +114,7 @@ export class MiddlewareChain {
113114
identify(
114115
payload.data.user,
115116
payload.data.traits,
117+
payload.data.options,
116118
payload.data.integrations,
117119
payload.context
118120
)

0 commit comments

Comments
 (0)