/** * TeamsBot Modules View * * CRUD list of MeetingModules with expandable session lists per module. */ import React, { useState, useEffect, useCallback } from 'react'; import { useNavigate } 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'; const SERIES_TYPE_LABELS: Record = { weekly: 'Wöchentlich', biweekly: 'Zweiwöchentlich', monthly: 'Monatlich', adhoc: 'Adhoc', project: 'Projekt', }; const STATUS_LABELS: Record = { active: 'Aktiv', archived: 'Archiviert', completed: 'Abgeschlossen', }; export const TeamsbotModulesView: React.FC = () => { const { t } = useLanguage(); const { instance, mandateId } = useCurrentInstance(); const instanceId = instance?.id || ''; const navigate = useNavigate(); const [modules, setModules] = useState([]); const [loading, setLoading] = useState(true); const [expandedId, setExpandedId] = useState(null); const [moduleSessions, setModuleSessions] = useState>({}); const [deleteConfirm, setDeleteConfirm] = useState(null); const [editingModule, setEditingModule] = useState(null); const _loadModules = useCallback(async () => { if (!instanceId) return; setLoading(true); try { const result = await teamsbotApi.listModules(instanceId); setModules(result || []); } catch (err) { console.error('Failed to load modules:', err); } finally { setLoading(false); } }, [instanceId]); useEffect(() => { _loadModules(); }, [_loadModules]); const _loadModuleSessions = useCallback(async (moduleId: string) => { if (!instanceId) return; try { const detail = await teamsbotApi.getModuleDetail(instanceId, moduleId); setModuleSessions(prev => ({ ...prev, [moduleId]: detail?.sessions || [] })); } catch (err) { console.error('Failed to load module sessions:', err); } }, [instanceId]); const _toggleExpand = (moduleId: string) => { if (expandedId === moduleId) { setExpandedId(null); } else { setExpandedId(moduleId); if (!moduleSessions[moduleId]) _loadModuleSessions(moduleId); } }; const _handleDelete = async (moduleId: string) => { try { await teamsbotApi.deleteModule(instanceId, moduleId); setDeleteConfirm(null); _loadModules(); } catch (err) { console.error('Delete failed:', err); } }; const _handleUpdate = async (moduleId: string, updates: any) => { try { await teamsbotApi.updateModule(instanceId, moduleId, updates); setEditingModule(null); _loadModules(); } catch (err) { console.error('Update failed:', err); } }; return (

{t('Meeting-Module')}

{loading &&
{t('Laden...')}
}
{modules.map(mod => (
_toggleExpand(mod.id)}> {t(SERIES_TYPE_LABELS[mod.seriesType] || mod.seriesType)} {mod.title} {t(STATUS_LABELS[mod.status] || mod.status)}
{expandedId === mod.id && (
{(moduleSessions[mod.id] || []).length === 0 ? (

{t('Keine Sitzungen')}

) : ( (moduleSessions[mod.id] || []).map((sess: any) => (
navigate(`/mandates/${mandateId}/teamsbot/${instanceId}/sessions?sessionId=${sess.id}`)} > {sess.botName || 'Bot'} {sess.status} {sess.startedAt ? new Date(sess.startedAt * 1000).toLocaleDateString() : '-'}
)) )}
)}
))}
{deleteConfirm && (

{t('Modul wirklich löschen? Sessions werden dem Modul entkoppelt.')}

)} {editingModule && (

{t('Modul bearbeiten')}

setEditingModule({ ...editingModule, title: e.target.value })} />