From e65bb79034cc6b0bd66187c0bdaa0838a80fa115 Mon Sep 17 00:00:00 2001 From: Alma Date: Wed, 9 Apr 2025 22:35:40 +0200 Subject: [PATCH] update widget 2 --- app/api/rocket-chat/messages/route.ts | 39 ++++++++++++++++++++++++ components/parole.tsx | 43 +++++++-------------------- 2 files changed, 50 insertions(+), 32 deletions(-) create mode 100644 app/api/rocket-chat/messages/route.ts diff --git a/app/api/rocket-chat/messages/route.ts b/app/api/rocket-chat/messages/route.ts new file mode 100644 index 00000000..e236814c --- /dev/null +++ b/app/api/rocket-chat/messages/route.ts @@ -0,0 +1,39 @@ +import { getServerSession } from "next-auth"; +import { authOptions } from "@/app/api/auth/[...nextauth]/route"; +import { NextResponse } from "next/server"; + +export async function GET() { + try { + const session = await getServerSession(authOptions); + if (!session) { + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); + } + + // Get messages from Rocket.Chat + const response = await fetch('https://parole.slm-lab.net/api/v1/channels.messages?roomName=general', { + headers: { + 'Cookie': `rc_token=${session.accessToken}`, // Use the session token + }, + }); + + if (!response.ok) { + console.error('Rocket.Chat API error:', { + status: response.status, + statusText: response.statusText, + }); + return NextResponse.json( + { error: "Failed to fetch messages" }, + { status: response.status } + ); + } + + const data = await response.json(); + return NextResponse.json(data); + } catch (error) { + console.error('Error fetching messages:', error); + return NextResponse.json( + { error: "Internal server error" }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/components/parole.tsx b/components/parole.tsx index 8d870918..bdf03e84 100644 --- a/components/parole.tsx +++ b/components/parole.tsx @@ -22,38 +22,14 @@ export function Parole() { useEffect(() => { const fetchMessages = async () => { try { - // First, login to get auth token - const loginResponse = await fetch('https://parole.slm-lab.net/api/v1/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - user: process.env.NEXT_PUBLIC_ROCKET_CHAT_USER, - password: process.env.NEXT_PUBLIC_ROCKET_CHAT_PASSWORD, - }), - }); - - if (!loginResponse.ok) { - throw new Error('Failed to authenticate with RocketChat'); + const response = await fetch('/api/rocket-chat/messages'); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error || 'Failed to fetch messages'); } - const { data: authData } = await loginResponse.json(); - - // Then fetch messages using the auth token - const messagesResponse = await fetch('https://parole.slm-lab.net/api/v1/channels.messages?roomName=general', { - headers: { - 'X-Auth-Token': authData.authToken, - 'X-User-Id': authData.userId, - }, - }); - - if (!messagesResponse.ok) { - throw new Error('Failed to fetch messages'); - } - - const { messages: chatMessages } = await messagesResponse.json(); - setMessages(chatMessages); + const data = await response.json(); + setMessages(data.messages || []); setError(null); } catch (err) { console.error('Error fetching messages:', err); @@ -64,6 +40,9 @@ export function Parole() { }; fetchMessages(); + // Set up polling every 30 seconds + const interval = setInterval(fetchMessages, 30000); + return () => clearInterval(interval); }, []); return ( @@ -75,11 +54,11 @@ export function Parole() { {loading &&

Loading messages...

} {error &&

Error: {error}

} {!loading && !error && ( -
+
{messages.map((message) => (

{message.u.name || message.u.username}

-

{message.msg}

+

{message.msg}

{new Date(message.ts).toLocaleString()}