diff --git a/app/(auth)/admin/changelogs/page.tsx b/app/(auth)/admin/changelogs/page.tsx index da6ffba..07637dc 100644 --- a/app/(auth)/admin/changelogs/page.tsx +++ b/app/(auth)/admin/changelogs/page.tsx @@ -65,6 +65,36 @@ const AdminLogPage = () => { const [pageTitle, setPageTitle] = useState(""); const [selectedPage, setSelectedPage] = useState(null); + useEffect(() => { + fetch("/api/mdx/pages") + .then((response) => response.json()) + .then((data) => setPages(data)) + .catch((error) => console.error("Failed to load pages", error)); + }, []); + + const createPage = async () => { + setLoading(true); + const slug = pageTitle.toLowerCase().replace(/\s+/g, "-"); + const response = await fetch("/api/mdx/pages", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ title: pageTitle, slug, content: "" }), + }); + + if (response.ok) { + const newPage = await response.json(); + setPages([...pages, newPage]); + setPageTitle(""); + setOpen(false); + setLoading(false); + } else { + console.error("Failed to create page"); + setLoading(false); + } + }; + const form = useForm({ resolver: zodResolver(logsSchema), defaultValues: { @@ -228,6 +258,71 @@ const AdminLogPage = () => { +
+ {/*

Changelog Management

*/} +
+

+ Multi Log Page +

+ + + + + Enter Page Title + + setPageTitle(e.target.value)} + placeholder="Page Title" + /> + + + + + +
+
+

Existing Pages

+

Total Pages: {pages.length}

+ + + + Slug + Actions + + + + {pages.map((page) => ( + + + + {page.slug} + + + + + + + ))} + +
+
+
+ {/* Section to list and delete logs */}

Existing Logs

diff --git a/app/(root)/changelogs/[slug]/page.tsx b/app/(root)/changelogs/[slug]/page.tsx index e69de29..4604476 100644 --- a/app/(root)/changelogs/[slug]/page.tsx +++ b/app/(root)/changelogs/[slug]/page.tsx @@ -0,0 +1,40 @@ +"use client"; +import React, { useEffect, useState } from "react"; +import { useRouter } from "next/router"; +import ReactMarkdown from "react-markdown"; + +const Page = ({ params }: { params: { slug: string } }) => { + const { slug } = params; + const [page, setPage] = useState<{ title: string; content: string } | null>( + null + ); + + useEffect(() => { + fetch(`/api/mdx/pages/${slug}`) + .then((response) => response.json()) + .then((data) => setPage(data)) + .catch((error) => console.error("Failed to load page", error)); + }, [slug]); + + if (!page) { + return ( +
+

+ 404 Page not Found +

+

+ Please return back to Home +

+
+ ); + } + + return ( +
+

{page.title}

+ {page.content} +
+ ); +}; + +export default 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..9917b3b --- /dev/null +++ b/app/api/mdx/pages/[slug]/route.ts @@ -0,0 +1,54 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import clientPromise from "@/lib/db"; + +export async function GET(req: NextApiRequest, res: NextApiResponse) { + const { slug } = req.query; + try { + const client = await clientPromise; + const db = client.db(); + const page = await db.collection("pages").findOne({ slug }); + if (page) { + res.status(200).json(page); + } else { + res.status(404).json({ error: "Page not found" }); + } + } catch (error) { + res.status(500).json({ error: "Failed to load page" }); + } +} + +export async function PUT(req: NextApiRequest, res: NextApiResponse) { + const { slug } = req.query; + const { title, content } = req.body; + try { + const client = await clientPromise; + const db = client.db(); + const result = await db + .collection("pages") + .updateOne({ slug }, { $set: { title, content } }); + if (result.matchedCount > 0) { + const updatedPage = await db.collection("pages").findOne({ slug }); + res.status(200).json(updatedPage); + } else { + res.status(404).json({ error: "Page not found" }); + } + } catch (error) { + res.status(500).json({ error: "Failed to update page" }); + } +} + +export async function DELETE(req: NextApiRequest, res: NextApiResponse) { + const { slug } = req.query; + try { + const client = await clientPromise; + const db = client.db(); + const result = await db.collection("pages").deleteOne({ slug }); + if (result.deletedCount > 0) { + res.status(200).json({ message: "Page successfully deleted" }); + } else { + res.status(404).json({ error: "Page not found" }); + } + } catch (error) { + res.status(500).json({ error: "Failed to delete page" }); + } +} diff --git a/app/api/mdx/pages/route.ts b/app/api/mdx/pages/route.ts new file mode 100644 index 0000000..c8b101a --- /dev/null +++ b/app/api/mdx/pages/route.ts @@ -0,0 +1,46 @@ +import { NextResponse } from "next/server"; +import clientPromise from "@/lib/db"; + +export async function GET() { + try { + const client = await clientPromise; + const db = client.db(); + const pages = await db.collection("pages").find({}).toArray(); + return NextResponse.json(pages, { status: 200 }); + } catch (error) { + return NextResponse.json( + { error: "Failed to load pages" }, + { status: 500 } + ); + } +} + +export async function POST(req: Request) { + try { + const body = await req.json(); + const { title, slug, content } = body; + + const client = await clientPromise; + const db = client.db(); + const result = await db + .collection("pages") + .insertOne({ title, slug, content }); + + if (result.acknowledged) { + const newPage = await db + .collection("pages") + .findOne({ _id: result.insertedId }); + return NextResponse.json(newPage, { status: 201 }); + } else { + return NextResponse.json( + { error: "Failed to create page" }, + { status: 500 } + ); + } + } catch (error) { + return NextResponse.json( + { error: "Failed to create page" }, + { status: 500 } + ); + } +} diff --git a/components/cards/testimonialCard.tsx b/components/cards/testimonialCard.tsx index a8184dc..6fe6fb9 100644 --- a/components/cards/testimonialCard.tsx +++ b/components/cards/testimonialCard.tsx @@ -18,7 +18,7 @@ const TestimonialCard = ({ }: TestimonialCard) => { return (
  • -
    +
    -
    {name}
    +
    {name}
    -
    {role}
    +
    {role}
    -

    {testimonial}

    +

    {testimonial}

    {/* {
    - Designed and Developed by{" "} + {/* TODO: */} + {/* put tos and pp here instead */} + TOS and PP{" "} {

    - + Simplify {" "} your server logic performance