From 76320f227f31cc93ec3f4cf318d185cfb8a70955 Mon Sep 17 00:00:00 2001 From: "Calum H." Date: Mon, 6 Jul 2026 18:06:41 +0100 Subject: [PATCH] fix: dont prefetch file contents if it's not editable/viewable (#6632) --- .../layouts/shared/files-tab/components/FileTableRow.vue | 9 ++------- packages/ui/src/layouts/shared/files-tab/layout.vue | 4 ++-- packages/ui/src/utils/file-extensions.ts | 8 ++++++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/ui/src/layouts/shared/files-tab/components/FileTableRow.vue b/packages/ui/src/layouts/shared/files-tab/components/FileTableRow.vue index 9384e3b2a0..05816710aa 100644 --- a/packages/ui/src/layouts/shared/files-tab/components/FileTableRow.vue +++ b/packages/ui/src/layouts/shared/files-tab/components/FileTableRow.vue @@ -118,11 +118,7 @@ import { defineMessages, useVIntl } from '#ui/composables/i18n' import { injectNotificationManager } from '#ui/providers/web-notifications' import { getFileExtensionIcon } from '#ui/utils/auto-icons' import { commonMessages } from '#ui/utils/common-messages' -import { - getFileExtension, - isEditableFile as isEditableFileExt, - isImageFile, -} from '#ui/utils/file-extensions' +import { canOpenInFileEditor, getFileExtension } from '#ui/utils/file-extensions' import { fileDragActive, @@ -303,8 +299,7 @@ const formattedCreationDate = computed(() => { const isEditableFile = computed(() => { if (props.type === 'file') { - const ext = fileExtension.value - return !props.name.includes('.') || isEditableFileExt(ext) || isImageFile(ext) + return canOpenInFileEditor(props.name) } return false }) diff --git a/packages/ui/src/layouts/shared/files-tab/layout.vue b/packages/ui/src/layouts/shared/files-tab/layout.vue index 55d94c34d2..75847b76eb 100644 --- a/packages/ui/src/layouts/shared/files-tab/layout.vue +++ b/packages/ui/src/layouts/shared/files-tab/layout.vue @@ -225,7 +225,7 @@ import { useVirtualScroll } from '#ui/composables/virtual-scroll' import { injectFilePicker } from '#ui/providers/file-picker' import { injectNotificationManager } from '#ui/providers/web-notifications' import { commonMessages } from '#ui/utils/common-messages' -import { getFileExtension } from '#ui/utils/file-extensions' +import { canOpenInFileEditor, getFileExtension } from '#ui/utils/file-extensions' import FileEditor from './components/editor/FileEditor.vue' import FileContextMenu from './components/FileContextMenu.vue' @@ -650,7 +650,7 @@ function handleItemHover(item: { type: string; path: string; name: string }) { : `${currentPath}/${item.name}` ctx.prefetchDirectory?.(navPath) }, 150) - } else { + } else if (canOpenInFileEditor(item.name)) { prefetchTimeout = setTimeout(() => { ctx.prefetchFile?.(item.path) }, 150) diff --git a/packages/ui/src/utils/file-extensions.ts b/packages/ui/src/utils/file-extensions.ts index 78b88c067a..16e4022170 100644 --- a/packages/ui/src/utils/file-extensions.ts +++ b/packages/ui/src/utils/file-extensions.ts @@ -89,6 +89,14 @@ export function isEditableFile(ext: string): boolean { return isCodeFile(ext) || isTextFile(ext) } +/** + * Check if a file can be opened in the file editor + */ +export function canOpenInFileEditor(filename: string): boolean { + const ext = getFileExtension(filename) + return !filename.includes('.') || isEditableFile(ext) || isImageFile(ext) +} + /** * Get Ace editor language mode for a file extension */