31 lines
870 B
TypeScript
31 lines
870 B
TypeScript
import { createFileRoute, notFound } from '@tanstack/react-router'
|
|
import { useSuspenseQuery } from '@tanstack/react-query'
|
|
import { Helmet } from 'react-helmet-async'
|
|
import { pageBySlugQuery } from '@/lib/queries'
|
|
import { PageView } from '@/components/page-view'
|
|
|
|
export const Route = createFileRoute('/$slug')({
|
|
loader: async ({ context: { queryClient }, params: { slug } }) => {
|
|
const page = await queryClient.ensureQueryData(pageBySlugQuery(slug))
|
|
if (!page) throw notFound()
|
|
},
|
|
component: CmsPage,
|
|
})
|
|
|
|
function CmsPage() {
|
|
const { slug } = Route.useParams()
|
|
const { data: page } = useSuspenseQuery(pageBySlugQuery(slug))
|
|
if (!page) return null
|
|
|
|
return (
|
|
<>
|
|
{page.title && (
|
|
<Helmet>
|
|
<title>{page.title}</title>
|
|
</Helmet>
|
|
)}
|
|
<PageView title={page.title} content={page.content} />
|
|
</>
|
|
)
|
|
}
|