import React, { useState, useEffect, useCallback } from 'react'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import * as teamsbotApi from '../../../api/teamsbotApi'; import type { TeamsbotSession, StartSessionRequest } from '../../../api/teamsbotApi'; 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 } = useCurrentInstance(); const instanceId = instance?.id || ''; 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 [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]); const _handleStartSession = async () => { if (!meetingLink.trim()) return; setIsStarting(true); setError(null); try { const request: StartSessionRequest = { meetingLink: meetingLink.trim(), botName: botName.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} />
{error &&
{error}
} {/* Active Sessions */} {activeSessions.length > 0 && (

Aktive Sitzungen

{activeSessions.map((session) => (
{session.botName} {_getStatusLabel(session.status)}
{session.transcriptSegmentCount} Segmente {session.botResponseCount} Antworten {session.startedAt && Seit: {new Date(session.startedAt).toLocaleTimeString('de-CH')}}
Live ansehen {session.status === 'active' && ( )}
))}
)} {/* Past Sessions */}

{loading ? 'Lade Sitzungen...' : `Vergangene Sitzungen (${pastSessions.length})`}

{pastSessions.length === 0 && !loading && (

Noch keine vergangenen Sitzungen.

)}
{pastSessions.map((session) => (
{session.botName} {_getStatusLabel(session.status)}
{session.transcriptSegmentCount} Segmente {session.botResponseCount} Antworten {session.startedAt && {new Date(session.startedAt).toLocaleDateString('de-CH')}}
{session.summary && (
{session.summary.substring(0, 200)}...
)} {session.errorMessage && (
{session.errorMessage}
)}
Details
))}
); }; export default TeamsbotDashboardView;