/** * Page /sujets — sélection d'un sujet en cartes pour une production en cours. * * Flux : * 1. /simulation/ee → selectTask (POST /simulations) → navigate('/sujets') * 2. Ici : liste les sujets de la tâche en cours, permet choix manuel ou aléatoire * 3. Sélection → changeSubject + navigate('/simulation/ee') (SimulationForm visible) * * MVP : refresh direct sur /sujets → redirect vers /simulation/ee (pas de state). * Règle D : aucun contrôle de plan/quota ici — déjà fait à la création de la simulation. * Règle H : aucune logique métier — délègue au provider + useSujets. * Règle L : tokens Direction H exclusivement. */ import { useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { Shuffle } from 'lucide-react' import { Button } from '@/shared/ui/Button' import { formatTache } from '@/entities/production/lib' import type { SujetData } from '@/entities/production/types' import { useSimulationFlow } from '../state/simulationFlow' import { useSujets } from '../hooks/useSujets' import { SujetCard } from '../components/SujetCard' function SujetsSkeleton() { return (
{Array.from({ length: 6 }).map((_, i) => (
))}
) } export function SujetsPage() { const navigate = useNavigate() const { step, production, changeSubject, setStep, reset } = useSimulationFlow() // Redirige vers /simulation/ee si : // - production absente (refresh direct sur /sujets sans contexte) // - step === 'idle' (état initial, pas de simulation en cours) // - step === 'done' (simulation corrigée — /sujets ne doit pas patcher // une simulation dont le rapport est déjà persisté — cf. FTD-23) const shouldRedirect = !production || step === 'idle' || step === 'done' useEffect(() => { if (shouldRedirect) navigate('/simulation/ee', { replace: true }) }, [shouldRedirect, navigate]) const { data: sujets, isLoading, isError, refetch } = useSujets( production?.tache ?? 'EE_T1', !!production && !shouldRedirect, ) if (shouldRedirect || !production) return null function handleSelect(sujet: SujetData) { changeSubject(sujet) setStep('task-selected') navigate('/simulation/ee') } function handleRandom() { if (!sujets || sujets.length === 0) return const pool = production?.sujet ? sujets.filter((s) => s.id !== production.sujet?.id) : sujets const list = pool.length > 0 ? pool : sujets const pick = list[Math.floor(Math.random() * list.length)] if (pick) handleSelect(pick) } const hasSujets = (sujets?.length ?? 0) > 0 return (

Choisir un sujet — {formatTache(production.tache)}

{isLoading ? 'Chargement des sujets…' : hasSujets ? `${sujets!.length} sujet${sujets!.length > 1 ? 's' : ''} disponible${sujets!.length > 1 ? 's' : ''}.` : 'Aucun sujet disponible pour cette tâche.'}

{isError && (
Impossible de charger les sujets.{' '}
)} {isLoading ? ( ) : hasSujets ? (
{sujets!.map((sujet) => ( ))}
) : null}
) }