/** * TeamsBot Assistant View * * Wizard: Select/create module → Meeting link → Bot selection → "Start bot" */ import React, { useState, useEffect, useCallback } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { useCurrentInstance } from '../../../hooks/useCurrentInstance'; import * as teamsbotApi from '../../../api/teamsbotApi'; import { useLanguage } from '../../../providers/language/LanguageContext'; import styles from './Teamsbot.module.css'; type WizardStep = 'module' | 'meeting' | 'bot' | 'confirm'; const STEPS: WizardStep[] = ['module', 'meeting', 'bot', 'confirm']; export const TeamsbotAssistantView: React.FC = () => { const { t } = useLanguage(); const { instance, mandateId } = useCurrentInstance(); const instanceId = instance?.id || ''; const navigate = useNavigate(); const [searchParams] = useSearchParams(); const preselectedModuleId = searchParams.get('moduleId'); const [step, setStep] = useState(preselectedModuleId ? 'meeting' : 'module'); const [modules, setModules] = useState([]); const [selectedModuleId, setSelectedModuleId] = useState(preselectedModuleId); const [newModuleTitle, setNewModuleTitle] = useState(''); const [createNewModule, setCreateNewModule] = useState(false); const [meetingLink, setMeetingLink] = useState(''); const [botName, setBotName] = useState('AI Assistant'); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const stepIdx = STEPS.indexOf(step); const _loadModules = useCallback(async () => { if (!instanceId) return; try { const result = await teamsbotApi.listModules(instanceId); setModules(result || []); } catch (err) { console.error('Failed to load modules:', err); } }, [instanceId]); useEffect(() => { _loadModules(); }, [_loadModules]); const _handleNext = () => { const nextIdx = stepIdx + 1; if (nextIdx < STEPS.length) setStep(STEPS[nextIdx]); }; const _handleBack = () => { const prevIdx = stepIdx - 1; if (prevIdx >= 0) setStep(STEPS[prevIdx]); }; const _handleStart = async () => { if (!meetingLink.trim()) { setError(t('Meeting-Link erforderlich')); return; } setLoading(true); setError(null); try { let moduleId = selectedModuleId; if (createNewModule && newModuleTitle.trim()) { const mod = await teamsbotApi.createModule(instanceId, { title: newModuleTitle.trim() }); moduleId = mod.id; } const result = await teamsbotApi.startSession(instanceId, { meetingLink: meetingLink.trim(), botName, moduleId: moduleId || undefined, } as any); navigate(`/mandates/${mandateId}/teamsbot/${instanceId}/sessions?sessionId=${result.session.id}`); } catch (err: any) { setError(err?.message || t('Fehler beim Starten')); } finally { setLoading(false); } }; return (

{t('Neues Meeting starten')}

{STEPS.map((s, i) => (
))}
{error &&
{error}
}
{step === 'module' && (

{t('Meeting-Modul wählen')}

{!createNewModule && ( )} {createNewModule && ( setNewModuleTitle(e.target.value)} /> )}
)} {step === 'meeting' && (

{t('Meeting-Link')}

setMeetingLink(e.target.value)} autoFocus />
)} {step === 'bot' && (

{t('Bot-Name')}

setBotName(e.target.value)} />
)} {step === 'confirm' && (

{t('Zusammenfassung')}

{t('Modul')}: {createNewModule ? newModuleTitle : (modules.find(m => m.id === selectedModuleId)?.title || t('Adhoc'))}
{t('Meeting')}: {meetingLink}
{t('Bot')}: {botName}
)}
{stepIdx > 0 && ( )}
{step !== 'confirm' ? ( ) : ( )}
); };