Deploy
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
// src/lib/emdash.ts — server-side CMS fetch helpers (do not import on client)
|
||||
const EMDASH_URL = process.env.EMDASH_URL || 'http://localhost:4321'
|
||||
const EMDASH_TOKEN = process.env.EMDASH_API_TOKEN || ''
|
||||
|
||||
export interface CmsItem {
|
||||
id: string
|
||||
slug: string
|
||||
status: string
|
||||
data: Record<string, unknown>
|
||||
publishedAt: string | null
|
||||
}
|
||||
|
||||
// emDash stores image fields as { provider, id, src } — flatten to plain URL strings.
|
||||
function normalizeData(data: Record<string, unknown>): Record<string, unknown> {
|
||||
const out: Record<string, unknown> = {}
|
||||
for (const [k, v] of Object.entries(data)) {
|
||||
out[k] = v && typeof v === 'object' && 'src' in v ? (v as { src: unknown }).src ?? v : v
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
async function fetchCollection(collection: string, limit = 20): Promise<CmsItem[]> {
|
||||
if (!EMDASH_TOKEN) return []
|
||||
try {
|
||||
const url = new URL(`/_emdash/api/content/${collection}`, EMDASH_URL)
|
||||
url.searchParams.set('status', 'published')
|
||||
url.searchParams.set('limit', String(limit))
|
||||
const res = await fetch(url.toString(), {
|
||||
headers: { Authorization: `Bearer ${EMDASH_TOKEN}` },
|
||||
next: { revalidate: 60 },
|
||||
})
|
||||
if (!res.ok) return []
|
||||
const json = await res.json() as { data?: { items?: CmsItem[] }; items?: CmsItem[] }
|
||||
const items = json.data?.items ?? json.items ?? []
|
||||
return items.map((item) => ({ ...item, data: normalizeData(item.data ?? {}) }))
|
||||
} catch {
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
export const getCampaigns = () => fetchCollection('campaigns')
|
||||
export const getSpecials = () => fetchCollection('specials')
|
||||
export const getBusinessHours = () => fetchCollection('business_hours', 1)
|
||||
export const getPromotions = () => fetchCollection('promotions')
|
||||
export const getFeaturedProductIds = async (): Promise<string[]> => {
|
||||
const items = await fetchCollection('featured_products', 10)
|
||||
return items.flatMap(i => {
|
||||
const ids = i.data.product_ids
|
||||
return Array.isArray(ids) ? ids as string[] : []
|
||||
})
|
||||
}
|
||||
export const getBlogPosts = (limit = 10) => fetchCollection('posts', limit)
|
||||
Reference in New Issue
Block a user