feat(prices): useIsPremium hook from license.edition #157

Closed
opened 2026-04-27 00:15:36 +00:00 by maximus · 0 comments
Owner

Goal

Add a useIsPremium() hook reading the existing useLicense state. Trivial layer — exists for clarity at call sites.

Contract reference

docs/api-contract-prices.md §7.2 — edition is already read by useLicense hook (cf. src/hooks/useLicense.ts).

Fichiers concernés

  • src/hooks/useIsPremium.ts (new, ~20 lines)
  • src/hooks/useIsPremium.test.ts (new, ~30 lines)

Depends on

Scope

  • Create src/hooks/useIsPremium.ts:
    import { useLicense } from "./useLicense";
    /** Returns true if the active license is premium. ERGONOMIC ONLY — server enforces independently (cf. ADR 0011 §UX). */
    export function useIsPremium(): boolean {
      const { state } = useLicense();
      return state.edition === "premium";
    }
    
  • Vitest test mocking useLicense via vi.mock:
    • edition === "premium" → returns true
    • edition === "base" → returns false
    • edition === "free" → returns false
  • Add a 1-line entry to CLAUDE.md hooks listing (« 12 hooks custom » → 13)

Critères d'acceptation

  • 3 vitest tests green
  • Hook is consumed in PriceFetchControl (issue #158)
  • CLAUDE.md count is updated

Décisions prises ce soir

  • Garder un hook séparé (vs inline useLicense().edition === 'premium') pour la lisibilité aux call sites + pour faciliter le mock dans les tests UI.
  • L'existence des 3 valeurs Edition (free | base | premium) reste inchangée.

Spec source

docs/api-contract-prices.md

## Goal Add a `useIsPremium()` hook reading the existing `useLicense` state. Trivial layer — exists for clarity at call sites. ## Contract reference `docs/api-contract-prices.md` §7.2 — `edition` is **already** read by `useLicense` hook (cf. `src/hooks/useLicense.ts`). ## Fichiers concernés - `src/hooks/useIsPremium.ts` (new, ~20 lines) - `src/hooks/useIsPremium.test.ts` (new, ~30 lines) ## Depends on - #154 ## Scope - [ ] Create `src/hooks/useIsPremium.ts`: ```typescript import { useLicense } from "./useLicense"; /** Returns true if the active license is premium. ERGONOMIC ONLY — server enforces independently (cf. ADR 0011 §UX). */ export function useIsPremium(): boolean { const { state } = useLicense(); return state.edition === "premium"; } ``` - [ ] Vitest test mocking `useLicense` via `vi.mock`: - `edition === "premium"` → returns `true` - `edition === "base"` → returns `false` - `edition === "free"` → returns `false` - [ ] Add a 1-line entry to CLAUDE.md hooks listing (« 12 hooks custom » → 13) ## Critères d'acceptation - [ ] 3 vitest tests green - [ ] Hook is consumed in `PriceFetchControl` (issue #158) - [ ] CLAUDE.md count is updated ## Décisions prises ce soir - Garder un hook séparé (vs inline `useLicense().edition === 'premium'`) pour la lisibilité aux call sites + pour faciliter le mock dans les tests UI. - L'existence des 3 valeurs `Edition` (`free | base | premium`) reste inchangée. ## Spec source `docs/api-contract-prices.md`
maximus added this to the spec-price-fetching milestone 2026-04-27 00:15:36 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-04-27 00:15:36 +00:00
maximus modified the milestone from spec-price-fetching to overnight-2026-04-27-prices 2026-04-27 00:32:02 +00:00
maximus added
status:in-progress
and removed
status:ready
source:human
labels 2026-04-27 12:11:45 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#157
No description provided.