Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 45 additions & 12 deletions docs/app/source.tsx
Original file line number Diff line number Diff line change
@@ -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 = () => {
Expand All @@ -14,6 +15,19 @@ const DeprecatedBadge = () => {
);
};

const UpdatedBadge = () => {
return <NotificationBadge size="small" style={{ transform: "translateX(6px)" }} />;
};

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");
Expand All @@ -27,18 +41,25 @@ async function transformPageTreeWithBadges(
try {
async function transformNode(node: Node): Promise<Node> {
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: (
Expand All @@ -50,6 +71,18 @@ async function transformPageTreeWithBadges(
};
}

if (isUpdated) {
return {
...node,
name: (
<span className="flex items-center" key={node.$id}>
{node.name}
<UpdatedBadge />
</span>
),
};
}

return node;
}

Expand Down