From 8c87982c9f6235eb9ae0d24196ffab1a11027ad4 Mon Sep 17 00:00:00 2001 From: Hubert Sosinski Date: Tue, 4 Nov 2025 12:46:13 +0100 Subject: [PATCH 1/3] Send policyId to Sentry --- src/CONST/index.ts | 2 + src/libs/TelemetrySynchronizer.ts | 63 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/libs/TelemetrySynchronizer.ts diff --git a/src/CONST/index.ts b/src/CONST/index.ts index b4ea8d45db10c..58cc8c0b116c7 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1613,6 +1613,8 @@ const CONST = { }, TELEMETRY: { CONTEXT_FULLSTORY: 'Fullstory', + CONTEXT_POLICIES: 'Policies', + TAG_ACTIVE_POLICY: 'active_policy_id', }, PRIORITY_MODE: { GSD: 'gsd', diff --git a/src/libs/TelemetrySynchronizer.ts b/src/libs/TelemetrySynchronizer.ts new file mode 100644 index 0000000000000..c53c32c99b3d9 --- /dev/null +++ b/src/libs/TelemetrySynchronizer.ts @@ -0,0 +1,63 @@ +/** + * This file contains the logic for sending additional data to Sentry. + * + * It uses Onyx.connectWithoutView as nothing here is related to the UI. We only send data to the external provider and want to keep this outside of the render loop. + */ +import * as Sentry from '@sentry/react-native'; +import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; +import Onyx from 'react-native-onyx'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {Policy, Session} from '@src/types/onyx'; +import {getActivePolicies} from './PolicyUtils'; + + +/** + * Connect to Onyx to retrieve information about the user's active policies. + */ +let session: OnyxEntry; +let activePolicyID: OnyxEntry; +let policies: OnyxCollection; + +Onyx.connectWithoutView({ + key: ONYXKEYS.NVP_ACTIVE_POLICY_ID, + callback: (value) => { + if (!value) { + return; + } + activePolicyID = value; + sendPoliciesContext(); + }, +}); + +Onyx.connectWithoutView({ + key: ONYXKEYS.SESSION, + callback: (value) => { + if (!value?.email) { + return; + } + session = value; + sendPoliciesContext(); + }, +}); + +Onyx.connectWithoutView({ + key: ONYXKEYS.COLLECTION.POLICY, + waitForCollectionCallback: true, + callback: (value) => { + if (!value) { + return; + } + policies = value; + sendPoliciesContext(); + }, +}); + +function sendPoliciesContext() { + if (!policies || !session?.email || !activePolicyID) { + return; + } + const activePolicies = getActivePolicies(policies, session.email).map((policy) => policy.id); + Sentry.setTag(CONST.TELEMETRY.TAG_ACTIVE_POLICY, activePolicyID); + Sentry.setContext(CONST.TELEMETRY.CONTEXT_POLICIES, {activePolicyID, activePolicies}); +} \ No newline at end of file From 909301606f34a6f29c7a07724db488896ee23460 Mon Sep 17 00:00:00 2001 From: Hubert Sosinski Date: Tue, 4 Nov 2025 12:56:16 +0100 Subject: [PATCH 2/3] Prettier fix --- src/libs/TelemetrySynchronizer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/TelemetrySynchronizer.ts b/src/libs/TelemetrySynchronizer.ts index c53c32c99b3d9..4a87200b3b71d 100644 --- a/src/libs/TelemetrySynchronizer.ts +++ b/src/libs/TelemetrySynchronizer.ts @@ -11,7 +11,6 @@ import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy, Session} from '@src/types/onyx'; import {getActivePolicies} from './PolicyUtils'; - /** * Connect to Onyx to retrieve information about the user's active policies. */ @@ -60,4 +59,4 @@ function sendPoliciesContext() { const activePolicies = getActivePolicies(policies, session.email).map((policy) => policy.id); Sentry.setTag(CONST.TELEMETRY.TAG_ACTIVE_POLICY, activePolicyID); Sentry.setContext(CONST.TELEMETRY.CONTEXT_POLICIES, {activePolicyID, activePolicies}); -} \ No newline at end of file +} From 008619068d968bd955d346ee678b3fc0fcf6808a Mon Sep 17 00:00:00 2001 From: Hubert Sosinski Date: Tue, 4 Nov 2025 13:00:23 +0100 Subject: [PATCH 3/3] Run Telemetry in Expensify.tsx --- src/Expensify.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Expensify.tsx b/src/Expensify.tsx index 65227bac9d888..670dbfa89afd6 100644 --- a/src/Expensify.tsx +++ b/src/Expensify.tsx @@ -44,6 +44,8 @@ import './libs/registerPaginationConfig'; import setCrashlyticsUserId from './libs/setCrashlyticsUserId'; import StartupTimer from './libs/StartupTimer'; // This lib needs to be imported, but it has nothing to export since all it contains is an Onyx connection +import './libs/TelemetrySynchronizer'; +// This lib needs to be imported, but it has nothing to export since all it contains is an Onyx connection import './libs/UnreadIndicatorUpdater'; import Visibility from './libs/Visibility'; import ONYXKEYS from './ONYXKEYS';