feat: support nav and pages in cms

This commit is contained in:
Cory Dransfeldt 2024-07-14 19:21:04 -07:00
parent e1b0dc5243
commit f5adf0ba06
No known key found for this signature in database
35 changed files with 235 additions and 444 deletions

82
src/_data/pages.js Normal file
View 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()
}