From af7b913d9a23ca32597486a441b3885c278d3f84 Mon Sep 17 00:00:00 2001 From: Alma Date: Wed, 9 Apr 2025 22:43:54 +0200 Subject: [PATCH] update widget 3 --- app/api/rocket-chat/messages/route.ts | 14 +++- components/parole.tsx | 105 ++++++++++++++++++-------- 2 files changed, 84 insertions(+), 35 deletions(-) diff --git a/app/api/rocket-chat/messages/route.ts b/app/api/rocket-chat/messages/route.ts index e236814c..60a5dd44 100644 --- a/app/api/rocket-chat/messages/route.ts +++ b/app/api/rocket-chat/messages/route.ts @@ -9,11 +9,19 @@ export async function GET() { 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', { + // Get the access token from the session + const accessToken = session.accessToken; + if (!accessToken) { + return NextResponse.json({ error: "No access token found" }, { status: 401 }); + } + + // Use the Keycloak token to authenticate with Rocket.Chat + const response = await fetch('https://parole.slm-lab.net/api/v1/channels.messages', { headers: { - 'Cookie': `rc_token=${session.accessToken}`, // Use the session token + 'Authorization': `Bearer ${accessToken}`, }, + // Add cache control to prevent stale data + cache: 'no-store', }); if (!response.ok) { diff --git a/components/parole.tsx b/components/parole.tsx index bdf03e84..d7791c9a 100644 --- a/components/parole.tsx +++ b/components/parole.tsx @@ -2,6 +2,8 @@ import { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { RefreshCw } from "lucide-react"; interface Message { _id: string; @@ -18,52 +20,91 @@ export function Parole() { const [messages, setMessages] = useState([]); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); + const [refreshing, setRefreshing] = useState(false); + + const fetchMessages = async (isRefresh = false) => { + try { + if (isRefresh) { + setRefreshing(true); + } + const response = await fetch('/api/rocket-chat/messages', { + // Prevent caching + cache: 'no-store', + next: { revalidate: 0 }, + }); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error || 'Failed to fetch messages'); + } + + const data = await response.json(); + if (Array.isArray(data.messages)) { + setMessages(data.messages); + } else { + console.warn('Unexpected data format:', data); + setMessages([]); + } + setError(null); + } catch (err) { + console.error('Error fetching messages:', err); + setError(err instanceof Error ? err.message : 'Failed to fetch messages'); + } finally { + setLoading(false); + setRefreshing(false); + } + }; useEffect(() => { - const fetchMessages = async () => { - try { - 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 = await response.json(); - setMessages(data.messages || []); - setError(null); - } catch (err) { - console.error('Error fetching messages:', err); - setError(err instanceof Error ? err.message : 'Failed to fetch messages'); - } finally { - setLoading(false); - } - }; - fetchMessages(); // Set up polling every 30 seconds - const interval = setInterval(fetchMessages, 30000); + const interval = setInterval(() => fetchMessages(), 30000); return () => clearInterval(interval); }, []); return ( - + Parole Messages + - {loading &&

Loading messages...

} - {error &&

Error: {error}

} + {loading &&

Loading messages...

} + {error && ( +
+

Error: {error}

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

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

-

{message.msg}

-

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

-
- ))} + {messages.length === 0 ? ( +

No messages found

+ ) : ( + messages.map((message) => ( +
+

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

+

{message.msg}

+

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

+
+ )) + )}
)}