diff --git a/src/__tests__/renderer/utils/fileExplorer.test.ts b/src/__tests__/renderer/utils/fileExplorer.test.ts index 845da367..6d4346ba 100644 --- a/src/__tests__/renderer/utils/fileExplorer.test.ts +++ b/src/__tests__/renderer/utils/fileExplorer.test.ts @@ -94,6 +94,38 @@ describe('fileExplorer utils', () => { }); }); + describe('image files (previewable inline)', () => { + it('returns false for PNG files (previewable)', () => { + expect(shouldOpenExternally('image.png')).toBe(false); + expect(shouldOpenExternally('screenshot.PNG')).toBe(false); + }); + + it('returns false for SVG files (previewable)', () => { + expect(shouldOpenExternally('icon.svg')).toBe(false); + expect(shouldOpenExternally('logo.SVG')).toBe(false); + }); + + it('returns false for JPEG files (previewable)', () => { + expect(shouldOpenExternally('photo.jpg')).toBe(false); + expect(shouldOpenExternally('photo.jpeg')).toBe(false); + expect(shouldOpenExternally('photo.JPEG')).toBe(false); + }); + + it('returns false for other previewable image formats', () => { + expect(shouldOpenExternally('image.gif')).toBe(false); + expect(shouldOpenExternally('image.webp')).toBe(false); + expect(shouldOpenExternally('image.bmp')).toBe(false); + expect(shouldOpenExternally('favicon.ico')).toBe(false); + }); + + it('returns true for non-previewable image formats', () => { + expect(shouldOpenExternally('photo.tiff')).toBe(true); + expect(shouldOpenExternally('photo.tif')).toBe(true); + expect(shouldOpenExternally('photo.heic')).toBe(true); + expect(shouldOpenExternally('photo.heif')).toBe(true); + }); + }); + describe('code and text files', () => { it('returns false for TypeScript files', () => { expect(shouldOpenExternally('app.ts')).toBe(false); diff --git a/src/renderer/utils/fileExplorer.ts b/src/renderer/utils/fileExplorer.ts index 850cbcc1..2b518811 100644 --- a/src/renderer/utils/fileExplorer.ts +++ b/src/renderer/utils/fileExplorer.ts @@ -2,18 +2,24 @@ import { getAllFolderPaths as getAllFolderPathsShared, walkTreePartitioned, } from '../../shared/treeUtils'; +import { isImageFile } from '../../shared/gitUtils'; /** * Check if a file should be opened in external app based on extension */ export function shouldOpenExternally(filename: string): boolean { + // Images that can be previewed inline should NOT open externally + if (isImageFile(filename)) { + return false; + } + const ext = filename.split('.').pop()?.toLowerCase(); // File types that should open in default system app const externalExtensions = [ // Documents 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', - // Images (handled separately for preview, but open externally if double-clicked from file tree) - 'png', 'jpg', 'jpeg', 'gif', 'bmp', 'svg', 'webp', 'tiff', 'tif', 'heic', 'heif', + // Images that can't be previewed inline (raw formats, etc.) + 'tiff', 'tif', 'heic', 'heif', // macOS/iOS specific 'icns', 'car', 'actool', // Design files