diff --git a/docs/app/source.tsx b/docs/app/source.tsx index be6b4e919..3fa4abdbe 100644 --- a/docs/app/source.tsx +++ b/docs/app/source.tsx @@ -1,9 +1,10 @@ -import { docs, reactDocs, breezeDocs, lynxDocs } from "@/.source"; +import { breezeDocs, docs, lynxDocs, reactDocs } from "@/.source"; import { getRootageMetadata } from "@/components/rootage"; import { IconContainer } from "@/components/ui/icon"; import type { Node, Root } from "fumadocs-core/page-tree"; import { loader } from "fumadocs-core/source"; +import { NotificationBadge } from "@seed-design/react"; import { icons } from "lucide-react"; const DeprecatedBadge = () => { @@ -14,6 +15,19 @@ const DeprecatedBadge = () => { ); }; +const UpdatedBadge = () => { + return ; +}; + +const RECENTLY_UPDATED_DAYS = 14; + +function isRecentlyUpdated(lastModified: Date | undefined): boolean { + if (!lastModified) return false; + const fourteenDaysAgo = new Date(); + fourteenDaysAgo.setDate(fourteenDaysAgo.getDate() - RECENTLY_UPDATED_DAYS); + return new Date(lastModified) > fourteenDaysAgo; +} + function getComponentIdFromUrl(url: string): string | null { const urlParts = url.split("/"); const isComponentPage = urlParts.includes("components"); @@ -27,18 +41,25 @@ async function transformPageTreeWithBadges( try { async function transformNode(node: Node): Promise { if (node.type === "page") { - const componentId = getComponentIdFromUrl(node.url); const page = sourceLoader.getNodePage(node); - if (!componentId) return node; - - // 1. Check frontmatter deprecated (priority 1) - const frontmatterDeprecated = page?.data?.deprecated; - // 2. Get rootage metadata once if needed - const metadata = frontmatterDeprecated ? null : await getRootageMetadata(componentId); - // Determine deprecated status and message - const deprecated = frontmatterDeprecated ? true : Boolean(metadata?.deprecated); - // 3. Check updated status (priority 3) - only if not deprecated - if (deprecated) { + if (!page) return node; + + // 1. Check deprecated status (only for component pages) + const componentId = getComponentIdFromUrl(node.url); + let isDeprecated = false; + if (componentId) { + const frontmatterDeprecated = page?.data?.deprecated; + const metadata = frontmatterDeprecated ? null : await getRootageMetadata(componentId); + isDeprecated = frontmatterDeprecated ? true : Boolean(metadata?.deprecated); + } + + // 2. Check updated status (for all pages, only if not deprecated) + // Use fumadocs lastModified from page.data.load() + const { lastModified } = await page.data.load(); + const isUpdated = !isDeprecated && isRecentlyUpdated(lastModified); + + // 3. Render badges + if (isDeprecated) { return { ...node, name: ( @@ -50,6 +71,18 @@ async function transformPageTreeWithBadges( }; } + if (isUpdated) { + return { + ...node, + name: ( + + {node.name} + + + ), + }; + } + return node; }