import React, { useState, useEffect, useCallback, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import * as teamsbotApi from '../../../api/teamsbotApi'; import type { TeamsbotSession, StartSessionRequest, TeamsbotJoinMode } from '../../../api/teamsbotApi'; import { getUserDataCache } from '../../../utils/userCache'; import styles from './Teamsbot.module.css'; /** * TeamsbotDashboardView - Overview of all Teams Bot sessions. * Allows starting new sessions and viewing active/past sessions. */ export const TeamsbotDashboardView: React.FC = () => { const { instance, mandateId, featureCode } = useCurrentInstance(); const instanceId = instance?.id || ''; const navigate = useNavigate(); const cachedUser = getUserDataCache(); const _isSysAdmin = cachedUser?.isSysAdmin === true; const [sessions, setSessions] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // New session form const [meetingLink, setMeetingLink] = useState(''); const [botName, setBotName] = useState(''); const [joinMode, setJoinMode] = useState('anonymous'); const [sessionContext, setSessionContext] = useState(''); const [isStarting, setIsStarting] = useState(false); const _loadSessions = useCallback(async () => { if (!instanceId) return; try { setLoading(true); const result = await teamsbotApi.listSessions(instanceId); setSessions(result.sessions || []); setError(null); } catch (err: any) { setError(err.message || 'Fehler beim Laden der Sitzungen'); } finally { setLoading(false); } }, [instanceId]); useEffect(() => { _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; setIsStarting(true); setError(null); try { const request: StartSessionRequest = { meetingLink: meetingLink.trim(), botName: botName.trim() || undefined, joinMode: joinMode, sessionContext: sessionContext.trim() || undefined, }; await teamsbotApi.startSession(instanceId, request); setMeetingLink(''); setBotName(''); await _loadSessions(); } catch (err: any) { setError(err.message || 'Fehler beim Starten der Sitzung'); } finally { setIsStarting(false); } }; const _handleStopSession = async (sessionId: string) => { try { await teamsbotApi.stopSession(instanceId, sessionId); await _loadSessions(); } catch (err: any) { setError(err.message || 'Fehler beim Stoppen der Sitzung'); } }; const _handleDeleteSession = async (sessionId: string) => { try { await teamsbotApi.deleteSession(instanceId, sessionId); await _loadSessions(); } catch (err: any) { setError(err.message || 'Fehler beim Loeschen der Sitzung'); } }; const _getStatusBadgeClass = (status: string) => { switch (status) { case 'active': return styles.statusActive; case 'joining': return styles.statusJoining; case 'pending': return styles.statusPending; case 'ended': return styles.statusEnded; case 'error': return styles.statusError; case 'leaving': return styles.statusLeaving; default: return ''; } }; const _getStatusLabel = (status: string) => { const labels: Record = { pending: 'Wartend', joining: 'Beitritt...', active: 'Aktiv', leaving: 'Verlassen...', ended: 'Beendet', error: 'Fehler', }; return labels[status] || status; }; const activeSessions = sessions.filter(s => ['pending', 'joining', 'active'].includes(s.status)); const pastSessions = sessions.filter(s => ['ended', 'error', 'leaving'].includes(s.status)); return (
{/* Start New Session Card */}

Neue Bot-Sitzung starten

Fuege den Teams Meeting-Link ein, um den AI-Bot in ein Meeting einzuschleusen.

setMeetingLink(e.target.value)} disabled={isStarting} />
setBotName(e.target.value)} disabled={isStarting} />