import type { MindSpaceAsset } from '../types'; const ASSET_ICONS: Record = { pdf: 'πŸ“„', word: 'πŸ“', excel: 'πŸ“Š', ppt: 'πŸ“½οΈ', image: 'πŸ–ΌοΈ', markdown: 'MD', html: '🌐', file: 'πŸ“', }; const SOURCE_LABELS: Record = { upload: '上传', chat: '聊倩', agent: 'AI η”Ÿζˆ', workspace: 'ε·₯作区', template: '樑板', generated: '系统', }; const PREVIEWABLE_MIME_TYPES = new Set([ 'text/html', 'text/plain', 'text/markdown', 'text/csv', 'application/pdf', 'image/png', 'image/jpeg', 'image/webp', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ]); export function assetIcon(asset: MindSpaceAsset) { return ASSET_ICONS[asset.assetType] ?? ASSET_ICONS.file; } export function assetSourceLabel(asset: MindSpaceAsset) { return SOURCE_LABELS[asset.sourceType] ?? 'θ΅„ζ–™'; } export function isPreviewableAsset(asset: MindSpaceAsset) { return ( asset.status === 'ready' && asset.scanStatus !== 'blocked' && PREVIEWABLE_MIME_TYPES.has(asset.mimeType) ); } export function isWorkAsset(asset: MindSpaceAsset) { return asset.assetType === 'html' || asset.mimeType === 'text/html'; } export function isImageAsset(asset: MindSpaceAsset) { return asset.assetType === 'image' || asset.mimeType.startsWith('image/'); } export function buildAssetImageUrl(asset: Pick) { if (asset.publicUrl) return asset.publicUrl; return `/api/mindspace/v1/assets/${asset.id}/download?inline=1&viewer=0&v=${asset.updatedAt}`; } export function buildAbsoluteAssetImageUrl( asset: Pick, ): string { if (asset.publicUrl) return new URL(asset.publicUrl, window.location.origin).toString(); return `${window.location.origin}${buildAssetImageUrl(asset)}`; } export function buildAbsoluteAssetDownloadUrl( asset: Pick, ): string { return `${window.location.origin}/api/mindspace/v1/assets/${asset.id}/download?inline=1&viewer=0&v=${asset.updatedAt}`; } /** Chrome blocks PDF rendering inside any sandboxed iframe. */ export function assetPreviewUsesSandbox(mimeType: string) { return mimeType !== 'application/pdf'; } export const ASSET_PREVIEW_IFRAME_SANDBOX = 'allow-same-origin'; export function buildAssetPreviewFrameConfig( asset: Pick, ) { if (asset.mimeType === 'application/pdf') { return { src: `/api/mindspace/v1/assets/${asset.id}/download?inline=1`, }; } return { src: `/api/mindspace/v1/assets/${asset.id}/preview`, sandbox: ASSET_PREVIEW_IFRAME_SANDBOX, }; }