diff --git a/src/CONST.ts b/src/CONST.ts index 7a8635895071..c19adca9867f 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1614,6 +1614,8 @@ const CONST = { TIMING: { GET_ORDERED_REPORT_IDS: 'get_ordered_report_ids', CALCULATE_MOST_RECENT_LAST_MODIFIED_ACTION: 'calc_most_recent_last_modified_action', + OPEN_APP: 'open_app', + SPLASH_SCREEN: 'splash_screen', OPEN_SEARCH: 'open_search', OPEN_REPORT: 'open_report', OPEN_REPORT_FROM_PREVIEW: 'open_report_from_preview', diff --git a/src/SplashScreenStateContext.tsx b/src/SplashScreenStateContext.tsx index 90a858f70c42..edceb6a9da47 100644 --- a/src/SplashScreenStateContext.tsx +++ b/src/SplashScreenStateContext.tsx @@ -1,6 +1,7 @@ -import React, {useContext, useMemo, useState} from 'react'; +import React, {useContext, useEffect, useMemo, useState} from 'react'; import type {ValueOf} from 'type-fest'; import CONST from './CONST'; +import Timing from './libs/actions/Timing'; import type ChildrenProps from './types/utils/ChildrenProps'; type SplashScreenStateContextType = { @@ -23,6 +24,14 @@ function SplashScreenStateContextProvider({children}: ChildrenProps) { [splashScreenState], ); + useEffect(() => { + if (splashScreenState !== 'hidden') { + return; + } + + Timing.end(CONST.TIMING.SPLASH_SCREEN); + }, [splashScreenState]); + return {children}; } diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts index 8b95c70fc9a6..8426468d9e84 100644 --- a/src/libs/actions/App.ts +++ b/src/libs/actions/App.ts @@ -162,6 +162,7 @@ const isReadyToOpenApp = new Promise((resolve) => { }); function confirmReadyToOpenApp() { + Timing.end(CONST.TIMING.OPEN_APP); resolveIsReadyPromise(); } @@ -215,7 +216,6 @@ function setSidebarLoaded() { Onyx.set(ONYXKEYS.IS_SIDEBAR_LOADED, true); Performance.markEnd(CONST.TIMING.SIDEBAR_LOADED); - Timing.end(CONST.TIMING.SIDEBAR_LOADED); } function setAppLoading(isLoading: boolean) { diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx index c8fe13e6d712..a3f3e34d3b19 100644 --- a/src/pages/Search/SearchPage.tsx +++ b/src/pages/Search/SearchPage.tsx @@ -26,6 +26,7 @@ import usePermissions from '@hooks/usePermissions'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; +import {confirmReadyToOpenApp} from '@libs/actions/App'; import {searchInServer} from '@libs/actions/Report'; import { approveMoneyRequestOnSearch, @@ -90,6 +91,10 @@ function SearchPage({route}: SearchPageProps) { const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${queryJSON?.hash ?? CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true}); const [lastNonEmptySearchResults, setLastNonEmptySearchResults] = useState(undefined); + useEffect(() => { + confirmReadyToOpenApp(); + }, []); + useEffect(() => { if (!currentSearchResults?.search?.type) { return; diff --git a/src/pages/home/sidebar/BaseSidebarScreen.tsx b/src/pages/home/sidebar/BaseSidebarScreen.tsx index b1c6f2fcdf28..b713f09429d7 100644 --- a/src/pages/home/sidebar/BaseSidebarScreen.tsx +++ b/src/pages/home/sidebar/BaseSidebarScreen.tsx @@ -9,7 +9,6 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import {isMobile} from '@libs/Browser'; import Performance from '@libs/Performance'; -import Timing from '@userActions/Timing'; import CONST from '@src/CONST'; import SidebarLinksData from './SidebarLinksData'; @@ -21,7 +20,6 @@ function BaseSidebarScreen() { useEffect(() => { Performance.markStart(CONST.TIMING.SIDEBAR_LOADED); - Timing.start(CONST.TIMING.SIDEBAR_LOADED); }, []); return ( diff --git a/src/setup/index.ts b/src/setup/index.ts index 5cc21e47373c..a327f8e8df93 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -8,8 +8,11 @@ import ONYXKEYS from '@src/ONYXKEYS'; import addUtilsToWindow from './addUtilsToWindow'; import initializeLastVisitedPath from './initializeLastVisitedPath'; import platformSetup from './platformSetup'; +import telemetry from './telemetry'; export default function () { + telemetry(); + /* * Initialize the Onyx store when the app loads for the first time. * diff --git a/src/setup/telemetry/index.native.ts b/src/setup/telemetry/index.native.ts new file mode 100644 index 000000000000..821f3b30447b --- /dev/null +++ b/src/setup/telemetry/index.native.ts @@ -0,0 +1,17 @@ +import {AppState} from 'react-native'; +import type {AppStateStatus} from 'react-native'; +import Timing from '@userActions/Timing'; +import CONST from '@src/CONST'; + +export default function () { + Timing.start(CONST.TIMING.SPLASH_SCREEN); + Timing.start(CONST.TIMING.OPEN_APP); + + AppState.addEventListener('change', (nextState: AppStateStatus) => { + if (nextState !== 'active') { + return; + } + + Timing.clearData(); + }); +} diff --git a/src/setup/telemetry/index.ts b/src/setup/telemetry/index.ts new file mode 100644 index 000000000000..419176e84f76 --- /dev/null +++ b/src/setup/telemetry/index.ts @@ -0,0 +1,15 @@ +import Timing from '@userActions/Timing'; +import CONST from '@src/CONST'; + +export default function () { + Timing.start(CONST.TIMING.SPLASH_SCREEN); + Timing.start(CONST.TIMING.OPEN_APP); + + document.addEventListener('visibilitychange', () => { + if (!document.hidden) { + return; + } + + Timing.clearData(); + }); +}