diff --git a/contributingGuides/PERFORMANCE_METRICS.md b/contributingGuides/PERFORMANCE_METRICS.md
index 6c40e346a3ce..ecebbaae4e0e 100644
--- a/contributingGuides/PERFORMANCE_METRICS.md
+++ b/contributingGuides/PERFORMANCE_METRICS.md
@@ -14,21 +14,16 @@ Project is using Firebase for tracking these metrics. However, not all of them a
| `js_loaded` | ✅ | The time it takes for the JavaScript bundle to load.
**Platforms:** Android, iOS | **Android:** Starts in the `onCreate` method.
**iOS:** Starts in the AppDelegate's `didFinishLaunchingWithOptions` method. | Stops at the first render of the app via native module on the JS side. |
| `_app_in_foreground` | ✅ | The time when the app is running in the foreground and available to the user.
**Platforms:** Android, iOS | **Android:** Starts when the first activity to reach the foreground has its `onResume()` method called.
**iOS:** Starts when the application receives the `UIApplicationDidBecomeActiveNotification` notification. | **Android:** Stops when the last activity to leave the foreground has its `onStop()` method called.
**iOS:** Stops when it receives the `UIApplicationWillResignActiveNotification` notification. |
| `_app_in_background` | ✅ | Time when the app is running in the background.
**Platforms:** Android, iOS | **Android:** Starts when the last activity to leave the foreground has its `onStop()` method called.
**iOS:** Starts when the application receives the `UIApplicationWillResignActiveNotification` notification. | **Android:** Stops when the first activity to reach the foreground has its `onResume()` method called.
**iOS:** Stops when it receives the `UIApplicationDidBecomeActiveNotification` notification. |
-| `homepage_initial_render` | ✅ | Time taken for the initial render of the app for a logged in user.
**Platforms:** All | Starts with the first render of the `AuthScreens` component. | Stops once the `AuthScreens` component is mounted. |
-| `sidebar_loaded` | ❌ | Time taken for the Sidebar to load.
**Platforms:** All | Starts when the Sidebar is mounted. | Stops when the Splash Screen is hidden. |
+| `sidebar_loaded` | ❌ | Time taken for the Sidebar to load.
**Platforms:** All | Starts when the Sidebar is mounted. | Stops when the LHN finishes laying out. |
| `calc_most_recent_last_modified_action` | ✅ | Time taken to find the most recently modified report action or report.
**Platforms:** All | Starts when the app reconnects to the network | Ends when the app reconnects to the network and the most recent report action or report is found. |
-| `search_render` | ✅ | Time taken to render the Chat Finder page.
**Platforms:** All | Starts when the Chat Finder icon in LHN is pressed. | Stops when the list of available options is rendered for the first time. |
-| `load_search_options` | ✅ | Time taken to generate the list of options used in Chat Finder.
**Platforms:** All | Starts when the `getSearchOptions` function is called. | Stops when the list of available options is generated. |
-| `search_filter_options` | ✅ | Time taken to filter search options in Chat Finder by given search value.
**Platforms:** All | Starts when user types something in the Chat Finder search input. | Stops when the list of filtered options is generated. |
+| `open_search` | ✅ | Time taken to open up the Search Router.
**Platforms:** All | Starts when the Search Router icon in LHN is pressed. | Stops when the list of available options finishes laying out. |
+| `load_search_options` | ✅ | Time taken to generate the list of options used in the Search Router.
**Platforms:** All | Starts when the `getSearchOptions` function is called. | Stops when the list of available options is generated. |
+| `search_filter_options` | ✅ | Time taken to filter search options in the Search Router by the given search value.
**Platforms:** All | Starts when user types something in the Search Router search input. | Stops when the list of filtered options is generated. |
| `trie_initialization` | ✅ | Time taken to build the emoji trie.
**Platforms:** All | Starts when emoji trie begins to build. | Stops when emoji trie building is complete. |
-| `open_report` | ❌ | Time taken to open a report.
**Platforms:** All | Starts when the row in the `LHNOptionsList` is pressed. | Stops when the `ReportActionsList` finishes laying out. |
-| `switch_report` | ✅ | Time taken to open report.
**Platforms:** All | Starts when the chat in the LHN is pressed. | Stops when the `ReportActionsList` finishes laying out. |
+| `open_report` | ✅ | Time taken to open a report.
**Platforms:** All | Starts when the row in the `LHNOptionsList` is pressed. | Stops when the `ReportActionsList` finishes laying out. |
| `open_report_from_preview` | ✅ | Time taken to open a report from preview.
(previously `switch_report_from_preview`)
**Platforms:** All | Starts when the user presses the Report Preview. | Stops when the `ReportActionsList` finishes laying out. |
-| `switch_report_from_preview` | ❌ | **[REMOVED]** Time taken to open a report from preview. | Starts when the user presses the Report Preview. | Stops when the `ReportActionsList` finishes laying out. |
-| `chat_render` | ✅ | Time taken to render the Report screen.
**Platforms:** All | Starts when the `ReportScreen` is being rendered for the first time. | Stops once the `ReportScreen` component is mounted. |
-| `report_initial_render` | ❌ | Time taken to render the Report screen.
**Platforms:** All | Starts when the first item is rendered in the `LHNOptionsList`. | Stops when the `ReportActionsList` finishes laying out. |
| `open_report_thread` | ✅ | Time taken to open a thread in a report.
**Platforms:** All | Starts when user presses Report Action Item. | Stops when the `ReportActionsList` finishes laying out. |
-| `message_sent` | ❌ | Time taken to send a message.
**Platforms:** All | Starts when the new message is sent. | Stops when the message is being rendered in the chat. |
+| `send_message` | ✅ | Time taken to send a message.
**Platforms:** All | Starts when the new message is sent. | Stops when the message is being rendered in the chat. |
## Documentation Maintenance
@@ -46,4 +41,4 @@ To ensure this documentation remains accurate and useful, please adhere to the f
## Additional Resources
- [Firebase Documentation](https://firebase.google.com/docs)
-- [Firebase Performance Monitoring](https://firebase.google.com/docs/perf-mon)
\ No newline at end of file
+- [Firebase Performance Monitoring](https://firebase.google.com/docs/perf-mon)
diff --git a/src/CONST.ts b/src/CONST.ts
index 208c8fd4174a..056151742c25 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -1254,17 +1254,13 @@ const CONST = {
},
TIMING: {
CALCULATE_MOST_RECENT_LAST_MODIFIED_ACTION: 'calc_most_recent_last_modified_action',
- SEARCH_ROUTER_RENDER: 'search_router_render',
- CHAT_RENDER: 'chat_render',
+ OPEN_SEARCH: 'open_search',
OPEN_REPORT: 'open_report',
- HOMEPAGE_INITIAL_RENDER: 'homepage_initial_render',
- REPORT_INITIAL_RENDER: 'report_initial_render',
- SWITCH_REPORT: 'switch_report',
OPEN_REPORT_FROM_PREVIEW: 'open_report_from_preview',
OPEN_REPORT_THREAD: 'open_report_thread',
SIDEBAR_LOADED: 'sidebar_loaded',
LOAD_SEARCH_OPTIONS: 'load_search_options',
- MESSAGE_SENT: 'message_sent',
+ SEND_MESSAGE: 'send_message',
COLD: 'cold',
WARM: 'warm',
REPORT_ACTION_ITEM_LAYOUT_DEBOUNCE_TIME: 1500,
diff --git a/src/Expensify.tsx b/src/Expensify.tsx
index e07b03a6d405..1d0100add00f 100644
--- a/src/Expensify.tsx
+++ b/src/Expensify.tsx
@@ -30,7 +30,6 @@ import NavigationRoot from './libs/Navigation/NavigationRoot';
import NetworkConnection from './libs/NetworkConnection';
import PushNotification from './libs/Notification/PushNotification';
import './libs/Notification/PushNotification/subscribePushNotification';
-import Performance from './libs/Performance';
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
@@ -138,7 +137,6 @@ function Expensify() {
const onSplashHide = useCallback(() => {
setSplashScreenState(CONST.BOOT_SPLASH_STATE.HIDDEN);
- Performance.markEnd(CONST.TIMING.SIDEBAR_LOADED);
}, [setSplashScreenState]);
useLayoutEffect(() => {
diff --git a/src/components/LHNOptionsList/OptionRowLHN.tsx b/src/components/LHNOptionsList/OptionRowLHN.tsx
index 94116181bccb..3e3f4d1b8e5d 100644
--- a/src/components/LHNOptionsList/OptionRowLHN.tsx
+++ b/src/components/LHNOptionsList/OptionRowLHN.tsx
@@ -30,6 +30,7 @@ import * as ReportUtils from '@libs/ReportUtils';
import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu';
import FreeTrial from '@pages/settings/Subscription/FreeTrial';
import variables from '@styles/variables';
+import Timing from '@userActions/Timing';
import * as User from '@userActions/User';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -193,6 +194,7 @@ function OptionRowLHN({reportID, isFocused = false, onSelectRow = () => {}, opti
ref={popoverAnchor}
onPress={(event) => {
Performance.markStart(CONST.TIMING.OPEN_REPORT);
+ Timing.start(CONST.TIMING.OPEN_REPORT);
event?.preventDefault();
// Enable Composer to focus on clicking the same chat after opening the context menu.
diff --git a/src/components/ReportActionItem/ReportPreview.tsx b/src/components/ReportActionItem/ReportPreview.tsx
index 9067f1abb11a..d476d1198808 100644
--- a/src/components/ReportActionItem/ReportPreview.tsx
+++ b/src/components/ReportActionItem/ReportPreview.tsx
@@ -27,6 +27,7 @@ import * as CurrencyUtils from '@libs/CurrencyUtils';
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
import HapticFeedback from '@libs/HapticFeedback';
import Navigation from '@libs/Navigation/Navigation';
+import Performance from '@libs/Performance';
import * as PolicyUtils from '@libs/PolicyUtils';
import * as ReceiptUtils from '@libs/ReceiptUtils';
import * as ReportActionsUtils from '@libs/ReportActionsUtils';
@@ -456,6 +457,7 @@ function ReportPreview({
{
+ Performance.markStart(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
Timing.start(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID));
}}
diff --git a/src/components/Search/SearchRouter/SearchButton.tsx b/src/components/Search/SearchRouter/SearchButton.tsx
index 76eacd8b991d..90699e951998 100644
--- a/src/components/Search/SearchRouter/SearchButton.tsx
+++ b/src/components/Search/SearchRouter/SearchButton.tsx
@@ -30,8 +30,8 @@ function SearchButton({style}: SearchButtonProps) {
accessibilityLabel={translate('common.search')}
style={[styles.flexRow, styles.touchableButtonImage, style]}
onPress={Session.checkIfActionIsAllowed(() => {
- Timing.start(CONST.TIMING.SEARCH_ROUTER_RENDER);
- Performance.markStart(CONST.TIMING.SEARCH_ROUTER_RENDER);
+ Timing.start(CONST.TIMING.OPEN_SEARCH);
+ Performance.markStart(CONST.TIMING.OPEN_SEARCH);
openSearchRouter();
})}
diff --git a/src/components/Search/SearchRouter/SearchRouterList.tsx b/src/components/Search/SearchRouter/SearchRouterList.tsx
index cc854ff926c3..45e30a6bad6d 100644
--- a/src/components/Search/SearchRouter/SearchRouterList.tsx
+++ b/src/components/Search/SearchRouter/SearchRouterList.tsx
@@ -69,8 +69,8 @@ type SearchRouterListProps = {
};
const setPerformanceTimersEnd = () => {
- Timing.end(CONST.TIMING.SEARCH_ROUTER_RENDER);
- Performance.markEnd(CONST.TIMING.SEARCH_ROUTER_RENDER);
+ Timing.end(CONST.TIMING.OPEN_SEARCH);
+ Performance.markEnd(CONST.TIMING.OPEN_SEARCH);
};
function getContextualSearchQuery(reportName: string) {
diff --git a/src/libs/E2E/tests/chatOpeningTest.e2e.ts b/src/libs/E2E/tests/chatOpeningTest.e2e.ts
index cf0c4889aa69..62a01e43755d 100644
--- a/src/libs/E2E/tests/chatOpeningTest.e2e.ts
+++ b/src/libs/E2E/tests/chatOpeningTest.e2e.ts
@@ -27,10 +27,9 @@ const test = (config: NativeConfig) => {
console.debug('[E2E] Logged in, getting chat opening metrics and submitting them…');
- const [renderChatPromise, renderChatResolve] = getPromiseWithResolve();
const [chatTTIPromise, chatTTIResolve] = getPromiseWithResolve();
- Promise.all([renderChatPromise, chatTTIPromise]).then(() => {
+ chatTTIPromise.then(() => {
console.debug(`[E2E] Submitting!`);
E2EClient.submitTestDone();
@@ -46,22 +45,6 @@ const test = (config: NativeConfig) => {
console.debug(`[E2E] Entry: ${JSON.stringify(entry)}`);
- if (entry.name === CONST.TIMING.CHAT_RENDER) {
- E2EClient.submitTestResults({
- branch: Config.E2E_BRANCH,
- name: `${name} Chat opening`,
- metric: entry.duration,
- unit: 'ms',
- })
- .then(() => {
- console.debug('[E2E] Done with chat opening, exiting…');
- renderChatResolve();
- })
- .catch((err) => {
- console.debug('[E2E] Error while submitting test results:', err);
- });
- }
-
if (entry.name === CONST.TIMING.OPEN_REPORT) {
E2EClient.submitTestResults({
branch: Config.E2E_BRANCH,
diff --git a/src/libs/E2E/tests/linkingTest.e2e.ts b/src/libs/E2E/tests/linkingTest.e2e.ts
index 18ba438c2ca6..2a85a5dabe6c 100644
--- a/src/libs/E2E/tests/linkingTest.e2e.ts
+++ b/src/libs/E2E/tests/linkingTest.e2e.ts
@@ -1,7 +1,6 @@
import {DeviceEventEmitter} from 'react-native';
-import type {NativeConfig} from 'react-native-config';
import Config from 'react-native-config';
-import Timing from '@libs/actions/Timing';
+import type {NativeConfig} from 'react-native-config';
import E2ELogin from '@libs/E2E/actions/e2eLogin';
import waitForAppLoaded from '@libs/E2E/actions/waitForAppLoaded';
import E2EClient from '@libs/E2E/client';
@@ -32,9 +31,9 @@ const test = (config: NativeConfig) => {
}
const [appearMessagePromise, appearMessageResolve] = getPromiseWithResolve();
- const [switchReportPromise, switchReportResolve] = getPromiseWithResolve();
+ const [openReportPromise, openReportResolve] = getPromiseWithResolve();
- Promise.all([appearMessagePromise, switchReportPromise])
+ Promise.all([appearMessagePromise, openReportPromise])
.then(() => {
console.debug('[E2E] Test completed successfully, exiting…');
E2EClient.submitTestDone();
@@ -57,21 +56,15 @@ const test = (config: NativeConfig) => {
Performance.subscribeToMeasurements((entry) => {
if (entry.name === CONST.TIMING.SIDEBAR_LOADED) {
console.debug('[E2E] Sidebar loaded, navigating to a report…');
+ Performance.markStart(CONST.TIMING.OPEN_REPORT);
Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(reportID));
return;
}
- if (entry.name === CONST.TIMING.REPORT_INITIAL_RENDER) {
- console.debug('[E2E] Navigating to linked report action…');
- Timing.start(CONST.TIMING.SWITCH_REPORT);
- Performance.markStart(CONST.TIMING.SWITCH_REPORT);
-
- Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(linkedReportID, linkedReportActionID));
- return;
- }
-
- if (entry.name === CONST.TIMING.SWITCH_REPORT) {
+ if (entry.name === CONST.TIMING.OPEN_REPORT) {
console.debug('[E2E] Linking: 1');
+ console.debug('[E2E] Navigating to the linked report action…');
+ Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(linkedReportID, linkedReportActionID));
E2EClient.submitTestResults({
branch: Config.E2E_BRANCH,
@@ -80,7 +73,7 @@ const test = (config: NativeConfig) => {
unit: 'ms',
});
- switchReportResolve();
+ openReportResolve();
}
});
});
diff --git a/src/libs/E2E/tests/openSearchRouterTest.e2e.ts b/src/libs/E2E/tests/openSearchRouterTest.e2e.ts
index de9464c9c286..4fd2b26e63c8 100644
--- a/src/libs/E2E/tests/openSearchRouterTest.e2e.ts
+++ b/src/libs/E2E/tests/openSearchRouterTest.e2e.ts
@@ -60,7 +60,7 @@ const test = (config: NativeConfig) => {
props.onPress();
}
- if (entry.name === CONST.TIMING.SEARCH_ROUTER_RENDER) {
+ if (entry.name === CONST.TIMING.OPEN_SEARCH) {
E2EClient.submitTestResults({
branch: Config.E2E_BRANCH,
name: `${name} Open Search Router TTI`,
diff --git a/src/libs/E2E/tests/reportTypingTest.e2e.ts b/src/libs/E2E/tests/reportTypingTest.e2e.ts
index e042a688c37d..473bf317e6c0 100644
--- a/src/libs/E2E/tests/reportTypingTest.e2e.ts
+++ b/src/libs/E2E/tests/reportTypingTest.e2e.ts
@@ -43,7 +43,7 @@ const test = (config: NativeConfig) => {
});
Performance.subscribeToMeasurements((entry) => {
- if (entry.name === CONST.TIMING.MESSAGE_SENT) {
+ if (entry.name === CONST.TIMING.SEND_MESSAGE) {
E2EClient.submitTestResults({
branch: Config.E2E_BRANCH,
name: `${name} Message sent`,
diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx
index 58586250f958..a061d5b52d22 100644
--- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx
+++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx
@@ -43,7 +43,6 @@ import * as PriorityMode from '@userActions/PriorityMode';
import * as Report from '@userActions/Report';
import * as Session from '@userActions/Session';
import toggleTestToolsModal from '@userActions/TestTool';
-import Timing from '@userActions/Timing';
import * as User from '@userActions/User';
import CONFIG from '@src/CONFIG';
import CONST from '@src/CONST';
@@ -248,8 +247,6 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
// eslint-disable-next-line react-compiler/react-compiler
if (isInitialRender.current) {
- Timing.start(CONST.TIMING.HOMEPAGE_INITIAL_RENDER);
-
const currentURL = getCurrentUrl();
if (currentURL) {
initialReportID = new URL(currentURL).pathname.match(CONST.REGEX.REPORT_ID_FROM_PATH)?.at(1);
@@ -313,8 +310,6 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
}
Download.clearDownloads();
- Timing.end(CONST.TIMING.HOMEPAGE_INITIAL_RENDER);
-
const unsubscribeOnyxModal = onyxSubscribe({
key: ONYXKEYS.MODAL,
callback: (modalArg) => {
diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts
index 5a594a19e15a..f778405ee6e8 100644
--- a/src/libs/actions/App.ts
+++ b/src/libs/actions/App.ts
@@ -179,7 +179,7 @@ function setSidebarLoaded() {
}
Onyx.set(ONYXKEYS.IS_SIDEBAR_LOADED, true);
- Performance.markStart(CONST.TIMING.REPORT_INITIAL_RENDER);
+ Performance.markEnd(CONST.TIMING.SIDEBAR_LOADED);
}
let appState: AppStateStatus;
diff --git a/src/pages/home/ReportScreen.tsx b/src/pages/home/ReportScreen.tsx
index 4c3ed5c705a5..62fd04f7572a 100644
--- a/src/pages/home/ReportScreen.tsx
+++ b/src/pages/home/ReportScreen.tsx
@@ -29,11 +29,9 @@ import usePrevious from '@hooks/usePrevious';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import useViewportOffsetTop from '@hooks/useViewportOffsetTop';
-import Timing from '@libs/actions/Timing';
import Log from '@libs/Log';
import Navigation from '@libs/Navigation/Navigation';
import clearReportNotifications from '@libs/Notification/clearReportNotifications';
-import Performance from '@libs/Performance';
import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
import * as ReportActionsUtils from '@libs/ReportActionsUtils';
import * as ReportUtils from '@libs/ReportUtils';
@@ -230,11 +228,7 @@ function ReportScreen({route, currentReportID = '', navigation}: ReportScreenPro
const [scrollPosition, setScrollPosition] = useState({});
const wasReportAccessibleRef = useRef(false);
- // eslint-disable-next-line react-compiler/react-compiler
- if (firstRenderRef.current) {
- Timing.start(CONST.TIMING.CHAT_RENDER);
- Performance.markStart(CONST.TIMING.CHAT_RENDER);
- }
+
const [isComposerFocus, setIsComposerFocus] = useState(false);
const shouldAdjustScrollView = useMemo(() => isComposerFocus && !modal?.willAlertModalBecomeVisible, [isComposerFocus, modal]);
const viewportOffsetTop = useViewportOffsetTop(shouldAdjustScrollView);
@@ -487,9 +481,6 @@ function ReportScreen({route, currentReportID = '', navigation}: ReportScreenPro
useAppFocusEvent(clearNotifications);
useEffect(() => {
- Timing.end(CONST.TIMING.CHAT_RENDER);
- Performance.markEnd(CONST.TIMING.CHAT_RENDER);
-
const interactionTask = InteractionManager.runAfterInteractions(() => {
ComposerActions.setShouldShowComposeInput(true);
});
diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
index 23b059f2fda2..4285916b593d 100644
--- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
+++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx
@@ -43,6 +43,7 @@ import ReportTypingIndicator from '@pages/home/report/ReportTypingIndicator';
import variables from '@styles/variables';
import * as EmojiPickerActions from '@userActions/EmojiPickerAction';
import * as Report from '@userActions/Report';
+import Timing from '@userActions/Timing';
import * as User from '@userActions/User';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
@@ -273,7 +274,8 @@ function ReportActionCompose({
Report.addAttachment(reportID, attachmentFileRef.current, newCommentTrimmed);
attachmentFileRef.current = null;
} else {
- Performance.markStart(CONST.TIMING.MESSAGE_SENT, {message: newCommentTrimmed});
+ Performance.markStart(CONST.TIMING.SEND_MESSAGE, {message: newCommentTrimmed});
+ Timing.start(CONST.TIMING.SEND_MESSAGE);
onSubmit(newCommentTrimmed);
}
},
diff --git a/src/pages/home/report/ReportActionItemThread.tsx b/src/pages/home/report/ReportActionItemThread.tsx
index 94a8592d9607..13072a653749 100644
--- a/src/pages/home/report/ReportActionItemThread.tsx
+++ b/src/pages/home/report/ReportActionItemThread.tsx
@@ -7,6 +7,7 @@ import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import Timing from '@libs/actions/Timing';
+import Performance from '@libs/Performance';
import * as Report from '@userActions/Report';
import CONST from '@src/CONST';
import type {Icon} from '@src/types/onyx/OnyxCommon';
@@ -45,8 +46,9 @@ function ReportActionItemThread({numberOfReplies, icons, mostRecentReply, childR
{
- Report.navigateToAndOpenChildReport(childReportID);
+ Performance.markStart(CONST.TIMING.OPEN_REPORT_THREAD);
Timing.start(CONST.TIMING.OPEN_REPORT_THREAD);
+ Report.navigateToAndOpenChildReport(childReportID);
}}
role={CONST.ROLE.BUTTON}
accessibilityLabel={`${numberOfReplies} ${replyText}`}
diff --git a/src/pages/home/report/ReportActionsView.tsx b/src/pages/home/report/ReportActionsView.tsx
index 8896611905ca..31c0bc0fa752 100755
--- a/src/pages/home/report/ReportActionsView.tsx
+++ b/src/pages/home/report/ReportActionsView.tsx
@@ -6,7 +6,6 @@ import {InteractionManager} from 'react-native';
import type {OnyxEntry} from 'react-native-onyx';
import {useOnyx} from 'react-native-onyx';
import useCopySelectionHelper from '@hooks/useCopySelectionHelper';
-import useInitialValue from '@hooks/useInitialValue';
import useNetwork from '@hooks/useNetwork';
import usePrevious from '@hooks/usePrevious';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
@@ -285,7 +284,6 @@ function ReportActionsView({
const hasMoreCached = reportActions.length < combinedReportActions.length;
const newestReportAction = useMemo(() => reportActions?.at(0), [reportActions]);
const mostRecentIOUReportActionID = useMemo(() => ReportActionsUtils.getMostRecentIOURequestActionID(reportActions), [reportActions]);
- const hasCachedActionOnFirstRender = useInitialValue(() => reportActions.length > 0);
const hasNewestReportAction = reportActions.at(0)?.created === report.lastVisibleActionCreated || reportActions.at(0)?.created === transactionThreadReport?.lastVisibleActionCreated;
const oldestReportAction = useMemo(() => reportActions?.at(-1), [reportActions]);
@@ -427,18 +425,16 @@ function ReportActionsView({
}
didLayout.current = true;
- // Capture the init measurement only once not per each chat switch as the value gets overwritten
- if (!ReportActionsView.initMeasured) {
- Performance.markEnd(CONST.TIMING.OPEN_REPORT);
- Performance.markEnd(CONST.TIMING.REPORT_INITIAL_RENDER);
- ReportActionsView.initMeasured = true;
- } else {
- Performance.markEnd(CONST.TIMING.SWITCH_REPORT);
- }
- Timing.end(CONST.TIMING.SWITCH_REPORT, hasCachedActionOnFirstRender ? CONST.TIMING.WARM : CONST.TIMING.COLD);
+
+ Performance.markEnd(CONST.TIMING.OPEN_REPORT);
+ Timing.end(CONST.TIMING.OPEN_REPORT);
+
+ Performance.markEnd(CONST.TIMING.OPEN_REPORT_THREAD);
Timing.end(CONST.TIMING.OPEN_REPORT_THREAD);
+
+ Performance.markEnd(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
Timing.end(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
- }, [hasCachedActionOnFirstRender]);
+ }, []);
// Check if the first report action in the list is the one we're currently linked to
const isTheFirstReportActionIsLinked = newestReportAction?.reportActionID === reportActionID;
@@ -501,7 +497,6 @@ function ReportActionsView({
}
ReportActionsView.displayName = 'ReportActionsView';
-ReportActionsView.initMeasured = false;
function arePropsEqual(oldProps: ReportActionsViewProps, newProps: ReportActionsViewProps): boolean {
if (!lodashIsEqual(oldProps.reportActions, newProps.reportActions)) {
diff --git a/src/pages/home/report/comment/TextCommentFragment.tsx b/src/pages/home/report/comment/TextCommentFragment.tsx
index 530acc46233d..ab06a594a17f 100644
--- a/src/pages/home/report/comment/TextCommentFragment.tsx
+++ b/src/pages/home/report/comment/TextCommentFragment.tsx
@@ -14,6 +14,7 @@ import * as EmojiUtils from '@libs/EmojiUtils';
import Performance from '@libs/Performance';
import * as ReportActionsUtils from '@libs/ReportActionsUtils';
import variables from '@styles/variables';
+import Timing from '@userActions/Timing';
import CONST from '@src/CONST';
import type {OriginalMessageSource} from '@src/types/onyx/OriginalMessage';
import type {Message} from '@src/types/onyx/ReportAction';
@@ -52,7 +53,8 @@ function TextCommentFragment({fragment, styleAsDeleted, styleAsMuted = false, so
const {shouldUseNarrowLayout} = useResponsiveLayout();
useEffect(() => {
- Performance.markEnd(CONST.TIMING.MESSAGE_SENT, {message: text});
+ Performance.markEnd(CONST.TIMING.SEND_MESSAGE, {message: text});
+ Timing.end(CONST.TIMING.SEND_MESSAGE);
}, [text]);
// If the only difference between fragment.text and fragment.html is
tags and emoji tag
diff --git a/src/pages/home/sidebar/SidebarLinks.tsx b/src/pages/home/sidebar/SidebarLinks.tsx
index e62f2525e70b..e2df0ff6f33a 100644
--- a/src/pages/home/sidebar/SidebarLinks.tsx
+++ b/src/pages/home/sidebar/SidebarLinks.tsx
@@ -17,9 +17,6 @@ import ROUTES from '@src/ROUTES';
import type {Report} from '@src/types/onyx';
type SidebarLinksProps = {
- /** Toggles the navigation menu open and closed */
- onLinkClick: () => void;
-
/** Safe area insets required for mobile devices margins */
insets: EdgeInsets;
@@ -40,7 +37,7 @@ type SidebarLinksProps = {
activeWorkspaceID: string | undefined;
};
-function SidebarLinks({onLinkClick, insets, optionListItems, isLoading, priorityMode = CONST.PRIORITY_MODE.DEFAULT, isActiveReport}: SidebarLinksProps) {
+function SidebarLinks({insets, optionListItems, isLoading, priorityMode = CONST.PRIORITY_MODE.DEFAULT, isActiveReport}: SidebarLinksProps) {
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
const {updateLocale} = useLocalize();
@@ -75,9 +72,8 @@ function SidebarLinks({onLinkClick, insets, optionListItems, isLoading, priority
return;
}
Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(option.reportID));
- onLinkClick();
},
- [shouldUseNarrowLayout, isActiveReport, onLinkClick],
+ [shouldUseNarrowLayout, isActiveReport],
);
const viewMode = priorityMode === CONST.PRIORITY_MODE.GSD ? CONST.OPTION_MODE.COMPACT : CONST.OPTION_MODE.DEFAULT;
diff --git a/src/pages/home/sidebar/SidebarLinksData.tsx b/src/pages/home/sidebar/SidebarLinksData.tsx
index 7dfbdbaf7299..931bfd6c0d66 100644
--- a/src/pages/home/sidebar/SidebarLinksData.tsx
+++ b/src/pages/home/sidebar/SidebarLinksData.tsx
@@ -24,14 +24,11 @@ type SidebarLinksDataOnyxProps = {
};
type SidebarLinksDataProps = SidebarLinksDataOnyxProps & {
- /** Toggles the navigation menu open and closed */
- onLinkClick: () => void;
-
/** Safe area insets required for mobile devices margins */
insets: EdgeInsets;
};
-function SidebarLinksData({insets, isLoadingApp = true, onLinkClick, priorityMode = CONST.PRIORITY_MODE.DEFAULT}: SidebarLinksDataProps) {
+function SidebarLinksData({insets, isLoadingApp = true, priorityMode = CONST.PRIORITY_MODE.DEFAULT}: SidebarLinksDataProps) {
const isFocused = useIsFocused();
const styles = useThemeStyles();
const activeWorkspaceID = useActiveWorkspaceFromNavigationState();
@@ -63,7 +60,6 @@ function SidebarLinksData({insets, isLoadingApp = true, onLinkClick, priorityMod
>
({
initialValue: CONST.PRIORITY_MODE.DEFAULT,
},
})(
- /*
+ /*
While working on audit on the App Start App metric we noticed that by memoizing SidebarLinksData we can avoid 2 additional run of getOrderedReportIDs.
With that we can reduce app start up time by ~2s on heavy account.
More details - https://github.com/Expensify/App/issues/35234#issuecomment-1926914534
*/
memo(
SidebarLinksData,
- (prevProps, nextProps) =>
- prevProps.isLoadingApp === nextProps.isLoadingApp &&
- prevProps.priorityMode === nextProps.priorityMode &&
- lodashIsEqual(prevProps.insets, nextProps.insets) &&
- prevProps.onLinkClick === nextProps.onLinkClick,
+ (prevProps, nextProps) => prevProps.isLoadingApp === nextProps.isLoadingApp && prevProps.priorityMode === nextProps.priorityMode && lodashIsEqual(prevProps.insets, nextProps.insets),
),
);
diff --git a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx
index e77f2000b85f..057189ae22c1 100644
--- a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx
+++ b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx
@@ -12,18 +12,9 @@ import TopBar from '@libs/Navigation/AppNavigator/createCustomBottomTabNavigator
import Navigation from '@libs/Navigation/Navigation';
import Performance from '@libs/Performance';
import SidebarLinksData from '@pages/home/sidebar/SidebarLinksData';
-import Timing from '@userActions/Timing';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
-/**
- * Function called when a pinned chat is selected.
- */
-const startTimer = () => {
- Timing.start(CONST.TIMING.SWITCH_REPORT);
- Performance.markStart(CONST.TIMING.SWITCH_REPORT);
-};
-
function BaseSidebarScreen() {
const styles = useThemeStyles();
const activeWorkspaceID = useActiveWorkspaceFromNavigationState();
@@ -33,7 +24,6 @@ function BaseSidebarScreen() {
useEffect(() => {
Performance.markStart(CONST.TIMING.SIDEBAR_LOADED);
- Timing.start(CONST.TIMING.SIDEBAR_LOADED);
}, []);
useEffect(() => {
@@ -63,10 +53,7 @@ function BaseSidebarScreen() {
shouldDisplaySearch={shouldDisplaySearch}
/>
-
+
>
)}
diff --git a/tests/utils/LHNTestUtils.tsx b/tests/utils/LHNTestUtils.tsx
index ae9afd095d37..6fb767cfb3e3 100644
--- a/tests/utils/LHNTestUtils.tsx
+++ b/tests/utils/LHNTestUtils.tsx
@@ -251,7 +251,6 @@ function MockedSidebarLinks({currentReportID = ''}: MockedSidebarLinksProps) {
* */}
{}}
insets={{
top: 0,
left: 0,