admin-vue3/src/views/review/tablet/previewMode.mjs

52 lines
1.7 KiB
JavaScript

const PDF_EXT = 'pdf'
const PREVIEW_SOURCE_PATH = '/admin-api/project/review-tablet/file-preview-source/'
const CLIENT_UNREACHABLE_HOSTS = new Set([
'localhost',
'127.0.0.1',
'0.0.0.0',
'host.docker.internal'
])
const normalizeFileType = (value) =>
String(value || '')
.trim()
.toLowerCase()
const toSameOriginPreviewPathIfNeeded = (url) => {
const normalized = String(url || '').trim()
if (!normalized) return ''
if (normalized.startsWith(PREVIEW_SOURCE_PATH)) return normalized
try {
const parsed = new URL(normalized)
if (!parsed.pathname.startsWith(PREVIEW_SOURCE_PATH)) return normalized
if (!CLIENT_UNREACHABLE_HOSTS.has(parsed.hostname.toLowerCase())) return normalized
return `${parsed.pathname}${parsed.search}${parsed.hash}`
} catch {
return normalized
}
}
export const resolveTabletPreviewMode = (payload, options = {}) => {
if (!payload) return 'none'
if (options.preferIframeForPdf && normalizeFileType(payload.fileType) === PDF_EXT) {
return 'iframe'
}
return normalizeFileType(payload.fileType) === PDF_EXT ? 'pdf' : 'iframe'
}
export const resolvePdfSourceUrl = (payload, fallbackUrl = '') => {
if (!payload) return fallbackUrl || ''
if (resolveTabletPreviewMode(payload) !== 'pdf') return fallbackUrl || ''
const visitUrl = toSameOriginPreviewPathIfNeeded(payload.visitUrl)
return visitUrl || fallbackUrl || ''
}
export const resolveNewWindowPreviewUrl = (payload, fallbackUrl = '') => {
if (!payload) return fallbackUrl || ''
const openUrl = String(payload.openUrl || '').trim()
if (resolveTabletPreviewMode(payload) === 'pdf') {
return openUrl || resolvePdfSourceUrl(payload, fallbackUrl)
}
return openUrl || fallbackUrl || ''
}