71 lines
1.8 KiB
TypeScript
71 lines
1.8 KiB
TypeScript
import type { Post, ArchiveBlock as ArchiveBlockProps } from '@/payload-types'
|
|
|
|
import configPromise from '@payload-config'
|
|
import { getPayload } from 'payload'
|
|
import React from 'react'
|
|
import RichText from '@/components/RichText'
|
|
import type { DefaultTypedEditorState } from '@payloadcms/richtext-lexical'
|
|
|
|
import { CollectionArchive } from '@/components/CollectionArchive'
|
|
|
|
export const ArchiveBlock: React.FC<
|
|
ArchiveBlockProps & {
|
|
id?: string
|
|
}
|
|
> = async (props) => {
|
|
const { id, categories, introContent, limit: limitFromProps, populateBy, selectedDocs } = props
|
|
|
|
const limit = limitFromProps || 3
|
|
|
|
let posts: Post[] = []
|
|
|
|
if (populateBy === 'collection') {
|
|
const payload = await getPayload({ config: configPromise })
|
|
|
|
const flattenedCategories = categories?.map((category) => {
|
|
if (typeof category === 'object') return category.id
|
|
else return category
|
|
})
|
|
|
|
const fetchedPosts = await payload.find({
|
|
collection: 'posts',
|
|
depth: 1,
|
|
limit,
|
|
...(flattenedCategories && flattenedCategories.length > 0
|
|
? {
|
|
where: {
|
|
categories: {
|
|
in: flattenedCategories,
|
|
},
|
|
},
|
|
}
|
|
: {}),
|
|
})
|
|
|
|
posts = fetchedPosts.docs
|
|
} else {
|
|
if (selectedDocs?.length) {
|
|
const filteredSelectedPosts = selectedDocs.map((post) => {
|
|
if (typeof post.value === 'object') return post.value
|
|
}) as Post[]
|
|
|
|
posts = filteredSelectedPosts
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className="my-16" id={`block-${id}`}>
|
|
{introContent && (
|
|
<div className="container mb-16">
|
|
<RichText
|
|
className="ms-0 max-w-[48rem]"
|
|
data={introContent as DefaultTypedEditorState}
|
|
enableGutter={false}
|
|
/>
|
|
</div>
|
|
)}
|
|
<CollectionArchive posts={posts} />
|
|
</div>
|
|
)
|
|
}
|