From 7421aebf742e68e891d17639197a09896d6688e3 Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Sun, 15 Feb 2026 11:05:58 +0100 Subject: [PATCH] feat(teamsbot): session auto-refresh polling for dashboard and session view - Dashboard: poll sessions every 10s when active sessions exist - Session view: poll every 5s as fallback when SSE not connected Co-authored-by: Cursor --- .../views/teamsbot/TeamsbotDashboardView.tsx | 14 +++++++++++++- .../views/teamsbot/TeamsbotSessionView.tsx | 19 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/pages/views/teamsbot/TeamsbotDashboardView.tsx b/src/pages/views/teamsbot/TeamsbotDashboardView.tsx index 53b9300..01fbd9b 100644 --- a/src/pages/views/teamsbot/TeamsbotDashboardView.tsx +++ b/src/pages/views/teamsbot/TeamsbotDashboardView.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import * as teamsbotApi from '../../../api/teamsbotApi'; import type { TeamsbotSession, StartSessionRequest } from '../../../api/teamsbotApi'; @@ -39,6 +39,18 @@ export const TeamsbotDashboardView: React.FC = () => { _loadSessions(); }, [_loadSessions]); + // Auto-refresh: poll every 10s when there are active sessions + const pollRef = useRef | null>(null); + useEffect(() => { + const hasActiveSessions = sessions.some(s => ['pending', 'joining', 'active'].includes(s.status)); + if (hasActiveSessions && instanceId) { + pollRef.current = setInterval(() => { + teamsbotApi.listSessions(instanceId).then(r => setSessions(r.sessions || [])).catch(() => {}); + }, 10000); + } + return () => { if (pollRef.current) clearInterval(pollRef.current); }; + }, [sessions, instanceId]); + const _handleStartSession = async () => { if (!meetingLink.trim()) return; diff --git a/src/pages/views/teamsbot/TeamsbotSessionView.tsx b/src/pages/views/teamsbot/TeamsbotSessionView.tsx index fbc1ce0..80b70a5 100644 --- a/src/pages/views/teamsbot/TeamsbotSessionView.tsx +++ b/src/pages/views/teamsbot/TeamsbotSessionView.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef, useCallback } from 'react'; +import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { useSearchParams } from 'react-router-dom'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import * as teamsbotApi from '../../../api/teamsbotApi'; @@ -121,6 +121,23 @@ export const TeamsbotSessionView: React.FC = () => { }; }, [instanceId, sessionId, session?.status]); + // Polling fallback: refresh session data every 5s when session is active (in case SSE fails) + const pollRef = useRef | null>(null); + const isActive = useMemo(() => session && ['pending', 'joining', 'active'].includes(session.status), [session]); + useEffect(() => { + if (isActive && instanceId && sessionId && !isLive) { + pollRef.current = setInterval(async () => { + try { + const result = await teamsbotApi.getSession(instanceId, sessionId); + setSession(result.session); + if (result.transcripts) setTranscripts(result.transcripts); + if (result.botResponses) setBotResponses(result.botResponses); + } catch {} + }, 5000); + } + return () => { if (pollRef.current) clearInterval(pollRef.current); }; + }, [isActive, instanceId, sessionId, isLive]); + // Auto-scroll transcript useEffect(() => { transcriptEndRef.current?.scrollIntoView({ behavior: 'smooth' });