52 lines
1.7 KiB
JavaScript
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 || ''
|
|
}
|