feat(prices): useIsPremium hook (#157) #164
3 changed files with 53 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
42
src/hooks/useIsPremium.test.ts
Normal file
42
src/hooks/useIsPremium.test.ts
Normal 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
10
src/hooks/useIsPremium.ts
Normal 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";
|
||||
}
|
||||
Loading…
Reference in a new issue