feat: preview vault images in app

This commit is contained in:
lucaronin
2026-04-27 00:36:24 +02:00
parent 918419e371
commit 4ef6edfb10
13 changed files with 647 additions and 87 deletions

38
src/utils/filePreview.ts Normal file
View File

@@ -0,0 +1,38 @@
import type { VaultEntry } from '../types'
const IMAGE_PREVIEW_EXTENSIONS = new Set([
'apng',
'avif',
'bmp',
'gif',
'ico',
'jpeg',
'jpg',
'png',
'svg',
'tif',
'tiff',
'webp',
])
function extensionFromFilename(filename: string): string | null {
const lastSegment = filename.split(/[\\/]/u).pop() ?? filename
const dotIndex = lastSegment.lastIndexOf('.')
if (dotIndex <= 0 || dotIndex === lastSegment.length - 1) return null
return lastSegment.slice(dotIndex + 1).toLowerCase()
}
export function previewExtension(entry: Pick<VaultEntry, 'filename' | 'path'>): string | null {
return extensionFromFilename(entry.filename) ?? extensionFromFilename(entry.path)
}
export function isImagePreviewEntry(entry: Pick<VaultEntry, 'fileKind' | 'filename' | 'path'>): boolean {
if (entry.fileKind !== 'binary') return false
const extension = previewExtension(entry)
return extension ? IMAGE_PREVIEW_EXTENSIONS.has(extension) : false
}
export function previewFileTypeLabel(entry: Pick<VaultEntry, 'filename' | 'path'>): string {
const extension = previewExtension(entry)
return extension ? `${extension.toUpperCase()} file` : 'File'
}