feat: support nav and pages in cms
This commit is contained in:
parent
e1b0dc5243
commit
f5adf0ba06
35 changed files with 235 additions and 444 deletions
82
src/_data/pages.js
Normal file
82
src/_data/pages.js
Normal file
|
@ -0,0 +1,82 @@
|
|||
import { createClient } from '@supabase/supabase-js'
|
||||
|
||||
const SUPABASE_URL = process.env.SUPABASE_URL
|
||||
const SUPABASE_KEY = process.env.SUPABASE_KEY
|
||||
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
|
||||
|
||||
const PAGE_SIZE = 50
|
||||
|
||||
const fetchBlockData = async (collection, itemId) => {
|
||||
const { data, error } = await supabase
|
||||
.from(collection)
|
||||
.select(collection === 'hero' ? '*, image(filename_disk)' : '*')
|
||||
.eq('id', itemId)
|
||||
.single()
|
||||
|
||||
if (error) {
|
||||
console.error(`Error fetching data from ${collection} for item ${itemId}:`, error)
|
||||
return null
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
const fetchBlocksForPage = async (pageId) => {
|
||||
const { data, error } = await supabase
|
||||
.from('pages_blocks')
|
||||
.select('collection, item')
|
||||
.eq('pages_id', pageId)
|
||||
|
||||
if (error) {
|
||||
console.error(`Error fetching blocks for page ${pageId}:`, error)
|
||||
return []
|
||||
}
|
||||
|
||||
const blocks = await Promise.all(data.map(async block => {
|
||||
const blockData = await fetchBlockData(block.collection, block.item)
|
||||
|
||||
return {
|
||||
type: block['collection'],
|
||||
...blockData
|
||||
}
|
||||
}))
|
||||
|
||||
return blocks
|
||||
}
|
||||
|
||||
const fetchAllPages = async () => {
|
||||
let pages = []
|
||||
let page = 0
|
||||
let fetchMore = true
|
||||
|
||||
while (fetchMore) {
|
||||
const { data, error } = await supabase
|
||||
.from('pages')
|
||||
.select(`
|
||||
*,
|
||||
open_graph_image(filename_disk)
|
||||
`)
|
||||
.range(page * PAGE_SIZE, (page + 1) * PAGE_SIZE - 1)
|
||||
|
||||
if (error) {
|
||||
console.error('Error fetching pages:', error)
|
||||
return pages
|
||||
}
|
||||
|
||||
if (data.length < PAGE_SIZE) fetchMore = false
|
||||
|
||||
for (const page of data) {
|
||||
page['blocks'] = await fetchBlocksForPage(page['id'])
|
||||
if (page['open_graph_image']) page['open_graph_image'] = page['open_graph_image']['filename_disk']
|
||||
pages.push(page)
|
||||
}
|
||||
|
||||
page++
|
||||
}
|
||||
|
||||
return pages
|
||||
}
|
||||
|
||||
export default async function () {
|
||||
return await fetchAllPages()
|
||||
}
|
Reference in a new issue