Merge pull request 'feat(prices): useIsPremium hook (#157)' (#164) from issue-157-use-is-premium into main

This commit is contained in:
maximus 2026-04-28 01:06:35 +00:00
commit 01cfbdba8b
3 changed files with 53 additions and 1 deletions

View file

@ -49,7 +49,7 @@ src/
│ ├── shared/ # Composants réutilisables
│ └── transactions/ # Transactions
├── contexts/ # ProfileContext (état global profil)
├── hooks/ # 12 hooks custom (useReducer)
├── hooks/ # 13 hooks custom (useReducer)
├── pages/ # 11 pages
├── services/ # 14 services métier
├── shared/ # Types et constantes partagés

View file

@ -0,0 +1,42 @@
import { describe, it, expect, vi } from "vitest";
import { useIsPremium } from "./useIsPremium";
vi.mock("./useLicense", () => ({
useLicense: vi.fn(),
}));
import { useLicense } from "./useLicense";
const mockUseLicense = vi.mocked(useLicense);
describe("useIsPremium", () => {
it('returns true when edition is "premium"', () => {
mockUseLicense.mockReturnValue({
state: { status: "ready", edition: "premium", info: null, error: null },
refresh: vi.fn(),
submitKey: vi.fn(),
checkEntitlement: vi.fn(),
});
expect(useIsPremium()).toBe(true);
});
it('returns false when edition is "base"', () => {
mockUseLicense.mockReturnValue({
state: { status: "ready", edition: "base", info: null, error: null },
refresh: vi.fn(),
submitKey: vi.fn(),
checkEntitlement: vi.fn(),
});
expect(useIsPremium()).toBe(false);
});
it('returns false when edition is "free"', () => {
mockUseLicense.mockReturnValue({
state: { status: "ready", edition: "free", info: null, error: null },
refresh: vi.fn(),
submitKey: vi.fn(),
checkEntitlement: vi.fn(),
});
expect(useIsPremium()).toBe(false);
});
});

10
src/hooks/useIsPremium.ts Normal file
View file

@ -0,0 +1,10 @@
import { useLicense } from "./useLicense";
/**
* Returns true if the active license edition is "premium".
* Ergonomic helper only the server enforces entitlements independently (cf. ADR 0011 §UX).
*/
export function useIsPremium(): boolean {
const { state } = useLicense();
return state.edition === "premium";
}