diff --git a/app/api/chat/messages/route.ts b/app/api/chat/messages/route.ts
index 43d25f70..03ff468c 100644
--- a/app/api/chat/messages/route.ts
+++ b/app/api/chat/messages/route.ts
@@ -1,6 +1,6 @@
import { NextRequest, NextResponse } from 'next/server';
import { createClient } from '@/lib/supabase-server';
-import { getMessagesByChatId, getChatById, requireAuth } from '@/lib/supabase-operations';
+import { getMessagesByChatId, getMessagesByChatIdPaginated, getChatById, requireAuth } from '@/lib/supabase-operations';
import { errorLogger, ErrorCategory } from '@/lib/error-logger';
export async function GET(request: NextRequest) {
@@ -17,25 +17,46 @@ export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url);
const chatId = searchParams.get('chatId');
+ const pageSize = parseInt(searchParams.get('pageSize') || '50', 10);
+ const cursor = searchParams.get('cursor'); // ISO timestamp for cursor-based pagination
errorLogger.info(
ErrorCategory.API,
'Messages API: Fetching messages for chatId:',
chatId,
'userId:',
- user.id
+ user.id,
+ 'pageSize:',
+ pageSize,
+ 'cursor:',
+ cursor
);
if (!chatId) {
return NextResponse.json({ error: 'Chat ID is required' }, { status: 400 });
}
+ // Validate pageSize
+ if (pageSize < 1 || pageSize > 100) {
+ return NextResponse.json({ error: 'Page size must be between 1 and 100' }, { status: 400 });
+ }
+
// Handle 'new' or 'default' chat IDs
if (chatId === 'new' || chatId === 'default') {
errorLogger.info(
ErrorCategory.API,
'Messages API: New/default chat, returning empty messages'
);
+ // Return paginated format if pageSize is specified
+ if (searchParams.has('pageSize')) {
+ return NextResponse.json({
+ messages: [],
+ chatId: null,
+ hasMore: false,
+ nextCursor: undefined,
+ totalCount: 0
+ });
+ }
return NextResponse.json({ messages: [], chatId: null });
}
@@ -59,22 +80,49 @@ export async function GET(request: NextRequest) {
return NextResponse.json({ error: 'Unauthorized access to chat' }, { status: 403 });
}
- // Fetch messages for the chat
- const messages = await getMessagesByChatId(chatId);
+ // Check if pagination is requested
+ if (searchParams.has('pageSize')) {
+ // Use paginated fetching
+ const paginatedResult = await getMessagesByChatIdPaginated(chatId, pageSize, cursor || undefined);
- errorLogger.info(
- ErrorCategory.API,
- 'Messages API: Found',
- messages.length,
- 'messages for chatId:',
- chatId
- );
+ errorLogger.info(
+ ErrorCategory.API,
+ 'Messages API: Found',
+ paginatedResult.messages.length,
+ 'messages (paginated) for chatId:',
+ chatId,
+ 'hasMore:',
+ paginatedResult.hasMore,
+ 'totalCount:',
+ paginatedResult.totalCount
+ );
+
+ return NextResponse.json({
+ messages: paginatedResult.messages,
+ chatId: chat.id,
+ chatTitle: chat.title,
+ hasMore: paginatedResult.hasMore,
+ nextCursor: paginatedResult.nextCursor,
+ totalCount: paginatedResult.totalCount,
+ });
+ } else {
+ // Use legacy non-paginated fetching for backwards compatibility
+ const messages = await getMessagesByChatId(chatId);
- return NextResponse.json({
- messages,
- chatId: chat.id,
- chatTitle: chat.title,
- });
+ errorLogger.info(
+ ErrorCategory.API,
+ 'Messages API: Found',
+ messages.length,
+ 'messages for chatId:',
+ chatId
+ );
+
+ return NextResponse.json({
+ messages,
+ chatId: chat.id,
+ chatTitle: chat.title,
+ });
+ }
} catch (error) {
errorLogger.error(ErrorCategory.API, 'Error fetching chat messages:', error);
return NextResponse.json(
diff --git a/app/layout.tsx b/app/layout.tsx
index 8b4f2c9b..1ade0e43 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -9,6 +9,8 @@ import { Toaster } from '@/components/ui/toaster';
import { Analytics } from '@vercel/analytics/next';
import './globals.css';
import { CookieConsentBanner } from '@/components/ui/cookie-consent-banner';
+import { QueryProvider } from '@/lib/query-client';
+import { SentryProvider } from '@/components/sentry-provider';
export const viewport: Viewport = {
themeColor: '#0D0D10',
@@ -69,14 +71,18 @@ export default function RootLayout({
>
-
-
- {children}
-
-
-
-
-
+
+
+
+
+ {children}
+
+
+
+
+
+
+