From 29798b219dea87a450034249945917f4cd12207a Mon Sep 17 00:00:00 2001 From: mateo-villa <mateo.villa@datadoghq.com> Date: Sat, 5 Oct 2024 18:13:03 -0400 Subject: [PATCH] [RUM-5418] Add RN API to append to existing user info --- packages/core/src/DdSdkReactNative.tsx | 16 ++++++++++++++++ .../src/__tests__/DdSdkReactNative.test.tsx | 19 +++++++++++++++++++ packages/core/src/types.tsx | 6 ++++++ 3 files changed, 41 insertions(+) diff --git a/packages/core/src/DdSdkReactNative.tsx b/packages/core/src/DdSdkReactNative.tsx index 3a70739cb..498065fac 100644 --- a/packages/core/src/DdSdkReactNative.tsx +++ b/packages/core/src/DdSdkReactNative.tsx @@ -196,6 +196,22 @@ export class DdSdkReactNative { UserInfoSingleton.getInstance().setUserInfo(user); }; + /** + * Set the user information. + * @param extraUserInfo: The extra info object (use builtin attributes: 'id', 'email', 'name', and/or any custom attribute). + * @returns a Promise. + */ + static addUserExtraInfo = async (extraUserInfo: UserInfo): Promise<void> => { + InternalLog.log( + `Adding extra user info ${JSON.stringify(extraUserInfo)}`, + SdkVerbosity.DEBUG + ); + const userInfo = UserInfoSingleton.getInstance().getUserInfo(); + const updatedUserInfo = { ...userInfo, ...extraUserInfo }; + await DdSdk.setUser(updatedUserInfo); + UserInfoSingleton.getInstance().setUserInfo(updatedUserInfo); + }; + /** * Set the tracking consent regarding the data collection. * @param trackingConsent: One of TrackingConsent values. diff --git a/packages/core/src/__tests__/DdSdkReactNative.test.tsx b/packages/core/src/__tests__/DdSdkReactNative.test.tsx index 65a161718..c667c1a08 100644 --- a/packages/core/src/__tests__/DdSdkReactNative.test.tsx +++ b/packages/core/src/__tests__/DdSdkReactNative.test.tsx @@ -1055,6 +1055,25 @@ describe('DdSdkReactNative', () => { }); }); + describe('addUserExtraInfo', () => { + it('calls SDK method when addUserExtraInfo, and updates the user in UserProvider', async () => { + // GIVEN + await DdSdkReactNative.setUser({ id: 'id' }); + const extraInfo = { id: 'updatedId', foo: 'bar' }; + + // WHEN + await DdSdkReactNative.addUserExtraInfo(extraInfo); + + // THEN + expect(DdSdk.setUser).toHaveBeenCalledTimes(2); + expect(DdSdk.setUser).toHaveBeenCalledWith(extraInfo); + expect(UserInfoSingleton.getInstance().getUserInfo()).toEqual({ + id: 'updatedId', + foo: 'bar' + }); + }); + }); + describe('setTrackingConsent', () => { it('calls SDK method when setTrackingConsent', async () => { // GIVEN diff --git a/packages/core/src/types.tsx b/packages/core/src/types.tsx index 9d0b0087f..fd5f6d0ea 100644 --- a/packages/core/src/types.tsx +++ b/packages/core/src/types.tsx @@ -82,6 +82,12 @@ export type DdSdkType = { */ setUser(user: object): Promise<void>; + /** + * Add additional user information. + * @param extraInfo: The extra info object (use builtin attributes: 'id', 'email', 'name', and/or any custom attribute). + */ + addUserExtraInfo(extraInfo: object): Promise<void>; + /** * Set the tracking consent regarding the data collection. * @param trackingConsent: Consent, which can take one of the following values: 'pending', 'granted', 'not_granted'.