Server Logs Form
@@ -195,6 +268,69 @@ const AdminLogPage = () => {
+ {/* Section to create new page */}
+
+
+ {/* Section to list and delete pages */}
+
+ Existing Pages
+ Total Pages: {pages.length}
+
+
+
+ Slug
+ Actions
+
+
+
+ {pages.map((page) => (
+
+
+
+ {page.slug}
+
+
+
+
+
+
+ ))}
+
+
+
+
{/* Section to list and delete logs */}
Existing Logs
@@ -232,6 +368,52 @@ const AdminLogPage = () => {
+
+ {/* Section to edit selected page */}
+ {selectedPage && (
+
+ Edit Page
+ {
+ if (value !== undefined) {
+ setSelectedPage((prev) => ({
+ ...prev!,
+ content: value,
+ }));
+ }
+ }}
+ />
+
+
+ )}
);
};
diff --git a/app/(root)/changelogs/[slug]/page.tsx b/app/(root)/changelogs/[slug]/page.tsx
new file mode 100644
index 0000000..e98c1db
--- /dev/null
+++ b/app/(root)/changelogs/[slug]/page.tsx
@@ -0,0 +1,31 @@
+import fs from "fs";
+import path from "path";
+import matter from "gray-matter";
+import { serialize } from "next-mdx-remote/serialize";
+import { MDXRemote } from "next-mdx-remote/rsc";
+import ReactMarkdown from "react-markdown";
+import { ChangelogLayout } from "@/components/shared/providers/changelogLayout";
+import { getBlogPosts } from "@/lib/log";
+
+const changelogsDir = path.resolve(process.cwd(), "data", "pages");
+
+export default async function ChangelogPage({
+ params,
+}: {
+ params: { slug: string };
+}) {
+ const { slug } = params;
+ let posts = await getBlogPosts();
+ let post = posts.find((post) => post.slug === params.slug);
+
+ try {
+ return (
+ Error loading the page.
;
+ }
+}
diff --git a/app/api/mdx/pages/[slug]/route.ts b/app/api/mdx/pages/[slug]/route.ts
new file mode 100644
index 0000000..3462596
--- /dev/null
+++ b/app/api/mdx/pages/[slug]/route.ts
@@ -0,0 +1,64 @@
+import { NextRequest, NextResponse } from "next/server";
+import fs from "fs";
+import path from "path";
+import matter from "gray-matter";
+
+// Define the path to the changelogs directory
+const pagesDir = path.join(process.cwd(), "data", "pages");
+
+export async function GET(
+ request: NextRequest,
+ { params }: { params: { slug: string } }
+) {
+ const { slug } = params;
+ const filePath = path.join(pagesDir, `${slug}.mdx`);
+
+ try {
+ const content = fs.readFileSync(filePath, "utf8");
+ // Use gray-matter to parse the front matter and content
+ const { data, content: mdxContent } = matter(content);
+ return NextResponse.json({ title: data.title, content: mdxContent });
+ } catch (error) {
+ console.error("Failed to load page:", error);
+ return NextResponse.json({ error: "Page not found" }, { status: 404 });
+ }
+}
+
+export async function PUT(
+ request: NextRequest,
+ { params }: { params: { slug: string } }
+) {
+ const { slug } = params;
+ const filePath = path.join(pagesDir, `${slug}.mdx`);
+ const { title, content } = await request.json();
+
+ try {
+ fs.writeFileSync(filePath, `---\ntitle: ${title}\n---\n${content}`);
+ return NextResponse.json({ title, slug, content });
+ } catch (error) {
+ console.error("Failed to update page:", error);
+ return NextResponse.json(
+ { error: "Failed to update page" },
+ { status: 500 }
+ );
+ }
+}
+
+export async function DELETE(
+ request: NextRequest,
+ { params }: { params: { slug: string } }
+) {
+ const { slug } = params;
+ const filePath = path.join(pagesDir, `${slug}.mdx`);
+
+ try {
+ fs.unlinkSync(filePath);
+ return NextResponse.json({}, { status: 204 });
+ } catch (error) {
+ console.error("Failed to delete page:", error);
+ return NextResponse.json(
+ { error: "Failed to delete page" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/app/api/mdx/pages/route.ts b/app/api/mdx/pages/route.ts
new file mode 100644
index 0000000..76679fe
--- /dev/null
+++ b/app/api/mdx/pages/route.ts
@@ -0,0 +1,53 @@
+import fs from "fs";
+import path from "path";
+import { NextRequest, NextResponse } from "next/server";
+import matter from "gray-matter";
+
+const changelogsDir = path.resolve(process.cwd(), "data/pages");
+
+function getMDXFiles(dir: string): string[] {
+ return fs.readdirSync(dir).filter((file) => file.endsWith(".mdx"));
+}
+
+export async function GET() {
+ try {
+ const mdxFiles = getMDXFiles(changelogsDir);
+ const pages = mdxFiles.map((file) => {
+ const filePath = path.join(changelogsDir, file);
+ const content = fs.readFileSync(filePath, "utf-8");
+ const { data, content: mdxContent } = matter(content);
+ const slug = path.basename(file, path.extname(file));
+ return {
+ metadata: data,
+ slug,
+ content: mdxContent,
+ };
+ });
+ return NextResponse.json(pages, { status: 200 });
+ } catch (error) {
+ return NextResponse.json(
+ { error: "Failed to fetch pages" },
+ { status: 500 }
+ );
+ }
+}
+
+export async function POST(request: NextRequest) {
+ const { title } = await request.json();
+ const slug = title.toLowerCase().replace(/\s+/g, "-");
+ const filePath = path.join(changelogsDir, `${slug}.mdx`);
+
+ if (fs.existsSync(filePath)) {
+ return NextResponse.json({ error: "Page already exists" }, { status: 400 });
+ }
+
+ try {
+ fs.writeFileSync(filePath, `---\ntitle: ${title}\n---\n`);
+ return NextResponse.json({ title, slug }, { status: 201 });
+ } catch (error) {
+ return NextResponse.json(
+ { error: "Failed to create page" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/bun.lockb b/bun.lockb
index ebcad42775a54c87800d7a8b3d53585d80bb999f..cb0c7df7934c3036514969cb95bf5d5bc4b6fd1b 100644
GIT binary patch
delta 87128
zcmeFacYI9S-#tDv$uNT;dUT=_oeYVLP7nkkx`>bv>Cs7aK@bN=y?XDxUG1vTb6u`}
z_1=5;TkGt7-0