diff --git a/src/app/_components/VersionLabel.jsx b/src/app/_components/VersionLabel.jsx index 1d0322b..c43c24a 100644 --- a/src/app/_components/VersionLabel.jsx +++ b/src/app/_components/VersionLabel.jsx @@ -1,8 +1,8 @@ "use client" -export default function VersionLabel() { +export default function VersionLabel({ latestVersion }) { const handleClick = () => { - window.location.href = "/blog/v2026.02.13" + window.location.href = `/blog/${latestVersion?.version}` } return ( @@ -20,7 +20,7 @@ export default function VersionLabel() { }} title="View release notes" > - v2026.02.13 + {latestVersion?.version} ) } diff --git a/src/app/layout.jsx b/src/app/layout.jsx index 2cedc4f..44a6acb 100644 --- a/src/app/layout.jsx +++ b/src/app/layout.jsx @@ -4,6 +4,7 @@ import { Banner, Head } from "nextra/components" import { getPageMap } from "nextra/page-map" import VersionLabel from "./_components/VersionLabel" import ImageZoomProvider from "../components/ImageZoomProvider" +import { getLatestVersion } from "@/lib/version"; import "nextra-theme-docs/style.css" import "./globals.css" @@ -33,6 +34,12 @@ export const metadata = { } export default async function RootLayout({ children }) { + + const [pageMap, latestVersion] = await Promise.all([ + getPageMap(), + getLatestVersion(), + ]); + const navbar = ( - + } // SpaceDF discord server @@ -54,7 +61,7 @@ export default async function RootLayout({ children }) { projectLink="https://github.com/Space-DF/spacedf-docs" /> ) - const pageMap = await getPageMap() + return ( - 🚀 SpaceDF v2026.02.13 is now live!{" "} + 🚀 SpaceDF {latestVersion?.version} is now live!{" "} Read the release notes diff --git a/src/lib/version.ts b/src/lib/version.ts new file mode 100644 index 0000000..73c56b3 --- /dev/null +++ b/src/lib/version.ts @@ -0,0 +1,45 @@ +import fs from "fs" +import path from "path" +import matter from "gray-matter" + +type LatestVersion = { + slug: string + version: string + date?: string + title?: string + type?: string + author?: string + description?: string +} + +export const getLatestVersion = async (): Promise => { + const POSTS_DIR = path.join(process.cwd(), "src/app/blog/(post)") + + if (!fs.existsSync(POSTS_DIR)) return null + + const results: LatestVersion[] = [] + const folders = fs.readdirSync(POSTS_DIR) + + for (const folder of folders) { + const fullPath = path.join(POSTS_DIR, folder, "page.mdx") + if (!fs.existsSync(fullPath)) continue + + const raw = fs.readFileSync(fullPath, "utf-8") + if (!raw) continue + + const { data } = matter(raw) + + results.push({ + ...(data as Omit), + version: folder, + slug: `/blog/${folder}`, + }) + } + + const latest = + results.sort( + (a, b) => new Date(b.date ?? 0).getTime() - new Date(a.date ?? 0).getTime(), + )[0] ?? null + + return latest +}