73 lines
2.1 KiB
TypeScript
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 }
|