diff --git a/refer_landing_page/app/publications/[category]/_components/PublicationCategoryClient.tsx b/refer_landing_page/app/publications/[category]/_components/PublicationCategoryClient.tsx
new file mode 100644
index 0000000..79fee51
--- /dev/null
+++ b/refer_landing_page/app/publications/[category]/_components/PublicationCategoryClient.tsx
@@ -0,0 +1,149 @@
+"use client";
+
+import React, { useEffect, useState } from "react";
+import { notFound } from "next/navigation";
+import { CategoryNav } from "../../_components/CategoryNav";
+import { getPublications, getPatents } from "../../../../lib/api";
+import { PUB_CATEGORIES } from "../../../../content/categories";
+import type { PubCategory, Publication, Patent } from "../../../../content/types";
+
+export function PublicationCategoryClient({ category }: { category: string }) {
+ const currentCat = PUB_CATEGORIES.find((c) => c.slug === category);
+ if (!currentCat) {
+ notFound();
+ }
+
+ const slug = category as PubCategory;
+
+ const [publications, setPublications] = useState
([]);
+ const [patents, setPatents] = useState([]);
+
+ useEffect(() => {
+ getPublications().then((p) => {
+ if (p) setPublications(p);
+ });
+ getPatents().then((pat) => {
+ if (pat) setPatents(pat);
+ });
+ }, []);
+
+ const counts = {
+ "intl-journal-conf": publications.filter((p) => p.category === "intl-journal-conf").length,
+ "domestic-journal-conf": publications.filter((p) => p.category === "domestic-journal-conf").length,
+ patent: patents.length,
+ };
+
+ let records: any[] = [];
+ if (slug === "patent") {
+ records = patents.map((p) => ({
+ title: p.title,
+ inventors: p.inventors,
+ appNo: p.applicationNo,
+ appDate: p.applicationAt,
+ regNo: p.registrationNo,
+ regDate: p.registrationAt,
+ country: p.country,
+ publishedAt: p.publishedAt,
+ isPatent: true,
+ }));
+ } else {
+ records = publications
+ .filter((p) => p.category === slug)
+ .map((p) => ({
+ title: p.title,
+ venue: p.venue,
+ volume: p.volume,
+ publishedAt: p.publishedAt,
+ kci: p.kci,
+ isPatent: false,
+ }));
+ }
+
+ return (
+
+ {/* Page Header */}
+
+
+ {currentCat.label}
+
+ {currentCat.subtitle && (
+
+ {currentCat.subtitle}
+
+ )}
+
+
+ {/* Category Nav Cards */}
+
+
+ {/* Record List Section */}
+
+
+
+ {records.length} Records
+
+
+
+ {records.length === 0 ? (
+
+
+ No records found in this category.
+
+
+ Records will be updated periodically.
+
+
+ ) : (
+
+ {records.map((rec, idx) => (
+
+
+
+ {rec.title}
+
+
+
+
+ {rec.isPatent ? (
+
+
Inventors: {rec.inventors}
+
+ App No: {rec.appNo} ({rec.country}, {rec.appDate})
+
+ {rec.regNo && (
+
+ Reg No: {rec.regNo} ({rec.regDate})
+
+ )}
+
+ ) : (
+
+
{rec.venue}
+
+ {rec.volume}
+ {rec.kci && (
+
+ KCI Indexed
+
+ )}
+
+
+ )}
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/refer_landing_page/app/publications/[category]/page.tsx b/refer_landing_page/app/publications/[category]/page.tsx
index 4d4896f..7a06028 100644
--- a/refer_landing_page/app/publications/[category]/page.tsx
+++ b/refer_landing_page/app/publications/[category]/page.tsx
@@ -1,10 +1,6 @@
-import React from "react";
import type { Metadata } from "next";
-import { notFound } from "next/navigation";
-import { CategoryNav } from "../_components/CategoryNav";
-import { getPublications, getPatents } from "../../../lib/api";
import { PUB_CATEGORIES } from "../../../content/categories";
-import { PubCategory } from "../../../content/types";
+import { PublicationCategoryClient } from "./_components/PublicationCategoryClient";
interface PageProps {
params: {
@@ -12,6 +8,10 @@ interface PageProps {
};
}
+export function generateStaticParams() {
+ return PUB_CATEGORIES.map((c) => ({ category: c.slug }));
+}
+
export function generateMetadata({ params }: PageProps): Metadata {
const currentCat = PUB_CATEGORIES.find((c) => c.slug === params.category);
if (!currentCat) {
@@ -23,138 +23,6 @@ export function generateMetadata({ params }: PageProps): Metadata {
};
}
-export const dynamic = "force-dynamic";
-
-export default async function PublicationCategoryPage({ params }: PageProps) {
- const { category } = params;
- const currentCat = PUB_CATEGORIES.find((c) => c.slug === category);
-
- if (!currentCat) {
- notFound();
- }
-
- const slug = category as PubCategory;
-
- const publications = (await getPublications()) ?? [];
- const patents = (await getPatents()) ?? [];
-
- const counts = {
- "intl-journal-conf": publications.filter((p) => p.category === "intl-journal-conf").length,
- "domestic-journal-conf": publications.filter((p) => p.category === "domestic-journal-conf").length,
- patent: patents.length,
- };
-
- let records: any[] = [];
- if (slug === "patent") {
- records = patents.map((p) => ({
- title: p.title,
- inventors: p.inventors,
- appNo: p.applicationNo,
- appDate: p.applicationAt,
- regNo: p.registrationNo,
- regDate: p.registrationAt,
- country: p.country,
- publishedAt: p.publishedAt,
- isPatent: true,
- }));
- } else {
- records = publications
- .filter((p) => p.category === slug)
- .map((p) => ({
- title: p.title,
- venue: p.venue,
- volume: p.volume,
- publishedAt: p.publishedAt,
- kci: p.kci,
- isPatent: false,
- }));
- }
-
- return (
-
- {/* Page Header */}
-
-
- {currentCat.label}
-
- {currentCat.subtitle && (
-
- {currentCat.subtitle}
-
- )}
-
-
- {/* Category Nav Cards */}
-
-
- {/* Record List Section */}
-
-
-
- {records.length} Records
-
-
-
- {records.length === 0 ? (
-
-
- No records found in this category.
-
-
- Records will be updated periodically.
-
-
- ) : (
-
- {records.map((rec, idx) => (
-
-
-
- {rec.title}
-
-
-
-
- {rec.isPatent ? (
-
-
Inventors: {rec.inventors}
-
- App No: {rec.appNo} ({rec.country}, {rec.appDate})
-
- {rec.regNo && (
-
- Reg No: {rec.regNo} ({rec.regDate})
-
- )}
-
- ) : (
-
-
{rec.venue}
-
- {rec.volume}
- {rec.kci && (
-
- KCI Indexed
-
- )}
-
-
- )}
-
- ))}
-
- )}
-
-
- );
+export default function PublicationCategoryPage({ params }: PageProps) {
+ return ;
}
diff --git a/refer_landing_page/app/publications/layout.tsx b/refer_landing_page/app/publications/layout.tsx
new file mode 100644
index 0000000..a8ca26d
--- /dev/null
+++ b/refer_landing_page/app/publications/layout.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Publications",
+ description: "AI Agent Networking Lab (ANL) research publications and patents overview",
+};
+
+export default function PublicationsLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>;
+}
diff --git a/refer_landing_page/app/publications/page.tsx b/refer_landing_page/app/publications/page.tsx
index 1306823..619dcb9 100644
--- a/refer_landing_page/app/publications/page.tsx
+++ b/refer_landing_page/app/publications/page.tsx
@@ -1,17 +1,22 @@
-import type { Metadata } from "next";
+"use client";
+
+import React, { useEffect, useState } from "react";
import { CategoryNav } from "./_components/CategoryNav";
import { getPublications, getPatents } from "../../lib/api";
+import type { Publication, Patent } from "../../content/types";
-export const metadata: Metadata = {
- title: "Publications",
- description: "AI Agent Networking Lab (ANL) research publications and patents overview",
-};
+export default function PublicationsIndexPage() {
+ const [publications, setPublications] = useState([]);
+ const [patents, setPatents] = useState([]);
-export const dynamic = "force-dynamic";
-
-export default async function PublicationsIndexPage() {
- const publications = (await getPublications()) ?? [];
- const patents = (await getPatents()) ?? [];
+ useEffect(() => {
+ getPublications().then((p) => {
+ if (p) setPublications(p);
+ });
+ getPatents().then((pat) => {
+ if (pat) setPatents(pat);
+ });
+ }, []);
const counts = {
"intl-journal-conf": publications.filter((p) => p.category === "intl-journal-conf").length,
diff --git a/refer_landing_page/app/standardization/layout.tsx b/refer_landing_page/app/standardization/layout.tsx
new file mode 100644
index 0000000..6e332ce
--- /dev/null
+++ b/refer_landing_page/app/standardization/layout.tsx
@@ -0,0 +1,10 @@
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Standardization",
+ description: "AI Agent Networking Lab (ANL) international standardization research and contributions",
+};
+
+export default function StandardizationLayout({ children }: { children: React.ReactNode }) {
+ return <>{children}>;
+}
diff --git a/refer_landing_page/app/standardization/page.tsx b/refer_landing_page/app/standardization/page.tsx
index a0b60d0..e674120 100644
--- a/refer_landing_page/app/standardization/page.tsx
+++ b/refer_landing_page/app/standardization/page.tsx
@@ -1,16 +1,17 @@
-import React from "react";
-import type { Metadata } from "next";
+"use client";
+
+import React, { useEffect, useState } from "react";
import { getStandardsBodies } from "../../lib/api";
+import type { StandardsBody } from "../../content/types";
-export const metadata: Metadata = {
- title: "Standardization",
- description: "AI Agent Networking Lab (ANL) international standardization research and contributions",
-};
+export default function StandardizationPage() {
+ const [standardsBodies, setStandardsBodies] = useState([]);
-export const dynamic = "force-dynamic";
-
-export default async function StandardizationPage() {
- const standardsBodies = (await getStandardsBodies()) ?? [];
+ useEffect(() => {
+ getStandardsBodies().then((sb) => {
+ if (sb) setStandardsBodies(sb);
+ });
+ }, []);
return (
{/* Page Header */}
diff --git a/refer_landing_page/components/Header.tsx b/refer_landing_page/components/Header.tsx
index 5e0e7c4..01fe208 100644
--- a/refer_landing_page/components/Header.tsx
+++ b/refer_landing_page/components/Header.tsx
@@ -133,7 +133,7 @@ export default function Header() {
className="group flex items-center gap-3 min-w-0 desktop:shrink-0"
onClick={() => setOpen(false)}
>
-