From 417ac4911ed0536ec6c134f6f5683e0778fbe05a Mon Sep 17 00:00:00 2001 From: hurali97 Date: Tue, 6 Aug 2024 18:08:19 +0500 Subject: [PATCH 1/7] perf: remove extra condition --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 142b319240f1..0fa1abc31be0 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -739,7 +739,7 @@ function getPolicyName(report: OnyxInputOrEntry, returnEmptyIfNotFound = return noPolicyFound; } - if ((!allPolicies || Object.keys(allPolicies).length === 0) && !report?.policyName) { + if (!allPolicies && !report?.policyName) { return unavailableTranslation; } const finalPolicy = policy ?? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]; From f4faab659670001af38479b338fbf1c01d6df792 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Tue, 6 Aug 2024 18:25:42 +0500 Subject: [PATCH 2/7] perf: add cache for workspace icons --- src/libs/ReportUtils.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0fa1abc31be0..8501e7231f22 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1887,11 +1887,20 @@ function getIconsForParticipants(participants: number[], personalDetails: OnyxIn return avatars; } +/** + * Cache the workspace icons + */ +const workSpaceIconsCache = new Map(); + /** * Given a report, return the associated workspace icon. */ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOrEntry): Icon { const workspaceName = getPolicyName(report, false, policy); + const iconFromCache = workSpaceIconsCache.get(workspaceName); + if (iconFromCache) { + return iconFromCache; + } const policyExpenseChatAvatarSource = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL : getDefaultWorkspaceAvatar(workspaceName); @@ -1902,6 +1911,7 @@ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOr name: workspaceName, id: report?.policyID, }; + workSpaceIconsCache.set(workspaceName, workspaceIcon); return workspaceIcon; } From d0cca3ff8a0b088e8c251a7cdaea3e5f1ed31336 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Wed, 7 Aug 2024 15:54:04 +0500 Subject: [PATCH 3/7] fix: avatar not updating --- src/libs/ReportUtils.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8501e7231f22..0b32513574f0 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1898,12 +1898,14 @@ const workSpaceIconsCache = new Map(); function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOrEntry): Icon { const workspaceName = getPolicyName(report, false, policy); const iconFromCache = workSpaceIconsCache.get(workspaceName); - if (iconFromCache) { + const avatarURL = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL; + + const isSameAvatarURL = iconFromCache?.source === avatarURL; + const isDefaultWorkspaceAvatar = !avatarURL && typeof iconFromCache?.source !== 'string'; + if (iconFromCache && (isSameAvatarURL || isDefaultWorkspaceAvatar)) { return iconFromCache; } - const policyExpenseChatAvatarSource = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL - ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL - : getDefaultWorkspaceAvatar(workspaceName); + const policyExpenseChatAvatarSource = avatarURL ?? getDefaultWorkspaceAvatar(workspaceName); const workspaceIcon: Icon = { source: policyExpenseChatAvatarSource ?? '', From 452b2374652ff5c8fe82cd1aa7006673fc2efbeb Mon Sep 17 00:00:00 2001 From: hurali97 Date: Thu, 8 Aug 2024 17:08:51 +0500 Subject: [PATCH 4/7] fix: use policyID as key --- src/libs/ReportUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0b32513574f0..efbf6e508c22 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1897,7 +1897,7 @@ const workSpaceIconsCache = new Map(); */ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOrEntry): Icon { const workspaceName = getPolicyName(report, false, policy); - const iconFromCache = workSpaceIconsCache.get(workspaceName); + const iconFromCache = workSpaceIconsCache.get(report?.policyID ?? workspaceName); const avatarURL = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL; const isSameAvatarURL = iconFromCache?.source === avatarURL; @@ -1913,7 +1913,7 @@ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOr name: workspaceName, id: report?.policyID, }; - workSpaceIconsCache.set(workspaceName, workspaceIcon); + workSpaceIconsCache.set(report?.policyID ?? workspaceName, workspaceIcon); return workspaceIcon; } From ebe0376c6263b625e1d320793433a44b5f5990a6 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Thu, 8 Aug 2024 18:00:07 +0500 Subject: [PATCH 5/7] fix: use correct conditions --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index efbf6e508c22..43cd2c7b87d9 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -739,7 +739,7 @@ function getPolicyName(report: OnyxInputOrEntry, returnEmptyIfNotFound = return noPolicyFound; } - if (!allPolicies && !report?.policyName) { + if ((!allPolicies || Object.keys(allPolicies).length === 0) && !report?.policyName) { return unavailableTranslation; } const finalPolicy = policy ?? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]; From f0bf02482fbe903c06bed7184fb0b59eb150c730 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Fri, 9 Aug 2024 14:57:32 +0500 Subject: [PATCH 6/7] fix: use logical OR operator instead of nullish coalescing --- src/libs/ReportUtils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 43cd2c7b87d9..da85810622e1 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1905,7 +1905,9 @@ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOr if (iconFromCache && (isSameAvatarURL || isDefaultWorkspaceAvatar)) { return iconFromCache; } - const policyExpenseChatAvatarSource = avatarURL ?? getDefaultWorkspaceAvatar(workspaceName); + // `avatarURL` can be an empty string, so we have to use || operator here + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + const policyExpenseChatAvatarSource = avatarURL || getDefaultWorkspaceAvatar(workspaceName); const workspaceIcon: Icon = { source: policyExpenseChatAvatarSource ?? '', From 1365d100f71a2527c8ab1260244113f44d93be4e Mon Sep 17 00:00:00 2001 From: hurali97 Date: Fri, 9 Aug 2024 16:34:33 +0500 Subject: [PATCH 7/7] fix: update cache when workspace name changes --- src/libs/ReportUtils.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index da85810622e1..80a773e344db 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1890,20 +1890,22 @@ function getIconsForParticipants(participants: number[], personalDetails: OnyxIn /** * Cache the workspace icons */ -const workSpaceIconsCache = new Map(); +const workSpaceIconsCache = new Map(); /** * Given a report, return the associated workspace icon. */ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOrEntry): Icon { const workspaceName = getPolicyName(report, false, policy); - const iconFromCache = workSpaceIconsCache.get(report?.policyID ?? workspaceName); + const cacheKey = report?.policyID ?? workspaceName; + const iconFromCache = workSpaceIconsCache.get(cacheKey); const avatarURL = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`]?.avatarURL; - const isSameAvatarURL = iconFromCache?.source === avatarURL; - const isDefaultWorkspaceAvatar = !avatarURL && typeof iconFromCache?.source !== 'string'; - if (iconFromCache && (isSameAvatarURL || isDefaultWorkspaceAvatar)) { - return iconFromCache; + const isSameAvatarURL = iconFromCache?.icon?.source === avatarURL; + const isDefaultWorkspaceAvatar = !avatarURL && typeof iconFromCache?.icon?.source !== 'string'; + const hasWorkSpaceNameChanged = iconFromCache?.name !== workspaceName; + if (iconFromCache && (isSameAvatarURL || isDefaultWorkspaceAvatar) && !hasWorkSpaceNameChanged) { + return iconFromCache.icon; } // `avatarURL` can be an empty string, so we have to use || operator here // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing @@ -1915,7 +1917,7 @@ function getWorkspaceIcon(report: OnyxInputOrEntry, policy?: OnyxInputOr name: workspaceName, id: report?.policyID, }; - workSpaceIconsCache.set(report?.policyID ?? workspaceName, workspaceIcon); + workSpaceIconsCache.set(cacheKey, {name: workspaceName, icon: workspaceIcon}); return workspaceIcon; }