fix: exercices dans panneau IA + erreur language
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m6s
CI / Deploy production (on server) (push) Has been skipped

- Générateur d'exercices déplacé du menu ⋯ vers le panneau IA (onglet Actions > Outils de génération)
- Même design que les cartes slides/diagrammes
- Fix: import useLanguage supprimé de la route API (hook client en serveur)
- i18n FR/EN
This commit is contained in:
Antigravity
2026-06-14 20:02:19 +00:00
parent 104af3149f
commit 08d190eb03
5 changed files with 59 additions and 13 deletions

View File

@@ -218,7 +218,7 @@ export function ContextualAIChat({
const [translateTarget, setTranslateTarget] = useState('')
// Generate slides / diagram state
const [generateLoading, setGenerateLoading] = useState<'slides' | 'diagram' | null>(null)
const [generateLoading, setGenerateLoading] = useState<'slides' | 'diagram' | 'exercises' | null>(null)
const [generateProgress, setGenerateProgress] = useState(0)
const [generateResult, setGenerateResult] = useState<GenerateResult | null>(null)
const [customLangInput, setCustomLangInput] = useState('')
@@ -1228,6 +1228,54 @@ export function ContextualAIChat({
</div>
</div>
{/* ── Générateur d'exercices ── */}
{noteId && (
<div className="group relative p-6 rounded-2xl bg-white border border-border hover:border-brand-accent/30 transition-all duration-500 overflow-hidden">
<div className="absolute top-0 right-0 p-4 opacity-5 group-hover:opacity-10 transition-opacity">
<PenTool size={80} className="text-brand-accent" />
</div>
<div className="relative space-y-4">
<div className="flex items-center gap-3">
<div className="p-2 bg-slate-50 rounded-lg text-brand-accent"><PenTool size={18} /></div>
<div className="space-y-0.5">
<h5 className="text-sm font-bold text-foreground leading-none">{t('ai.generate.exercises') || 'Générer des exercices'}</h5>
<p className="text-[9px] text-foreground/40 uppercase tracking-tight">{t('ai.generate.exercisesHint') || '5 exercices avec corrigés'}</p>
</div>
</div>
<p className="text-[10px] text-foreground/50 leading-relaxed">
{t('ai.generate.exercisesDesc') || "L'IA crée 5 exercices basés sur cette note, avec des niveaux de difficulté variés et des corrigés détaillés."}
</p>
<button
onClick={async () => {
if (!noteId) return
setGenerateLoading('exercises')
try {
const res = await fetch('/api/ai/generate-exercises', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ noteId, count: 5, language: t('ai.language') === 'فارسی' ? 'fa' : 'fr' }),
})
const data = await res.json()
if (res.ok && data.exercises) {
toast.success(`${data.exercises.length} ${t('ai.generate.exercisesCreated') || 'exercices créés !'}`)
} else {
toast.error(data.error || 'Erreur')
}
} catch (e: any) {
toast.error(e.message || 'Erreur')
} finally {
setGenerateLoading(null)
}
}}
disabled={!!generateLoading}
className="w-full py-3.5 bg-brand-accent text-white rounded-xl text-[10px] font-bold flex items-center justify-center gap-2 hover:opacity-90 transition-all shadow-lg shadow-brand-accent/20 uppercase tracking-[0.2em] disabled:opacity-50"
>
{generateLoading === 'exercises' ? <Loader2 size={14} className="animate-spin" /> : <><PenTool size={14} className="opacity-80" /> {t('ai.generate.generateExercises') || 'Générer'}</>}
</button>
</div>
</div>
)}
{/* ── Personas IA ── */}
<PersonasPanel noteTitle={noteTitle} noteContent={noteContent} />

View File

@@ -479,17 +479,6 @@ export function NoteEditorToolbar({ mode, onClose, onToggleAttachments, attachme
<Printer className="h-4 w-4 me-2" />
{t('richTextEditor.exportPdf') || 'Exporter en PDF'}
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleGenerateExercises} disabled={generatingExercises}>
{generatingExercises
? <Loader2Icon className="h-4 w-4 me-2 animate-spin" />
: <PenTool className="h-4 w-4 me-2 text-brand-accent" />
}
{generatingExercises
? (t('richTextEditor.exercisesLoading') || 'Génération...')
: (t('richTextEditor.generateExercises') || 'Générer des exercices')
}
</DropdownMenuItem>
<DropdownMenuItem onClick={openMarkdownImport}>
<FileUp className="h-4 w-4 me-2" />
{t('richTextEditor.importMarkdown')}