Contexte
Le fil de conversation (src/app/(app)/chat/chat-shell.tsx) rend l'intégralité des messages à chaque mise à jour, sans virtualisation : sur une longue conversation, chaque token streamé re-rend toute la liste. Un premier palier a été posé (mémoïsation du rendu Markdown des messages historiques via React.memo + onOpenDoc stable), mais le fond reste à traiter.
Proposition
- Virtualiser la liste (fenêtrage, p. ex.
@tanstack/react-virtual) pour ne monter que les messages visibles.
- Extraire un composant
MessageRow mémoïsé, en gardant le message en cours de streaming réactif.
- Préserver l'auto-scroll et le bouton « revenir en bas ».
Critères d'acceptation
Contexte
Le fil de conversation (
src/app/(app)/chat/chat-shell.tsx) rend l'intégralité des messages à chaque mise à jour, sans virtualisation : sur une longue conversation, chaque token streamé re-rend toute la liste. Un premier palier a été posé (mémoïsation du rendu Markdown des messages historiques viaReact.memo+onOpenDocstable), mais le fond reste à traiter.Proposition
@tanstack/react-virtual) pour ne monter que les messages visibles.MessageRowmémoïsé, en gardant le message en cours de streaming réactif.Critères d'acceptation