From e6e24f12d452fa12d56dfe743dd03c3da511dd9c Mon Sep 17 00:00:00 2001
From: briannelson95 <71141646+briannelson95@users.noreply.github.com>
Date: Wed, 2 Jul 2025 20:33:23 -0400
Subject: [PATCH] pagination
---
app/(auth)/dashboard/page.tsx | 4 +-
app/(auth)/guest-book/page.tsx | 21 ++++++--
app/api/guestbook/paginate/route.ts | 24 +++++++++
components/EventInfoDisplay.tsx | 82 ++++++++++++++++++++++-------
components/EventNotesEditor.tsx | 2 +-
components/GuestBookPageClient.tsx | 35 +++++++++++-
components/events/EventHeader.tsx | 13 +++++
lib/helper/getDaysUntilEvent.ts | 13 +++++
lib/queries.ts | 47 ++++++++++++++---
9 files changed, 211 insertions(+), 30 deletions(-)
create mode 100644 app/api/guestbook/paginate/route.ts
create mode 100644 components/events/EventHeader.tsx
create mode 100644 lib/helper/getDaysUntilEvent.ts
diff --git a/app/(auth)/dashboard/page.tsx b/app/(auth)/dashboard/page.tsx
index fc31f49..4844f25 100644
--- a/app/(auth)/dashboard/page.tsx
+++ b/app/(auth)/dashboard/page.tsx
@@ -8,7 +8,9 @@ import React from 'react'
export default async function DashboardPage() {
const events = await queries.fetchEvents();
- const guestBookEntries = await queries.fetchGuestBookEntries(5);
+ const guestBookData = await queries.fetchGuestBookEntries({ takeOnlyRecent: 5 });
+
+ const guestBookEntries = Array.isArray(guestBookData) ? guestBookData : guestBookData.entries;
return (
diff --git a/app/(auth)/guest-book/page.tsx b/app/(auth)/guest-book/page.tsx
index 9dc5905..8a2b4b2 100644
--- a/app/(auth)/guest-book/page.tsx
+++ b/app/(auth)/guest-book/page.tsx
@@ -3,11 +3,26 @@ import { queries } from '@/lib/queries'
import { getServerSession } from 'next-auth'
import GuestBookPageClient from '@/components/GuestBookPageClient'
-export default async function GuestBookPage() {
+export default async function GuestBookPage({ searchParams }: { searchParams: { page?: string } }) {
const session = await getServerSession(authOptions)
if (!session?.user) return
Unauthorized
- const entries = await queries.fetchGuestBookEntries()
+ const currentPage = Number(searchParams.page) || 1
- return
+ const guestBookData = await queries.fetchGuestBookEntries({
+ page: currentPage,
+ pageSize: 10,
+ })
+
+ const { entries, totalPages, currentPage: verifiedPage } = !Array.isArray(guestBookData)
+ ? guestBookData
+ : { entries: guestBookData, totalPages: 1, currentPage: 1 }
+
+ return (
+
+ )
}
diff --git a/app/api/guestbook/paginate/route.ts b/app/api/guestbook/paginate/route.ts
new file mode 100644
index 0000000..6afe7f2
--- /dev/null
+++ b/app/api/guestbook/paginate/route.ts
@@ -0,0 +1,24 @@
+import { NextRequest, NextResponse } from 'next/server'
+import { prisma } from '@/lib/prisma'
+
+export async function GET(req: NextRequest) {
+ const { searchParams } = new URL(req.url)
+ const cursor = searchParams.get('cursor') ?? undefined
+ const take = parseInt(searchParams.get('take') || '10', 10)
+
+ try {
+ const entries = await prisma.guestBookEntry.findMany({
+ take,
+ skip: cursor ? 1 : 0,
+ ...(cursor && { cursor: { id: cursor } }),
+ orderBy: [{ lName: 'asc' }, { fName: 'asc' }],
+ })
+
+ const nextCursor = entries.length === take ? entries[entries.length - 1].id : null
+
+ return NextResponse.json({ entries, nextCursor })
+ } catch (error) {
+ console.error('[GET GUESTBOOK PAGINATE]', error)
+ return NextResponse.json({ message: 'Failed to fetch paginated entries' }, { status: 500 })
+ }
+}
diff --git a/components/EventInfoDisplay.tsx b/components/EventInfoDisplay.tsx
index 695755c..bb7fa5a 100644
--- a/components/EventInfoDisplay.tsx
+++ b/components/EventInfoDisplay.tsx
@@ -7,6 +7,8 @@ import AddGuestFromGuestBook from './AddGuestFromGuestBook'
import EventNotesEditor from './EventNotesEditor'
import ToDoList from './ToDoList'
import { fetchEventTodos } from '@/lib/helper/fetchTodos'
+import EventHeader from './events/EventHeader'
+import { getDaysUntilEvent } from '@/lib/helper/getDaysUntilEvent'
interface Creator {
id: string
@@ -48,6 +50,7 @@ export default function EventInfoDisplay({ event }: Props) {
const [todos, setTodos] = useState(event.todos)
const eventGuests = event.eventGuests
+ console.log(eventGuests)
const [saving, setSaving] = useState(false)
const [error, setError] = useState('')
@@ -109,11 +112,26 @@ export default function EventInfoDisplay({ event }: Props) {
return `${d.toLocaleDateString()} ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`
}
+ const attendingGuests = eventGuests.filter((g) => g.rsvp === 'YES');
+ const notAttendingGuests = eventGuests.filter((g) => g.rsvp === 'NO');
+ const pendingGuests = eventGuests.filter((g) => g.rsvp === 'PENDING');
+
+ let daysLeft
+
+ if (event.date !== null) {
+ daysLeft = getDaysUntilEvent(event.date);
+ }
+
return (
+ {/*
*/}
-
{event.name}
+
{event.name}
@@ -153,17 +171,45 @@ export default function EventInfoDisplay({ event }: Props) {
{event.location || 'N/A'}
)}
-
- {/* Creator Email */}
-
-
+ {/*
+
{event.creator.email}
-
-
- {/* Created At */}
-
-
+
{formatDate(event.createdAt)}
+
*/}
+
+
+
Guest Summary
+
+
+
Invited
+
{eventGuests.length}
+
+
+
Attending
+
{attendingGuests.length}
+
+
+
Declined
+
{notAttendingGuests.length}
+
+
+
No Response
+
{pendingGuests.length}
+
+
+
+
+
Countdown
+
+ {daysLeft && daysLeft > 0
+ ? `${daysLeft} day${daysLeft !== 1 ? 's' : ''} until the event`
+ : daysLeft === 0
+ ? 'Today is the big day!'
+ : `This event happened ${Math.abs(daysLeft)} day${Math.abs(daysLeft) !== 1 ? 's' : ''} ago`
+ }
+
+
{error &&
{error}
}
@@ -178,13 +224,6 @@ export default function EventInfoDisplay({ event }: Props) {
)}
-
-
-