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'.