diff --git a/src/components/TestToolMenu.tsx b/src/components/TestToolMenu.tsx
index cb8072f2c22b3..d31450a022500 100644
--- a/src/components/TestToolMenu.tsx
+++ b/src/components/TestToolMenu.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import useIsAuthenticated from '@hooks/useIsAuthenticated';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
+import {useSidebarOrderedReports} from '@hooks/useSidebarOrderedReports';
import useThemeStyles from '@hooks/useThemeStyles';
import {isUsingStagingApi} from '@libs/ApiUtils';
import {setShouldFailAllRequests, setShouldForceOffline, setShouldSimulatePoorConnection} from '@userActions/Network';
@@ -23,6 +24,7 @@ function TestToolMenu() {
const [isDebugModeEnabled = false] = useOnyx(ONYXKEYS.IS_DEBUG_MODE_ENABLED, {canBeMissing: true});
const styles = useThemeStyles();
const {translate} = useLocalize();
+ const {clearLHNCache} = useSidebarOrderedReports();
// Check if the user is authenticated to show options that require authentication
const isAuthenticated = useIsAuthenticated();
@@ -72,6 +74,15 @@ function TestToolMenu() {
onPress={() => expireSessionWithDelay()}
/>
+
+ {/* Clears the useSidebarOrderedReports cache to re-compute from latest onyx values */}
+
+
+
>
)}
diff --git a/src/hooks/useSidebarOrderedReports.tsx b/src/hooks/useSidebarOrderedReports.tsx
index 0809fa7e72d6b..d33d7edd4a21a 100644
--- a/src/hooks/useSidebarOrderedReports.tsx
+++ b/src/hooks/useSidebarOrderedReports.tsx
@@ -31,6 +31,7 @@ type SidebarOrderedReportsContextValue = {
orderedReportIDs: string[];
currentReportID: string | undefined;
policyMemberAccountIDs: number[];
+ clearLHNCache: () => void;
};
type ReportsToDisplayInLHN = Record;
@@ -40,6 +41,7 @@ const SidebarOrderedReportsContext = createContext {},
});
const policySelector = (policy: OnyxEntry): PartialPolicyForSidebar =>
@@ -81,6 +83,10 @@ function SidebarOrderedReportsContextProvider({
const derivedCurrentReportID = currentReportIDForTests ?? currentReportIDValue?.currentReportID;
const prevDerivedCurrentReportID = usePrevious(derivedCurrentReportID);
+ // we need to force reportsToDisplayInLHN to re-compute when we clear currentReportsToDisplay, but the way it currently works relies on not having currentReportsToDisplay as a memo dependency, so we just need something we can change to trigger it
+ // I don't like it either, but clearing the cache is only a hack for the debug modal and I will endeavor to make it better as I work to improve the cache correctness of the LHN more broadly
+ const [clearCacheDummyCounter, setClearCacheDummyCounter] = useState(0);
+
const policyMemberAccountIDs = useMemo(() => getPolicyEmployeeListByIdWithoutCurrentUser(policies, undefined, accountID), [policies, accountID]);
const prevBetas = usePrevious(betas);
const prevPriorityMode = usePrevious(priorityMode);
@@ -185,6 +191,7 @@ function SidebarOrderedReportsContextProvider({
draftComments: reportsDrafts,
});
} else {
+ Log.info('[useSidebarOrderedReports] building reportsToDisplay from scratch');
reportsToDisplay = SidebarUtils.getReportsToDisplayInLHN(
derivedCurrentReportID,
chatReports,
@@ -201,7 +208,19 @@ function SidebarOrderedReportsContextProvider({
return reportsToDisplay;
// Rule disabled intentionally — triggering a re-render on currentReportsToDisplay would cause an infinite loop
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
- }, [getUpdatedReports, chatReports, derivedCurrentReportID, priorityMode, betas, policies, transactionViolations, reportNameValuePairs, reportAttributes, reportsDrafts]);
+ }, [
+ getUpdatedReports,
+ chatReports,
+ derivedCurrentReportID,
+ priorityMode,
+ betas,
+ policies,
+ transactionViolations,
+ reportNameValuePairs,
+ reportAttributes,
+ reportsDrafts,
+ clearCacheDummyCounter,
+ ]);
const deepComparedReportsToDisplayInLHN = useDeepCompareRef(reportsToDisplayInLHN);
const deepComparedReportsDrafts = useDeepCompareRef(reportsDrafts);
@@ -232,6 +251,12 @@ function SidebarOrderedReportsContextProvider({
const orderedReports = useMemo(() => getOrderedReports(orderedReportIDs), [getOrderedReports, orderedReportIDs]);
+ const clearLHNCache = useCallback(() => {
+ Log.info('[useSidebarOrderedReports] Clearing sidebar cache manually via debug modal');
+ setCurrentReportsToDisplay({});
+ setClearCacheDummyCounter((current) => current + 1);
+ }, []);
+
const contextValue: SidebarOrderedReportsContextValue = useMemo(() => {
// We need to make sure the current report is in the list of reports, but we do not want
// to have to re-generate the list every time the currentReportID changes. To do that
@@ -256,6 +281,7 @@ function SidebarOrderedReportsContextProvider({
orderedReportIDs: updatedReportIDs,
currentReportID: derivedCurrentReportID,
policyMemberAccountIDs,
+ clearLHNCache,
};
}
@@ -264,8 +290,9 @@ function SidebarOrderedReportsContextProvider({
orderedReportIDs,
currentReportID: derivedCurrentReportID,
policyMemberAccountIDs,
+ clearLHNCache,
};
- }, [getOrderedReportIDs, orderedReportIDs, derivedCurrentReportID, policyMemberAccountIDs, shouldUseNarrowLayout, getOrderedReports, orderedReports]);
+ }, [getOrderedReportIDs, orderedReportIDs, derivedCurrentReportID, policyMemberAccountIDs, shouldUseNarrowLayout, getOrderedReports, orderedReports, clearLHNCache]);
const currentDeps = {
priorityMode,
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 3bf6eb8ebcb8c..7434712b5d580 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1859,6 +1859,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Sentry-Anfragen in der Konsole protokollieren',
sentryHighlightedSpanOps: 'Hervorgehobene Span-Namen',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Cache für linke Seitenleiste',
+ clearleftHandNavCache: 'Löschen',
},
debugConsole: {
saveLog: 'Protokoll speichern',
diff --git a/src/languages/en.ts b/src/languages/en.ts
index fc3b9e4cbd34a..2ccc235b1d8bf 100755
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -1823,6 +1823,8 @@ const translations = {
invalidFile: 'Invalid file',
invalidFileDescription: 'The file you are trying to import is not valid. Please try again.',
invalidateWithDelay: 'Invalidate with delay',
+ leftHandNavCache: 'Left Hand Nav cache',
+ clearleftHandNavCache: 'Clear',
recordTroubleshootData: 'Record Troubleshoot Data',
softKillTheApp: 'Soft kill the app',
kill: 'Kill',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 3a370bfc8e2c0..d2a98baf84aa9 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1518,6 +1518,8 @@ const translations: TranslationDeepObject = {
invalidFile: 'Archivo inválido',
invalidFileDescription: 'El archivo que ests intentando importar no es válido. Por favor, inténtalo de nuevo.',
invalidateWithDelay: 'Invalidar con retraso',
+ leftHandNavCache: 'Caché del menú de navegación izquierdo',
+ clearleftHandNavCache: 'borrar',
recordTroubleshootData: 'Registrar datos de resolución de problemas',
softKillTheApp: 'Desactivar la aplicación',
kill: 'Matar',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index db35ff1712160..ae4aa6de27a8c 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1860,6 +1860,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Enregistrer les requêtes Sentry dans la console',
sentryHighlightedSpanOps: 'Noms de spans mis en valeur',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Cache de navigation gauche',
+ clearleftHandNavCache: 'Effacer',
},
debugConsole: {
saveLog: 'Enregistrer le journal',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index ca5530401bcae..f5f8c770e9546 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1853,6 +1853,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Registra le richieste Sentry nella console',
sentryHighlightedSpanOps: 'Nomi degli span evidenziati',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Cache della navigazione sinistra',
+ clearleftHandNavCache: 'Cancella',
},
debugConsole: {
saveLog: 'Salva registro',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 04ae3d174601f..933e90ff7bd4b 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1852,6 +1852,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Sentryリクエストをコンソールに記録',
sentryHighlightedSpanOps: 'ハイライト表示するspan名',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: '左側ナビキャッシュ',
+ clearleftHandNavCache: 'クリア',
},
debugConsole: {
saveLog: 'ログを保存',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 06e93f0ab1454..d500753da36c3 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1852,6 +1852,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Sentry-verzoeken naar console loggen',
sentryHighlightedSpanOps: 'Geresalteerde spannamen',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Cache van linkernavigatie',
+ clearleftHandNavCache: 'Wissen',
},
debugConsole: {
saveLog: 'Log opslaan',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index e55050b7811cf..4ff76881f3dc4 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1849,6 +1849,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Rejestruj żądania Sentry w konsoli',
sentryHighlightedSpanOps: 'Nazwy wyróżnionych spanów',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Pamięć podręczna lewego panelu nawigacyjnego',
+ clearleftHandNavCache: 'Wyczyść',
},
debugConsole: {
saveLog: 'Zapisz log',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 66f72484e6560..3f17144f3a69d 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1848,6 +1848,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: 'Registrar solicitações do Sentry no console',
sentryHighlightedSpanOps: 'Nomes de spans destacados',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: 'Cache da navegação lateral esquerda',
+ clearleftHandNavCache: 'Limpar',
},
debugConsole: {
saveLog: 'Salvar log',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index d7e82bb95e7b5..471ad47fe709c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1825,6 +1825,8 @@ const translations: TranslationDeepObject = {
sentryDebugDescription: '将Sentry请求记录到控制台',
sentryHighlightedSpanOps: '突出显示的Span名称',
sentryHighlightedSpanOpsPlaceholder: 'ui.interaction.click, navigation, ui.load',
+ leftHandNavCache: '左侧导航缓存',
+ clearleftHandNavCache: '清除',
},
debugConsole: {
saveLog: '保存日志',