diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e8cc8fe..bdfff08 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -208,6 +208,7 @@ function TutorApp({ currentUser, onLogout }) { const [audioDebug, setAudioDebug] = useState([]) const [voiceProfiles, setVoiceProfiles] = useState([]) const [selectedVoiceProfileId, setSelectedVoiceProfileId] = useState('') + const [progressPanelOpen, setProgressPanelOpen] = useState(false) const mediaRecorderRef = useRef(null) const mediaStreamRef = useRef(null) const recordedChunksRef = useRef([]) @@ -491,6 +492,7 @@ function TutorApp({ currentUser, onLogout }) { stopSpeechPlayback() deactivateAutoListening(false) setSessionActive(false) + setProgressPanelOpen(false) setCurrentInstruction('') setAssessment(null) setAssessmentAnswer('') @@ -871,6 +873,151 @@ function TutorApp({ currentUser, onLogout }) { } } + const lastAssistantMessage = [...messages].reverse().find((message) => message.role === 'assistant') + const lastUserMessage = [...messages].reverse().find((message) => message.role === 'user') + const lessonSummary = lastAssistantMessage?.content || 'Aucune ancienne seance trouvee pour le moment. Professeur TOP commencera par une reprise courte.' + const lastStudentWork = lastUserMessage?.content || 'Aucune reponse recente enregistree.' + const nextLessonAdvice = lessonFocus + ? `Conseil: reprendre ${lessonFocus.label}, puis lancer un exercice court pour equilibrer la progression.` + : 'Conseil: demarrer une seance pour laisser Professeur TOP choisir la prochaine lecon.' + + if (isStudentUser) { + return ( +
+ {!sessionActive ? ( +
+
+
+

Bonjour

+

{selectedStudent?.first_name || currentUser.username}

+

{selectedStudent?.grade || 'Classe non renseignee'}

+
+
+ + +
+
+ +
+
+ Derniere seance +

{lessonSummary}

+
+ +
+ Derniere reponse +

{lastStudentWork}

+
+ +
+
+ Avancement + {lessonPercent}% +
+

{lessonFocus?.label || 'Programme a definir'}

+
+
+
+
+ +
+ Prochaine lecon conseillee +

{nextLessonAdvice}

+
+
+ + {voiceStatus &&

{voiceStatus}

} + {errorMessage &&

{errorMessage}

} +
+ ) : ( +
+
+ +
+

Lecon en cours

+

{lessonFocus?.label || 'Cours du jour'}

+
+
+ + +
+
+ +
+ Professeur TOP + {currentInstruction ? ( +

{currentInstruction}

+ ) : ( +

Professeur TOP prepare la suite de la lecon.

+ )} +
+ +
+ Ta reponse +

{lastStudentTransmission || 'Dicte ou ecris ta reponse quand tu es pret.'}

+
+ +
+ + assessment ? setAssessmentAnswer(event.target.value) : setInput(event.target.value) + } + placeholder={assessment ? 'Ta reponse au mini-test...' : 'Ecris ta reponse...'} + /> + + + +
+ + {(voiceStatus || errorMessage || isAutoListening) && ( +

+ {errorMessage || voiceStatus || `Niveau micro: ${Math.round(Math.min(micLevel * 1200, 100))}%`} +

+ )} + + {progressPanelOpen && ( +
setProgressPanelOpen(false)}> + +
+ )} +
+ )} +
+ ) + } + return (