@asteby/metacore-runtime-react 23.9.2 → 23.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +43 -0
  3. package/dist/action-modal-dispatcher.d.ts.map +1 -1
  4. package/dist/action-modal-dispatcher.js +122 -0
  5. package/dist/dynamic-kanban.d.ts.map +1 -1
  6. package/dist/dynamic-kanban.js +6 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/license/index.d.ts +5 -0
  11. package/dist/license/index.d.ts.map +1 -0
  12. package/dist/license/index.js +4 -0
  13. package/dist/license/license-expiry-banner.d.ts +16 -0
  14. package/dist/license/license-expiry-banner.d.ts.map +1 -0
  15. package/dist/license/license-expiry-banner.js +85 -0
  16. package/dist/license/license-gate.d.ts +40 -0
  17. package/dist/license/license-gate.d.ts.map +1 -0
  18. package/dist/license/license-gate.js +108 -0
  19. package/dist/license/license-status-badge.d.ts +7 -0
  20. package/dist/license/license-status-badge.d.ts.map +1 -0
  21. package/dist/license/license-status-badge.js +57 -0
  22. package/dist/license/types.d.ts +63 -0
  23. package/dist/license/types.d.ts.map +1 -0
  24. package/dist/license/types.js +45 -0
  25. package/dist/types.d.ts +8 -0
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/use-i18n-resource-version.d.ts +2 -0
  28. package/dist/use-i18n-resource-version.d.ts.map +1 -0
  29. package/dist/use-i18n-resource-version.js +42 -0
  30. package/package.json +3 -3
  31. package/src/__tests__/license-gate.test.tsx +242 -0
  32. package/src/__tests__/wizard-action-modal.test.tsx +121 -0
  33. package/src/action-modal-dispatcher.tsx +233 -0
  34. package/src/dynamic-kanban.tsx +6 -0
  35. package/src/index.ts +15 -0
  36. package/src/license/index.ts +21 -0
  37. package/src/license/license-expiry-banner.tsx +151 -0
  38. package/src/license/license-gate.tsx +277 -0
  39. package/src/license/license-status-badge.tsx +93 -0
  40. package/src/license/types.ts +90 -0
  41. package/src/types.ts +9 -0
  42. package/src/use-i18n-resource-version.ts +42 -0
  43. package/LICENSE +0 -201
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Insignia de estado de licencia — un chip que traduce el `LicenseStatus` a
4
+ * color + etiqueta legible. Reutilizable suelto (p. ej. en Ajustes de licencia)
5
+ * o embebido en el encabezado del <LicenseGate>.
6
+ */
7
+ import { useTranslation } from 'react-i18next';
8
+ import { ShieldCheck, ShieldAlert, ShieldQuestion, Clock, CloudOff, } from 'lucide-react';
9
+ import { Badge } from '@asteby/metacore-ui';
10
+ const STATUS_META = {
11
+ valid: {
12
+ variant: 'default',
13
+ Icon: ShieldCheck,
14
+ key: 'license.status.valid',
15
+ defaultValue: 'Activa',
16
+ },
17
+ stale: {
18
+ variant: 'outline',
19
+ Icon: CloudOff,
20
+ key: 'license.status.stale',
21
+ defaultValue: 'Sin verificar',
22
+ warn: true,
23
+ },
24
+ grace: {
25
+ variant: 'outline',
26
+ Icon: Clock,
27
+ key: 'license.status.grace',
28
+ defaultValue: 'En gracia',
29
+ warn: true,
30
+ },
31
+ expired: {
32
+ variant: 'destructive',
33
+ Icon: ShieldAlert,
34
+ key: 'license.status.expired',
35
+ defaultValue: 'Vencida',
36
+ },
37
+ missing: {
38
+ variant: 'secondary',
39
+ Icon: ShieldQuestion,
40
+ key: 'license.status.missing',
41
+ defaultValue: 'Sin licencia',
42
+ },
43
+ invalid: {
44
+ variant: 'destructive',
45
+ Icon: ShieldAlert,
46
+ key: 'license.status.invalid',
47
+ defaultValue: 'Inválida',
48
+ },
49
+ };
50
+ export function LicenseStatusBadge({ status, className }) {
51
+ const { t } = useTranslation();
52
+ const meta = STATUS_META[status] ?? STATUS_META.missing;
53
+ const { Icon } = meta;
54
+ return (_jsxs(Badge, { variant: meta.variant, className: (meta.warn
55
+ ? 'border-amber-500/40 bg-amber-500/10 text-amber-700 dark:text-amber-400 '
56
+ : '') + (className ?? ''), children: [_jsx(Icon, { "aria-hidden": true }), t(meta.key, { defaultValue: meta.defaultValue })] }));
57
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Licencia de instancia — el contrato de estado que el backend del host (ops
3
+ * vía kernel `LicenseService`) expone y que este módulo pinta. El SDK NO habla
4
+ * con el kernel ni impone su versión: el host resuelve el `LicenseState` con su
5
+ * propio transporte y se lo pasa a <LicenseGate>. Así el gate es un primitivo
6
+ * reutilizable e INDEPENDIENTE del release del kernel.
7
+ *
8
+ * División de responsabilidades del blindaje:
9
+ * - kernel → enforcement (qué está permitido; firma/verifica el estado).
10
+ * - SDK → UX (este módulo: gate, banner, badge).
11
+ * - hub → emisión (mintea el token Ed25519).
12
+ * - hosts → wiring (resuelven el estado y montan <LicenseGate> en 1 línea).
13
+ */
14
+ /** El estado operativo de la licencia, tal como lo deriva el backend. */
15
+ export type LicenseStatus = 'valid' | 'stale' | 'grace' | 'expired' | 'missing' | 'invalid';
16
+ export interface LicenseState {
17
+ /** Licensing activo en esta instancia (LICENSING_ENFORCE). Si es false el
18
+ * gate es transparente: nunca bloquea ni degrada. */
19
+ enforced: boolean;
20
+ configured: boolean;
21
+ valid: boolean;
22
+ status: LicenseStatus;
23
+ reason?: string;
24
+ org_id?: string;
25
+ plan?: string;
26
+ preset?: string;
27
+ entitlements: string[];
28
+ wildcard: boolean;
29
+ /** Lease: la instancia falló su check-in obligatorio con el hub. */
30
+ stale: boolean;
31
+ max_offline_hours?: number;
32
+ issued_at?: string;
33
+ expires_at?: string;
34
+ in_grace: boolean;
35
+ grace_until?: string;
36
+ days_remaining: number;
37
+ last_checked_at?: string;
38
+ }
39
+ /** La licencia es OPERABLE cuando permite operar (aunque sea degradada):
40
+ * valid, la postura `stale` del lease, o dentro de la ventana de gracia.
41
+ * missing/invalid/expired no son operables. Sin enforcement → siempre operable.
42
+ * Espeja `State.Operable()` del backend. */
43
+ export declare function isLicenseOperable(state: LicenseState | undefined): boolean;
44
+ /** La instancia debe BLOQUEARSE tras el modal de activación cuando hay
45
+ * enforcement y la licencia es missing/invalid/expired (pasada la gracia).
46
+ * grace/stale degradan con banner en vez de bloquear. Espeja `State.Blocking()`.
47
+ * Mientras el estado aún carga (undefined) NO bloquea: fail-open en la UI para
48
+ * que un check lento/fallido nunca destelle un candado sobre la app. */
49
+ export declare function isLicenseBlocking(state: LicenseState | undefined): boolean;
50
+ /** Un preset/vertical está habilitado si la licencia otorga wildcard o lo lista
51
+ * explícitamente. Sin enforcement → todo habilitado. */
52
+ export declare function isPresetEntitled(state: LicenseState | undefined, presetKey: string): boolean;
53
+ /** Marca trial vencido: el copy del gate cambia a "tu prueba terminó". */
54
+ export declare function isTrialExpired(state: LicenseState | undefined): boolean;
55
+ /** Branding opcional para teñir el gate/banner. El host lo pasa desde su
56
+ * PlatformConfig del SDK (o cualquier fuente); sin él, fallback neutro. */
57
+ export interface LicenseBranding {
58
+ /** Nombre de la plataforma/tenant, para el encabezado del gate. */
59
+ name?: string;
60
+ /** URL del logo (se embebe como <img>). */
61
+ logo?: string;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/license/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,CAAA;AAEf,MAAM,WAAW,YAAY;IACzB;yDACqD;IACrD,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;4CAG4C;AAC5C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED;;;;wEAIwE;AACxE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED;wDACwD;AACxD,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAClB,OAAO,CAIT;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEvE;AAED;2EAC2E;AAC3E,MAAM,WAAW,eAAe;IAC5B,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Licencia de instancia — el contrato de estado que el backend del host (ops
3
+ * vía kernel `LicenseService`) expone y que este módulo pinta. El SDK NO habla
4
+ * con el kernel ni impone su versión: el host resuelve el `LicenseState` con su
5
+ * propio transporte y se lo pasa a <LicenseGate>. Así el gate es un primitivo
6
+ * reutilizable e INDEPENDIENTE del release del kernel.
7
+ *
8
+ * División de responsabilidades del blindaje:
9
+ * - kernel → enforcement (qué está permitido; firma/verifica el estado).
10
+ * - SDK → UX (este módulo: gate, banner, badge).
11
+ * - hub → emisión (mintea el token Ed25519).
12
+ * - hosts → wiring (resuelven el estado y montan <LicenseGate> en 1 línea).
13
+ */
14
+ /** La licencia es OPERABLE cuando permite operar (aunque sea degradada):
15
+ * valid, la postura `stale` del lease, o dentro de la ventana de gracia.
16
+ * missing/invalid/expired no son operables. Sin enforcement → siempre operable.
17
+ * Espeja `State.Operable()` del backend. */
18
+ export function isLicenseOperable(state) {
19
+ if (!state || !state.enforced)
20
+ return true;
21
+ return state.valid || state.in_grace;
22
+ }
23
+ /** La instancia debe BLOQUEARSE tras el modal de activación cuando hay
24
+ * enforcement y la licencia es missing/invalid/expired (pasada la gracia).
25
+ * grace/stale degradan con banner en vez de bloquear. Espeja `State.Blocking()`.
26
+ * Mientras el estado aún carga (undefined) NO bloquea: fail-open en la UI para
27
+ * que un check lento/fallido nunca destelle un candado sobre la app. */
28
+ export function isLicenseBlocking(state) {
29
+ if (!state || !state.enforced)
30
+ return false;
31
+ return !isLicenseOperable(state);
32
+ }
33
+ /** Un preset/vertical está habilitado si la licencia otorga wildcard o lo lista
34
+ * explícitamente. Sin enforcement → todo habilitado. */
35
+ export function isPresetEntitled(state, presetKey) {
36
+ if (!state || !state.enforced)
37
+ return true;
38
+ if (state.wildcard)
39
+ return true;
40
+ return state.entitlements?.includes(presetKey) ?? false;
41
+ }
42
+ /** Marca trial vencido: el copy del gate cambia a "tu prueba terminó". */
43
+ export function isTrialExpired(state) {
44
+ return !!state && state.plan === 'trial' && state.status === 'expired';
45
+ }
package/dist/types.d.ts CHANGED
@@ -495,6 +495,12 @@ export interface PaginationMeta {
495
495
  to: number;
496
496
  total: number;
497
497
  }
498
+ /** One page of a multi-step (wizard) action. Mirrors the sdk's ActionStep. */
499
+ export interface ActionStep {
500
+ title: string;
501
+ description?: string;
502
+ fields: ActionFieldDef[];
503
+ }
498
504
  export interface ActionMetadata {
499
505
  key: string;
500
506
  label: string;
@@ -503,6 +509,8 @@ export interface ActionMetadata {
503
509
  confirm?: boolean;
504
510
  confirmMessage?: string;
505
511
  fields?: ActionFieldDef[];
512
+ /** Multi-step wizard form; when present the dispatcher renders a wizard. */
513
+ steps?: ActionStep[];
506
514
  requiresState?: string[];
507
515
  executable?: boolean;
508
516
  placement?: 'row' | 'table' | 'create';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function useI18nResourceVersion(): number;
2
+ //# sourceMappingURL=use-i18n-resource-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-i18n-resource-version.d.ts","sourceRoot":"","sources":["../src/use-i18n-resource-version.ts"],"names":[],"mappings":"AAmBA,wBAAgB,sBAAsB,IAAI,MAAM,CAsB/C"}
@@ -0,0 +1,42 @@
1
+ // A tiny hook that returns a version counter which bumps every time i18next's
2
+ // resource store changes (a bundle is `added`, a language `loaded`, or a key
3
+ // `removed`).
4
+ //
5
+ // Why this exists: addon i18n bundles are fetched and merged asynchronously
6
+ // (addResourceBundle) AFTER the board first paints. react-i18next only
7
+ // re-renders a `useTranslation()` consumer on a store mutation when the host
8
+ // configured `bindI18nStore` to include those events — a host-level setting the
9
+ // SDK cannot assume. Without it a lane whose label is a manifest i18n key
10
+ // (e.g. "integration_github.stage.in_progress") renders the RAW key until an
11
+ // unrelated re-render happens to re-run `t()`.
12
+ //
13
+ // Depending on this version inside a memo/render makes the component re-resolve
14
+ // its labels the moment the bundle lands, regardless of the host's
15
+ // react-i18next binding config. Self-contained and cheap: one listener per
16
+ // mounting component, torn down on unmount.
17
+ import { useEffect, useState } from 'react';
18
+ import { useTranslation } from 'react-i18next';
19
+ export function useI18nResourceVersion() {
20
+ const { i18n } = useTranslation();
21
+ const [version, setVersion] = useState(0);
22
+ useEffect(() => {
23
+ if (!i18n)
24
+ return;
25
+ const bump = () => setVersion((v) => v + 1);
26
+ // `added`/`removed` fire on the resource STORE (addResourceBundle);
27
+ // `loaded` fires when a backend finishes a language; `languageChanged`
28
+ // covers a runtime locale flip. Listening to all keeps a label correct
29
+ // through every path a translation can arrive.
30
+ i18n.store?.on?.('added', bump);
31
+ i18n.store?.on?.('removed', bump);
32
+ i18n.on?.('loaded', bump);
33
+ i18n.on?.('languageChanged', bump);
34
+ return () => {
35
+ i18n.store?.off?.('added', bump);
36
+ i18n.store?.off?.('removed', bump);
37
+ i18n.off?.('loaded', bump);
38
+ i18n.off?.('languageChanged', bump);
39
+ };
40
+ }, [i18n]);
41
+ return version;
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asteby/metacore-runtime-react",
3
- "version": "23.9.2",
3
+ "version": "23.10.0",
4
4
  "description": "React runtime for metacore hosts — renders addon contributions dynamically",
5
5
  "repository": {
6
6
  "type": "git",
@@ -38,7 +38,7 @@
38
38
  "sonner": ">=1.7",
39
39
  "zustand": ">=5",
40
40
  "@asteby/metacore-sdk": "^3.2.0",
41
- "@asteby/metacore-ui": "^2.9.2"
41
+ "@asteby/metacore-ui": "^2.9.3"
42
42
  },
43
43
  "peerDependenciesMeta": {
44
44
  "@tanstack/react-router": {
@@ -68,7 +68,7 @@
68
68
  "vitest": "^4.0.0",
69
69
  "zustand": "^5.0.0",
70
70
  "@asteby/metacore-sdk": "3.2.0",
71
- "@asteby/metacore-ui": "2.9.2"
71
+ "@asteby/metacore-ui": "2.9.3"
72
72
  },
73
73
  "scripts": {
74
74
  "build": "tsc -p tsconfig.json",
@@ -0,0 +1,242 @@
1
+ // @vitest-environment happy-dom
2
+ //
3
+ // Contrato del blindaje de licencia (LicenseGate + banner + helpers):
4
+ // - Sin enforcement o estado operable → children, sin candado.
5
+ // - stale/grace → children + banner degradado (grace descartable, expired no).
6
+ // - enforcement && missing/invalid/expired → modal bloqueante con activación.
7
+ // - trial vencido → copy "tu prueba terminó".
8
+ // - onActivate: éxito desbloquea (el host refresca), error muestra el mensaje.
9
+ //
10
+ // Gotcha conocido (reference_radix_select_happydom_reset): nada de Radix Select
11
+ // aquí — el gate usa un <Input> plano y el texto visible es el gate de los asserts.
12
+ import { afterEach, describe, expect, it, vi } from 'vitest'
13
+ import { cleanup, render, screen, fireEvent, waitFor } from '@testing-library/react'
14
+
15
+ vi.mock('react-i18next', () => ({
16
+ useTranslation: () => ({
17
+ t: (_k: string, opts?: Record<string, unknown>) => {
18
+ let s = (opts?.defaultValue as string) ?? _k
19
+ // interpolación mínima {{x}} para los mensajes del banner.
20
+ for (const [k, v] of Object.entries(opts ?? {})) {
21
+ if (k === 'defaultValue') continue
22
+ s = s.replace(new RegExp(`{{\\s*${k}\\s*}}`, 'g'), String(v))
23
+ }
24
+ return s
25
+ },
26
+ }),
27
+ }))
28
+
29
+ afterEach(() => {
30
+ cleanup()
31
+ localStorage.clear()
32
+ })
33
+
34
+ import {
35
+ LicenseGate,
36
+ LicenseExpiryBanner,
37
+ LicenseStatusBadge,
38
+ isLicenseBlocking,
39
+ isLicenseOperable,
40
+ isPresetEntitled,
41
+ isTrialExpired,
42
+ type LicenseState,
43
+ } from '../license'
44
+
45
+ function make(partial: Partial<LicenseState>): LicenseState {
46
+ return {
47
+ enforced: true,
48
+ configured: true,
49
+ valid: false,
50
+ status: 'missing',
51
+ entitlements: [],
52
+ wildcard: false,
53
+ stale: false,
54
+ in_grace: false,
55
+ days_remaining: 0,
56
+ ...partial,
57
+ }
58
+ }
59
+
60
+ const CHILD = <div>contenido protegido</div>
61
+
62
+ describe('helpers de estado', () => {
63
+ it('operable/blocking espejan al backend', () => {
64
+ expect(isLicenseOperable(make({ status: 'valid', valid: true }))).toBe(true)
65
+ expect(isLicenseOperable(make({ status: 'grace', in_grace: true }))).toBe(true)
66
+ expect(isLicenseOperable(make({ status: 'missing' }))).toBe(false)
67
+ expect(isLicenseBlocking(make({ status: 'expired' }))).toBe(true)
68
+ // Sin enforcement nunca bloquea, aunque el status sea feo.
69
+ expect(isLicenseBlocking(make({ enforced: false, status: 'expired' }))).toBe(false)
70
+ // undefined (aún cargando) → fail-open.
71
+ expect(isLicenseBlocking(undefined)).toBe(false)
72
+ })
73
+
74
+ it('entitlement respeta wildcard y lista explícita', () => {
75
+ expect(isPresetEntitled(make({ wildcard: true }), 'pitsline')).toBe(true)
76
+ expect(isPresetEntitled(make({ entitlements: ['pitsline'] }), 'pitsline')).toBe(true)
77
+ expect(isPresetEntitled(make({ entitlements: ['otro'] }), 'pitsline')).toBe(false)
78
+ expect(isPresetEntitled(make({ enforced: false }), 'lo-que-sea')).toBe(true)
79
+ })
80
+
81
+ it('trial vencido se detecta', () => {
82
+ expect(isTrialExpired(make({ plan: 'trial', status: 'expired' }))).toBe(true)
83
+ expect(isTrialExpired(make({ plan: 'pro', status: 'expired' }))).toBe(false)
84
+ })
85
+ })
86
+
87
+ describe('LicenseGate', () => {
88
+ const noop = () => Promise.resolve()
89
+
90
+ it('renderiza children sin candado cuando la licencia es válida', () => {
91
+ render(
92
+ <LicenseGate state={make({ status: 'valid', valid: true })} onActivate={noop}>
93
+ {CHILD}
94
+ </LicenseGate>,
95
+ )
96
+ expect(screen.getByText('contenido protegido')).toBeTruthy()
97
+ expect(screen.queryByRole('dialog')).toBeNull()
98
+ })
99
+
100
+ it('sin enforcement es transparente', () => {
101
+ render(
102
+ <LicenseGate state={make({ enforced: false, status: 'missing' })} onActivate={noop}>
103
+ {CHILD}
104
+ </LicenseGate>,
105
+ )
106
+ expect(screen.getByText('contenido protegido')).toBeTruthy()
107
+ expect(screen.queryByRole('dialog')).toBeNull()
108
+ })
109
+
110
+ it('bloquea con modal cuando falta la licencia', () => {
111
+ render(
112
+ <LicenseGate state={make({ status: 'missing' })} onActivate={noop}>
113
+ {CHILD}
114
+ </LicenseGate>,
115
+ )
116
+ expect(screen.getByRole('dialog')).toBeTruthy()
117
+ expect(screen.getByText('Activa tu licencia')).toBeTruthy()
118
+ // children siguen montados detrás del overlay (no reload).
119
+ expect(screen.getByText('contenido protegido')).toBeTruthy()
120
+ })
121
+
122
+ it('trial vencido muestra el copy de prueba terminada', () => {
123
+ render(
124
+ <LicenseGate state={make({ status: 'expired', plan: 'trial' })} onActivate={noop}>
125
+ {CHILD}
126
+ </LicenseGate>,
127
+ )
128
+ expect(screen.getByText('Tu prueba gratuita terminó')).toBeTruthy()
129
+ })
130
+
131
+ it('activación exitosa llama onActivate con el código pegado', async () => {
132
+ const onActivate = vi.fn().mockResolvedValue(undefined)
133
+ render(
134
+ <LicenseGate state={make({ status: 'missing' })} onActivate={onActivate}>
135
+ {CHILD}
136
+ </LicenseGate>,
137
+ )
138
+ fireEvent.change(screen.getByLabelText('Clave o token de licencia'), {
139
+ target: { value: ' lic_abc123 ' },
140
+ })
141
+ fireEvent.click(screen.getByText('Activar licencia'))
142
+ await waitFor(() => expect(onActivate).toHaveBeenCalledWith('lic_abc123'))
143
+ })
144
+
145
+ it('muestra el mensaje de error del backend al fallar', async () => {
146
+ const onActivate = vi.fn().mockRejectedValue(new Error('Token no corresponde a esta instancia'))
147
+ render(
148
+ <LicenseGate state={make({ status: 'invalid' })} onActivate={onActivate}>
149
+ {CHILD}
150
+ </LicenseGate>,
151
+ )
152
+ fireEvent.change(screen.getByLabelText('Clave o token de licencia'), {
153
+ target: { value: 'lic_bad' },
154
+ })
155
+ fireEvent.click(screen.getByText('Activar licencia'))
156
+ await waitFor(() =>
157
+ expect(screen.getByText('Token no corresponde a esta instancia')).toBeTruthy(),
158
+ )
159
+ })
160
+
161
+ it('el botón activar está deshabilitado sin código', () => {
162
+ render(
163
+ <LicenseGate state={make({ status: 'missing' })} onActivate={noop}>
164
+ {CHILD}
165
+ </LicenseGate>,
166
+ )
167
+ const btn = screen.getByText('Activar licencia').closest('button')!
168
+ expect(btn.disabled).toBe(true)
169
+ })
170
+
171
+ it('grace degrada con banner en vez de bloquear', () => {
172
+ render(
173
+ <LicenseGate
174
+ state={make({ status: 'grace', in_grace: true, days_remaining: 5, grace_until: '2026-08-01' })}
175
+ onActivate={noop}
176
+ >
177
+ {CHILD}
178
+ </LicenseGate>,
179
+ )
180
+ expect(screen.queryByRole('dialog')).toBeNull()
181
+ expect(screen.getByText('contenido protegido')).toBeTruthy()
182
+ expect(screen.getByRole('alert')).toBeTruthy()
183
+ })
184
+ })
185
+
186
+ describe('LicenseExpiryBanner', () => {
187
+ it('silencioso sin enforcement', () => {
188
+ const { container } = render(
189
+ <LicenseExpiryBanner state={make({ enforced: false, status: 'expired' })} />,
190
+ )
191
+ expect(container.firstChild).toBeNull()
192
+ })
193
+
194
+ it('expired no es descartable (no hay botón cerrar)', () => {
195
+ render(<LicenseExpiryBanner state={make({ status: 'expired' })} />)
196
+ expect(screen.getByRole('alert')).toBeTruthy()
197
+ expect(screen.queryByTitle('Descartar')).toBeNull()
198
+ })
199
+
200
+ it('grace es descartable y persiste el descarte', () => {
201
+ const { rerender } = render(
202
+ <LicenseExpiryBanner state={make({ status: 'grace', in_grace: true, days_remaining: 3 })} />,
203
+ )
204
+ fireEvent.click(screen.getByTitle('Descartar'))
205
+ expect(screen.queryByRole('alert')).toBeNull()
206
+ // Re-render: sigue descartado por el TTL en localStorage.
207
+ rerender(
208
+ <LicenseExpiryBanner state={make({ status: 'grace', in_grace: true, days_remaining: 3 })} />,
209
+ )
210
+ expect(screen.queryByRole('alert')).toBeNull()
211
+ })
212
+
213
+ it('aviso de renovación próxima cuando quedan pocos días', () => {
214
+ render(
215
+ <LicenseExpiryBanner state={make({ status: 'valid', valid: true, days_remaining: 7 })} />,
216
+ )
217
+ expect(screen.getByText('Tu licencia vence en 7 días.')).toBeTruthy()
218
+ })
219
+
220
+ it('botón gestionar solo cuando el host pasa onManage', () => {
221
+ const onManage = vi.fn()
222
+ render(
223
+ <LicenseExpiryBanner
224
+ state={make({ status: 'expired' })}
225
+ onManage={onManage}
226
+ />,
227
+ )
228
+ fireEvent.click(screen.getByText('Gestionar licencia'))
229
+ expect(onManage).toHaveBeenCalled()
230
+ })
231
+ })
232
+
233
+ describe('LicenseStatusBadge', () => {
234
+ it('traduce cada status a etiqueta legible', () => {
235
+ const { rerender } = render(<LicenseStatusBadge status="valid" />)
236
+ expect(screen.getByText('Activa')).toBeTruthy()
237
+ rerender(<LicenseStatusBadge status="expired" />)
238
+ expect(screen.getByText('Vencida')).toBeTruthy()
239
+ rerender(<LicenseStatusBadge status="stale" />)
240
+ expect(screen.getByText('Sin verificar')).toBeTruthy()
241
+ })
242
+ })