import { createFileRoute, Link } from "@tanstack/react-router";
import { HomeLayout } from "fumadocs-ui/layouts/home";
import { createClientLoader } from "fumadocs-mdx/runtime/vite";
import { DocsBody } from "fumadocs-ui/page";
import defaultMdxComponents from "fumadocs-ui/mdx";
import { baseOptions } from "@/lib/layout.shared";
import { Suspense } from "react";
import { getBlogPost } from "@/lib/content.functions";
import { blog } from "../../../source.generated";
import { buildPageSeo } from "@/lib/seo";
export const Route = createFileRoute("/blogs/$")({
loader: async ({ params }: { params: { _splat?: string } }) => {
const slugs = params._splat?.split("/") ?? [];
const data = await getBlogPost({ data: slugs });
await clientMdxLoader.preload(data.path);
return data;
},
head: ({ loaderData }: { loaderData?: unknown }) => {
const data = loaderData as
| { title?: string; description?: string; url?: string }
| undefined;
const title = data?.title ?? "OpenSEO Blog";
const description = data?.description;
return buildPageSeo({
title,
description,
path: data?.url ?? "/blogs",
titleSuffix: "OpenSEO Blog",
ogType: "article",
});
},
component: BlogPost,
});
const clientMdxLoader = createClientLoader(blog, {
id: "blog",
component({ default: MDX }) {
return (
);
},
});
function BlogPost() {
const data = Route.useLoaderData() as {
path: string;
title: string;
description?: string;
};
const Content = clientMdxLoader.getComponent(data.path);
return (
);
}
function BlogHeader({
title,
description,
}: {
title: string;
description?: string;
}) {
return (
←
Back to Blog
{title}
{description && (
{description}
)}
);
}