From dae648b351404de7bed5a1e760671549072ea796 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Tue, 18 Nov 2025 17:51:22 +0100 Subject: [PATCH 1/3] Add telemetry spans for search router open event --- src/CONST/index.ts | 1 + src/components/Search/SearchAutocompleteList.tsx | 2 ++ src/components/Search/SearchRouter/SearchButton.tsx | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index a54109df179d4..6c8c156157f3f 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -1654,6 +1654,7 @@ const CONST = { TAG_ACTIVE_POLICY: 'active_policy_id', SPAN_OPEN_REPORT: 'ManualOpenReport', SPAN_APP_STARTUP: 'ManualAppStartup', + SPAN_OPEN_SEARCH_ROUTER: 'ManualOpenSearchRouter', }, PRIORITY_MODE: { GSD: 'gsd', diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 3cda7e435e24e..24615fcfc3c4b 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -44,6 +44,7 @@ import { } from '@libs/SearchQueryUtils'; import {getDatePresets, getHasOptions} from '@libs/SearchUIUtils'; import StringUtils from '@libs/StringUtils'; +import {endSpan} from '@libs/telemetry/activeSpans'; import Timing from '@userActions/Timing'; import CONST, {CONTINUATION_DETECTION_SEARCH_FILTER_KEYS} from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -120,6 +121,7 @@ const defaultListOptions = { const setPerformanceTimersEnd = () => { Timing.end(CONST.TIMING.OPEN_SEARCH); Performance.markEnd(CONST.TIMING.OPEN_SEARCH); + endSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER); }; function isSearchQueryListItem(listItem: UserListItemProps | SearchQueryListItemProps): listItem is SearchQueryListItemProps { diff --git a/src/components/Search/SearchRouter/SearchButton.tsx b/src/components/Search/SearchRouter/SearchButton.tsx index 7f6fc0778f0d9..778fdec102736 100644 --- a/src/components/Search/SearchRouter/SearchButton.tsx +++ b/src/components/Search/SearchRouter/SearchButton.tsx @@ -8,6 +8,7 @@ import useLocalize from '@hooks/useLocalize'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Performance from '@libs/Performance'; +import {startSpan} from '@libs/telemetry/activeSpans'; import {callFunctionIfActionIsAllowed} from '@userActions/Session'; import Timing from '@userActions/Timing'; import CONST from '@src/CONST'; @@ -39,6 +40,10 @@ function SearchButton({style, shouldUseAutoHitSlop = false}: SearchButtonProps) Timing.start(CONST.TIMING.OPEN_SEARCH); Performance.markStart(CONST.TIMING.OPEN_SEARCH); + startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, { + name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + }); openSearchRouter(); })} From e05d9dac3aba4be02266ef1c1fafccf804b2867f Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Wed, 19 Nov 2025 17:17:51 +0100 Subject: [PATCH 2/3] feat: support keyboard handlers for the search modal --- .../Search/SearchRouter/SearchRouterContext.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/components/Search/SearchRouter/SearchRouterContext.tsx b/src/components/Search/SearchRouter/SearchRouterContext.tsx index 8aeea9eeb23b4..4c91b714ee27f 100644 --- a/src/components/Search/SearchRouter/SearchRouterContext.tsx +++ b/src/components/Search/SearchRouter/SearchRouterContext.tsx @@ -2,7 +2,9 @@ import React, {useContext, useEffect, useMemo, useRef, useState} from 'react'; import type {AnimatedTextInputRef} from '@components/RNTextInput'; import isSearchTopmostFullScreenRoute from '@libs/Navigation/helpers/isSearchTopmostFullScreenRoute'; import {navigationRef} from '@libs/Navigation/Navigation'; +import {startSpan} from '@libs/telemetry/activeSpans'; import {close} from '@userActions/Modal'; +import CONST from '@src/CONST'; import NAVIGATORS from '@src/NAVIGATORS'; import SCREENS from '@src/SCREENS'; import type ChildrenProps from '@src/types/utils/ChildrenProps'; @@ -92,6 +94,16 @@ function SearchRouterContextProvider({children}: ChildrenProps) { } }; + const startSearchRouterOpenSpan = () => { + startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, { + name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + attributes: { + trigger: 'keyboard', + }, + }); + } + // There are callbacks that live outside of React render-loop and interact with SearchRouter // So we need a function that is based on ref to correctly open/close it // When user is on `/search` page we focus the Input instead of showing router @@ -104,11 +116,13 @@ function SearchRouterContextProvider({children}: ChildrenProps) { if (searchPageInputRef.current.isFocused()) { searchPageInputRef.current.blur(); } else { + startSearchRouterOpenSpan(); searchPageInputRef.current.focus(); } } else if (searchRouterDisplayedRef.current) { closeSearchRouter(); } else { + startSearchRouterOpenSpan(); openSearchRouter(); } }; From a0eef68c4e5b7de61776cdbced180082664a9090 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Wed, 19 Nov 2025 17:27:53 +0100 Subject: [PATCH 3/3] prettier --- .../Search/SearchRouter/SearchRouterContext.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/Search/SearchRouter/SearchRouterContext.tsx b/src/components/Search/SearchRouter/SearchRouterContext.tsx index 4c91b714ee27f..401804bc9d2bf 100644 --- a/src/components/Search/SearchRouter/SearchRouterContext.tsx +++ b/src/components/Search/SearchRouter/SearchRouterContext.tsx @@ -95,14 +95,14 @@ function SearchRouterContextProvider({children}: ChildrenProps) { }; const startSearchRouterOpenSpan = () => { - startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, { - name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, - op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, - attributes: { - trigger: 'keyboard', - }, - }); - } + startSpan(CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, { + name: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + op: CONST.TELEMETRY.SPAN_OPEN_SEARCH_ROUTER, + attributes: { + trigger: 'keyboard', + }, + }); + }; // There are callbacks that live outside of React render-loop and interact with SearchRouter // So we need a function that is based on ref to correctly open/close it