import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { BookOpen, Plus, Edit2, Trash2, ChevronRight, Building2, Sparkles, Loader2, X } from 'lucide-react'; import { useAuth } from '../lib/auth'; import { useTenant } from '../lib/tenant'; import { api } from '../lib/api'; import { useToast } from '../hooks/useToast'; import { logError } from '../lib/logger'; export default function TrackListPage() { const { t } = useTranslation(); const toast = useToast(); const { token } = useAuth(); const { selectedOrgId } = useTenant(); const navigate = useNavigate(); const [tracks, setTracks] = useState([]); const [loading, setLoading] = useState(true); // AI curriculum generator state const [aiModalOpen, setAiModalOpen] = useState(false); const [generating, setGenerating] = useState(false); const [aiForm, setAiForm] = useState({ description: '', numDays: 5, language: 'FR', targetAudience: '' }); const load = async () => { if (!token || !selectedOrgId) return; try { const data = await api.get('/v1/admin/tracks', token, selectedOrgId); setTracks(data); } catch (err) { logError(err); } finally { setLoading(false); } }; useEffect(() => { if (selectedOrgId && token) load(); }, [selectedOrgId, token]); const del = async (id: string) => { if (!confirm(t('tracks.confirm_delete'))) return; try { await api.delete(`/v1/admin/tracks/${id}`, token, selectedOrgId); load(); } catch (err) { logError(err); } }; const handleAiGenerate = async (e: React.FormEvent) => { e.preventDefault(); if (!token || !selectedOrgId || !aiForm.description.trim()) return; setGenerating(true); try { const res = await api.post( `/v1/organizations/${selectedOrgId}/content/ai-generate`, { ...aiForm, numDays: Number(aiForm.numDays) }, token, selectedOrgId ); setAiModalOpen(false); toast.success(`${res.track.title} — ${res.track.days.length} ${t('tracks.days')}`); load(); navigate(`/content/${res.track.id}/days`); } catch (err: any) { toast.error(err?.message ?? t('tracks.ai_error')); } finally { setGenerating(false); } }; if (!selectedOrgId) { return (

{t('common.select_org')}

); } if (loading) { return (

{t('common.loading')}

); } return (

{t('tracks.title')}

{tracks.map((track: any) => (

{track.title}

{track.isPremium && Premium} {track.language}

{track._count?.days || 0} {t('tracks.days')} · {track._count?.enrollments || 0} {t('tracks.enrolled')} · {track.duration}j

))} {!tracks.length && (

{t('tracks.no_tracks')}

)}
{/* AI Curriculum Generator Modal */} {aiModalOpen && (
!generating && setAiModalOpen(false)} />
{t('tracks.ai_modal_badge')}

{t('tracks.ai_modal_title')}

{t('tracks.ai_modal_subtitle')}

{!generating && ( )}