expria-frontend/src/entities/user/lib.ts

73 lines
2.1 KiB
TypeScript

/**
* Alias frontend-idiomatiques pour les fonctions d'accès.
*
* Ce fichier est la PORTE D'ENTRÉE pour tout code frontend qui vérifie
* une permission ou un quota. Ne JAMAIS importer directement depuis access.ts
* dans les composants ou les hooks.
*
* Cf. ADR 005 pour la justification des alias et ADR 004 pour la règle
* de synchronisation de access.ts avec le backend.
*/
import {
canUserSimulate,
checkFeatureAccess,
getPlanPermissions,
type Feature,
type Plan,
} from './access'
/**
* Vérifie si un plan a accès à une feature booléenne donnée.
*
* Alias idiomatique React de `checkFeatureAccess` (backend).
* La feature 'basic_report' est toujours autorisée (tous plans).
*
* @example
* if (hasAccess(plan, 'exam_mode')) { ... }
* if (hasAccess(plan, 'oral_t2_live')) { ... }
*
* @param plan - Plan de l'utilisateur ('free' | 'standard' | 'premium')
* @param feature - Nom de la feature à vérifier
* @returns true si le plan donne accès à la feature
*/
export const hasAccess = checkFeatureAccess
/**
* Résultat d'un check de simulation.
*/
export interface SimulationCheck {
allowed: boolean
reason?: 'quota_reached' | 'invalid_plan' | string
}
/**
* Vérifie si un utilisateur peut lancer une nouvelle simulation.
*
* Alias idiomatique de `canUserSimulate` (backend) avec une signature
* plus ergonomique côté frontend : prend `plan` et `simulationsUsed`
* séparément au lieu d'un objet `user`.
*
* @example
* const { allowed, reason } = canSimulate(plan, simulationsUsed)
* if (!allowed) {
* if (reason === 'quota_reached') openUpgradeModal()
* }
*
* @param plan - Plan de l'utilisateur
* @param simulationsUsed - Nombre de simulations déjà consommées
* @returns Objet `{ allowed, reason? }`
*/
export function canSimulate(plan: string, simulationsUsed: number): SimulationCheck {
return canUserSimulate({ plan, simulations_used: simulationsUsed })
}
/**
* Ré-export direct — pas d'alias car le nom est déjà idiomatique.
*/
export { getPlanPermissions }
/**
* Ré-export des types pour les consommateurs.
*/
export type { Feature, Plan }