/** * Page /progression — Sprint 3.6c. * * Gating plan via `hasAccess(plan, 'pattern_analysis')` : * - Free + Standard → `BlurredProgression` (aperçu flouté + CTA upgrade) * - Premium → `ProgressionPremium` (NotReady ou contenu complet) * * Règle D : aucun `plan === 'xxx'` — tout passe par hasAccess(). * Règle L : tokens Direction H exclusivement. */ import { useNavigate } from 'react-router-dom' import { Card } from '@/shared/ui/Card' import { Button } from '@/shared/ui/Button' import { hasAccess } from '@/entities/user/lib' import { usePlan } from '@/features/dashboard/hooks/usePlan' import { usePatterns } from '../hooks/usePatterns' import { BlurredProgression } from '../components/BlurredProgression' import { ProgressionPremium } from '../components/ProgressionPremium' function Skeleton() { return (
) } export function ProgressionPage() { const navigate = useNavigate() const { data: planData, isLoading: isPlanLoading } = usePlan() const { data: patternsData, isLoading: isPatternsLoading, isError } = usePatterns(planData?.plan) const isPremium = planData ? hasAccess(planData.plan, 'pattern_analysis') : false return (

Profil de préparation

Repérez vos erreurs récurrentes et travaillez-les avec des exercices ciblés.

{isPlanLoading && } {!isPlanLoading && planData && !isPremium && ( navigate('/plan')} /> )} {!isPlanLoading && planData && isPremium && ( <> {isPatternsLoading && } {isError && (

Impossible de charger votre profil de préparation. Réessayez dans quelques instants.

)} {patternsData && } )}
) }