feat(MediaManager): refine file extension sets and enhance image URL handling for SVG support

This commit is contained in:
Jaime Idolpx 2026-06-09 03:34:07 -04:00
parent e4f7950a56
commit 61b5c6dc39

View File

@ -80,9 +80,10 @@ type ViewMode = 'text' | 'markdown' | 'json' | 'xml' | 'hex' | 'image' | 'config
// ─── Extension sets ────────────────────────────────────────────────────────── // ─── Extension sets ──────────────────────────────────────────────────────────
const TEXT_EXTS = new Set(['txt', 'cfg', 'ini', 'bas', 'asm', 'seq', 'rel', 'prg', 'log', 'csv', 's', 'lst']); const TEXT_EXTS = new Set(['txt', 'cfg', 'ini', 'seq', 'log', 'csv', 'lst']);
const CODE_EXTS = new Set(['asm', 'bas', 's', 'js', 'css']);
const MD_EXTS = new Set(['md', 'markdown']); const MD_EXTS = new Set(['md', 'markdown']);
const JSON_EXTS = new Set(['json', 'manifest']); const JSON_EXTS = new Set(['json', 'webmanifest']);
const XML_EXTS = new Set(['xml', 'html', 'htm', 'rss', 'atom', 'xsl']); const XML_EXTS = new Set(['xml', 'html', 'htm', 'rss', 'atom', 'xsl']);
const IMAGE_EXTS = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'svg', 'ico']); const IMAGE_EXTS = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'svg', 'ico']);
const AUDIO_EXTS = new Set(['sid', 'psid', 'mus', 'vgm']); const AUDIO_EXTS = new Set(['sid', 'psid', 'mus', 'vgm']);
@ -120,7 +121,7 @@ function availableViewers(entry: EntryInfo): ViewMode[] {
} }
const VIEWER_LABEL: Record<ViewMode, string> = { const VIEWER_LABEL: Record<ViewMode, string> = {
text: 'Text', markdown: 'Markdown', json: 'JSON', xml: 'XML', hex: 'Hex', image: 'Image', config: 'Config', text: 'Text', markdown: 'Markdown', json: 'JSON', xml: 'HTML/XML', hex: 'Hex', image: 'Image', config: 'Config',
}; };
// ─── Viewer components ─────────────────────────────────────────────────────── // ─── Viewer components ───────────────────────────────────────────────────────
@ -613,7 +614,9 @@ export default function MediaManager({ initialPath = '/', rootPath, title, confi
const bytes = await _getEntryBytes(entry); const bytes = await _getEntryBytes(entry);
if (targetMode === 'image') { if (targetMode === 'image') {
const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
setViewImgUrl(URL.createObjectURL(new Blob([ab]))); const imgExt = entry.name.split('.').pop()?.toLowerCase();
const imgMime = imgExt === 'svg' ? 'image/svg+xml' : undefined;
setViewImgUrl(URL.createObjectURL(new Blob([ab], imgMime ? { type: imgMime } : undefined)));
} else if (targetMode === 'hex') { } else if (targetMode === 'hex') {
setViewHexData(bytes); setViewHexData(bytes);
} else { } else {
@ -636,7 +639,9 @@ export default function MediaManager({ initialPath = '/', rootPath, title, confi
const bytes = await _getEntryBytes(viewEntry); const bytes = await _getEntryBytes(viewEntry);
if (mode === 'image') { if (mode === 'image') {
const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
setViewImgUrl(prev => { if (prev) URL.revokeObjectURL(prev); return URL.createObjectURL(new Blob([ab])); }); const ext = viewEntry.name.split('.').pop()?.toLowerCase();
const mime = ext === 'svg' ? 'image/svg+xml' : undefined;
setViewImgUrl(prev => { if (prev) URL.revokeObjectURL(prev); return URL.createObjectURL(new Blob([ab], mime ? { type: mime } : undefined)); });
} else if (mode === 'hex') { } else if (mode === 'hex') {
setViewHexData(bytes); setViewHexData(bytes);
} else { } else {