From 47b9e9c5bcb89e54872e0e9ff8293cc0bb832d6c Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Thu, 21 Aug 2025 07:50:57 +0300 Subject: [PATCH] fix(fe2): various performance fixes (#5278) * fix(fe2): buggy merge policies causing cache read failures * improved CWV reporting * improved preview lcp * more eager load improvements * more eager load improvements * SSR friendly relative time * import fixes --- .../WorkspaceSwitcher/WorkspaceSwitcher.vue | 18 ++--- .../frontend-2/components/preview/Image.vue | 9 ++- .../project/model-page/versions/Card.vue | 1 + .../page/latest-items/comments/GridItem.vue | 1 + .../page/latest-items/comments/ListItem.vue | 1 + .../project/page/models/StructureItem.vue | 1 + .../project/page/models/UploadsDialog.vue | 1 + .../project/page/models/card/UpdatedTime.vue | 5 +- .../project/page/settings/tokens/Tokens.vue | 2 +- .../projects/ProjectDashboardCard.vue | 1 + .../settings/shared/projects/index.vue | 1 + .../workspaces/members/GuestsTable.vue | 1 + .../workspaces/members/InvitesTable.vue | 1 + .../workspaces/members/JoinRequestsTable.vue | 1 + .../workspaces/members/MembersTable.vue | 1 + .../singleton/FileUploadErrorDialog.vue | 1 + .../viewer/anchored-point/thread/Comment.vue | 1 + .../components/viewer/comments/ListItem.vue | 1 + .../viewer/compare-changes/Version.vue | 1 + .../components/viewer/models/Card.vue | 1 + .../viewer/models/versions/ActiveCard.vue | 1 + .../viewer/models/versions/Card.vue | 1 + .../viewer/resources/VersionCard.vue | 1 + .../viewer/saved-views/panel/View.vue | 1 + .../dateFormatter.ts => composables/dates.ts} | 61 +++++++++++++--- .../frontend-2/lib/core/configs/apollo.ts | 5 +- .../lib/core/helpers/apolloSetup.ts | 10 +-- .../lib/projects/composables/previewImage.ts | 71 ++++++++++++++++--- packages/frontend-2/package.json | 2 +- packages/frontend-2/plugins/010-hydration.ts | 18 +++++ packages/frontend-2/plugins/020-rum.ts | 15 +++- yarn.lock | 10 +-- 32 files changed, 200 insertions(+), 46 deletions(-) rename packages/frontend-2/{utils/dateFormatter.ts => composables/dates.ts} (53%) create mode 100644 packages/frontend-2/plugins/010-hydration.ts diff --git a/packages/frontend-2/components/header/WorkspaceSwitcher/WorkspaceSwitcher.vue b/packages/frontend-2/components/header/WorkspaceSwitcher/WorkspaceSwitcher.vue index 495248d04..999c6c925 100644 --- a/packages/frontend-2/components/header/WorkspaceSwitcher/WorkspaceSwitcher.vue +++ b/packages/frontend-2/components/header/WorkspaceSwitcher/WorkspaceSwitcher.vue @@ -180,12 +180,14 @@ const hasDiscoverableWorkspacesOrJoinRequests = computed( () => discoverableWorkspacesAndJoinRequestsCount.value > 0 ) -onActiveWorkspaceResult(({ data }) => { - if (data?.activeUser?.activeWorkspace) { - $intercom.updateCompany({ - id: data.activeUser.activeWorkspace.id, - name: data.activeUser.activeWorkspace.name - }) - } -}) +if (import.meta.client) { + onActiveWorkspaceResult(({ data }) => { + if (data?.activeUser?.activeWorkspace) { + $intercom.updateCompany({ + id: data.activeUser.activeWorkspace.id, + name: data.activeUser.activeWorkspace.name + }) + } + }) +} diff --git a/packages/frontend-2/components/preview/Image.vue b/packages/frontend-2/components/preview/Image.vue index 9eebc01dd..a27613428 100644 --- a/packages/frontend-2/components/preview/Image.vue +++ b/packages/frontend-2/components/preview/Image.vue @@ -89,9 +89,11 @@ const props = withDefaults( defineProps<{ previewUrl: string panoramaOnHover?: boolean + eagerLoad?: boolean }>(), { - panoramaOnHover: true + panoramaOnHover: true, + eagerLoad: true } ) @@ -109,7 +111,10 @@ const { isLoadingPanorama, hasDoneFirstLoad, isPanoramaPlaceholder -} = usePreviewImageBlob(basePreviewUrl, { enabled: isInViewport }) +} = usePreviewImageBlob(basePreviewUrl, { + enabled: isInViewport, + eagerLoad: props.eagerLoad +}) const hovered = ref(false) const panorama = ref(null as Nullable) diff --git a/packages/frontend-2/components/project/model-page/versions/Card.vue b/packages/frontend-2/components/project/model-page/versions/Card.vue index 5591643ef..ca564d7a2 100644 --- a/packages/frontend-2/components/project/model-page/versions/Card.vue +++ b/packages/frontend-2/components/project/model-page/versions/Card.vue @@ -171,6 +171,7 @@ const props = defineProps<{ selected?: boolean }>() +const { formattedRelativeDate, formattedFullDate } = useDateFormatters() const isAutomateModuleEnabled = useIsAutomateModuleEnabled() const showActionsMenu = ref(false) diff --git a/packages/frontend-2/components/project/page/latest-items/comments/GridItem.vue b/packages/frontend-2/components/project/page/latest-items/comments/GridItem.vue index f6fcf0a4d..4c39125ef 100644 --- a/packages/frontend-2/components/project/page/latest-items/comments/GridItem.vue +++ b/packages/frontend-2/components/project/page/latest-items/comments/GridItem.vue @@ -74,6 +74,7 @@ const props = defineProps<{ const { screenshot } = useCommentScreenshotImage( computed(() => props.thread.screenshot) ) +const { formattedRelativeDate, formattedFullDate } = useDateFormatters() const isLimited = computed(() => { return !props.thread.rawText diff --git a/packages/frontend-2/components/project/page/latest-items/comments/ListItem.vue b/packages/frontend-2/components/project/page/latest-items/comments/ListItem.vue index 79101ef6a..ada195cb2 100644 --- a/packages/frontend-2/components/project/page/latest-items/comments/ListItem.vue +++ b/packages/frontend-2/components/project/page/latest-items/comments/ListItem.vue @@ -57,6 +57,7 @@ const props = defineProps<{ const { backgroundImage } = useCommentScreenshotImage( computed(() => props.thread.screenshot) ) +const { formattedRelativeDate, formattedFullDate } = useDateFormatters() const updatedAt = computed(() => { return { diff --git a/packages/frontend-2/components/project/page/models/StructureItem.vue b/packages/frontend-2/components/project/page/models/StructureItem.vue index 962291726..5c6782ca1 100644 --- a/packages/frontend-2/components/project/page/models/StructureItem.vue +++ b/packages/frontend-2/components/project/page/models/StructureItem.vue @@ -339,6 +339,7 @@ const props = defineProps<{ }>() const router = useRouter() +const { formattedRelativeDate, formattedFullDate } = useDateFormatters() const importArea = ref( null as Nullable<{ diff --git a/packages/frontend-2/components/project/page/models/UploadsDialog.vue b/packages/frontend-2/components/project/page/models/UploadsDialog.vue index 20ec8b16e..5140e7cdd 100644 --- a/packages/frontend-2/components/project/page/models/UploadsDialog.vue +++ b/packages/frontend-2/components/project/page/models/UploadsDialog.vue @@ -146,6 +146,7 @@ const props = defineProps<{ const open = defineModel('open', { required: true }) const { copy } = useClipboard() +const { formattedRelativeDate, formattedFullDate } = useDateFormatters() const { getErrorMessage, convertUploadToFailedJob } = useFailedFileImportJobUtils() const { diff --git a/packages/frontend-2/components/project/page/models/card/UpdatedTime.vue b/packages/frontend-2/components/project/page/models/card/UpdatedTime.vue index 8a7f65f36..3ef074275 100644 --- a/packages/frontend-2/components/project/page/models/card/UpdatedTime.vue +++ b/packages/frontend-2/components/project/page/models/card/UpdatedTime.vue @@ -7,15 +7,16 @@