33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
import type { SiteDocument } from '../../server/utils/site-schema'
|
|
|
|
export async function useSiteDocument() {
|
|
const route = useRoute()
|
|
const isPreview = computed(() => route.query.preview === 'draft')
|
|
const endpoint = computed(() => isPreview.value ? '/api/admin/site' : '/api/public/site')
|
|
const headers = import.meta.server && isPreview.value ? useRequestHeaders(['cookie']) : undefined
|
|
useHead(() => isPreview.value ? { meta: [{ name: 'robots', content: 'noindex, nofollow' }] } : {})
|
|
const { data: response, error } = await useFetch<{ data: SiteDocument }>(endpoint, { headers })
|
|
|
|
if (error.value) {
|
|
if (isPreview.value && error.value.statusCode === 401) {
|
|
throw createError({ statusCode: 401, statusMessage: '预览草稿前请先登录后台' })
|
|
}
|
|
throw error.value
|
|
}
|
|
|
|
return {
|
|
site: computed(() => response.value!.data),
|
|
isPreview,
|
|
}
|
|
}
|
|
|
|
export function useAbsoluteUrl() {
|
|
const config = useRuntimeConfig()
|
|
const base = String(config.public.siteUrl).replace(/\/$/, '')
|
|
return (path?: string | null) => {
|
|
if (!path) return base
|
|
if (/^https?:\/\//i.test(path)) return path
|
|
return `${base}${path.startsWith('/') ? path : `/${path}`}`
|
|
}
|
|
}
|