valtech-components 2.0.833 → 2.0.835

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.
@@ -1,17 +1,21 @@
1
1
  import { EventEmitter } from '@angular/core';
2
2
  import { FormMetadata, FormSubmit } from '../../types';
3
3
  import * as i0 from "@angular/core";
4
+ /** Modo del modal, resuelto al abrir según si el user ya tiene contraseña. */
5
+ type PasswordModalMode = 'loading' | 'change' | 'set';
4
6
  /**
5
- * `val-change-password-modal` — modal para que un usuario autenticado cambie
6
- * su contraseña. Análogo al modal de "recuperar contraseña" del `val-login`,
7
- * pero para una sesión activa (vista de seguridad / settings).
7
+ * `val-change-password-modal` — modal de gestión de contraseña para un usuario
8
+ * autenticado. Análogo al modal de "recuperar contraseña" del `val-login`.
8
9
  *
9
- * Self-contained: inyecta `AuthService` y llama `changePassword()` directo
10
- * la app solo controla la visibilidad y reacciona a los eventos.
10
+ * Es dual-mode: al abrirse consulta `AuthService.checkHasPassword()` y se adapta:
11
+ * - **change** el user ya tiene contraseña pide actual + nueva →
12
+ * `changePassword()`.
13
+ * - **set** — el user es OAuth-only (sin contraseña) → pide solo la nueva,
14
+ * pide confirmación explícita (no pierde el acceso social, es aditivo) →
15
+ * `setPasswordForOAuthUser()`.
11
16
  *
12
- * El gate de apertura lo controla el padre vía `[isOpen]`. El componente emite
13
- * `changed` al éxito y `dismissed` cuando el user cierra el modal — el padre
14
- * pone `isOpen` en `false` en ambos casos.
17
+ * Self-contained: inyecta `AuthService` y llama el endpoint directo la app
18
+ * solo controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`.
15
19
  *
16
20
  * i18n: usa el namespace compartido `_auth` (mismas claves que `val-login`).
17
21
  *
@@ -25,9 +29,14 @@ import * as i0 from "@angular/core";
25
29
  * ```
26
30
  */
27
31
  export declare class ChangePasswordModalComponent {
28
- /** Controla la visibilidad del modal. Lo decide el componente padre. */
29
- isOpen: boolean;
30
- /** Emite al cambiar la contraseña con éxito. El padre debe cerrar el modal. */
32
+ private _isOpen;
33
+ /**
34
+ * Controla la visibilidad del modal. Lo decide el componente padre. Cada vez
35
+ * que pasa de cerrado a abierto se resuelve el modo (change vs set).
36
+ */
37
+ set isOpen(value: boolean);
38
+ get isOpen(): boolean;
39
+ /** Emite al cambiar/crear la contraseña con éxito. El padre cierra el modal. */
31
40
  changed: EventEmitter<void>;
32
41
  /** Emite cuando el user cierra el modal (botón X o backdrop). */
33
42
  dismissed: EventEmitter<void>;
@@ -35,17 +44,34 @@ export declare class ChangePasswordModalComponent {
35
44
  private toast;
36
45
  private i18n;
37
46
  private i18nHelper;
47
+ private confirmDialog;
48
+ private readonly _mode;
49
+ /** Modo actual — `loading` mientras se consulta `checkHasPassword()`. */
50
+ readonly mode: import("@angular/core").Signal<PasswordModalMode>;
38
51
  private readonly _formState;
39
52
  constructor();
40
53
  /** Traduce una clave del namespace `_auth`. */
41
54
  t(key: string): string;
42
55
  readonly formProps: import("@angular/core").Signal<FormMetadata>;
56
+ /** Campo "nueva contraseña" — compartido por ambos modos. */
57
+ private newPasswordField;
43
58
  /** Cierre iniciado por el user (X / backdrop). */
44
59
  close(): void;
45
- submitHandler(event: FormSubmit): void;
60
+ /** Consulta si el user ya tiene contraseña para elegir el modo del modal. */
61
+ private resolveMode;
62
+ submitHandler(event: FormSubmit): Promise<void>;
63
+ /** Flujo normal: el user tiene contraseña y la cambia. */
64
+ private handleChangePassword;
65
+ /**
66
+ * Flujo OAuth-only: el user no tiene contraseña. Antes de crearla pide
67
+ * confirmación explícita — es un cambio de cuenta, aunque aditivo (conserva
68
+ * el acceso social).
69
+ */
70
+ private handleSetPassword;
46
71
  /** Mapea los códigos de error del backend a mensajes del namespace `_auth`. */
47
72
  private resolveError;
48
73
  private showToast;
49
74
  static ɵfac: i0.ɵɵFactoryDeclaration<ChangePasswordModalComponent, never>;
50
75
  static ɵcmp: i0.ɵɵComponentDeclaration<ChangePasswordModalComponent, "val-change-password-modal", never, { "isOpen": { "alias": "isOpen"; "required": false; }; }, { "changed": "changed"; "dismissed": "dismissed"; }, never, never, true, never>;
51
76
  }
77
+ export {};
@@ -0,0 +1,114 @@
1
+ import { EventEmitter, OnDestroy } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { MFAMethod, TOTPSetupResponse } from '../../../services/auth/types';
4
+ import { QrResult } from '../../../services/qr-generator/types';
5
+ import * as i0 from "@angular/core";
6
+ /** Paso del flujo del modal. */
7
+ type MfaStep = 'loading' | 'status' | 'method-select' | 'totp-setup' | 'code-confirm' | 'disable';
8
+ /**
9
+ * `val-mfa-modal` — modal de gestión de autenticación de dos factores (MFA)
10
+ * para un usuario autenticado. Mismo patrón que `val-change-password-modal`.
11
+ *
12
+ * Flujo (máquina de estados interna):
13
+ * - `loading` → `getProfile()` para conocer el estado MFA.
14
+ * - `status` → muestra MFA habilitado/deshabilitado. Si está habilitado:
15
+ * gestión de backup codes (TOTP) + deshabilitar. Si no: botón habilitar.
16
+ * - `method-select` → elegir TOTP / EMAIL / SMS.
17
+ * - `totp-setup` → QR + secreto manual + backup codes → verificar código.
18
+ * - `code-confirm` → (EMAIL/SMS) ingresar código recibido, con reenvío.
19
+ * - `disable` → contraseña para deshabilitar MFA.
20
+ *
21
+ * El QR se genera **client-side** (`QrGeneratorService`) — el secreto TOTP
22
+ * nunca sale del navegador.
23
+ *
24
+ * Self-contained: inyecta `AuthService` y llama los endpoints directo. La app
25
+ * controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`.
26
+ *
27
+ * i18n: namespace compartido `_auth`.
28
+ *
29
+ * @example
30
+ * ```html
31
+ * <val-mfa-modal
32
+ * [isOpen]="isModalOpen()"
33
+ * (dismissed)="isModalOpen.set(false)"
34
+ * />
35
+ * ```
36
+ */
37
+ export declare class MfaModalComponent implements OnDestroy {
38
+ private _isOpen;
39
+ /** Controla la visibilidad. Cada apertura re-resuelve el estado MFA. */
40
+ set isOpen(value: boolean);
41
+ get isOpen(): boolean;
42
+ /** Emite cuando el estado MFA cambia (habilitado / deshabilitado). */
43
+ changed: EventEmitter<void>;
44
+ /** Emite cuando el user cierra el modal (botón X o backdrop). */
45
+ dismissed: EventEmitter<void>;
46
+ private auth;
47
+ private toast;
48
+ private i18n;
49
+ private qrGen;
50
+ private readonly _step;
51
+ /** Paso actual del flujo. */
52
+ readonly step: import("@angular/core").Signal<MfaStep>;
53
+ /** `true` mientras una llamada al backend está en curso. */
54
+ readonly working: import("@angular/core").WritableSignal<boolean>;
55
+ readonly mfaEnabled: import("@angular/core").WritableSignal<boolean>;
56
+ readonly mfaMethod: import("@angular/core").WritableSignal<MFAMethod>;
57
+ readonly userPhone: import("@angular/core").WritableSignal<string>;
58
+ readonly backupCodesCount: import("@angular/core").WritableSignal<number>;
59
+ readonly selectedMethod: import("@angular/core").WritableSignal<MFAMethod>;
60
+ readonly totpSetup: import("@angular/core").WritableSignal<TOTPSetupResponse>;
61
+ readonly totpQr: import("@angular/core").WritableSignal<QrResult>;
62
+ /** Códigos de respaldo recién regenerados — se muestran una sola vez. */
63
+ readonly regeneratedCodes: import("@angular/core").WritableSignal<string[]>;
64
+ readonly resendCooldown: import("@angular/core").WritableSignal<number>;
65
+ readonly pinControl: FormControl<string>;
66
+ readonly passwordControl: FormControl<string>;
67
+ readonly phoneControl: FormControl<string>;
68
+ readonly pinInputProps: {
69
+ control: FormControl<string>;
70
+ token: string;
71
+ length: number;
72
+ allowNumbersOnly: boolean;
73
+ autoFocus: boolean;
74
+ };
75
+ private resendTimer;
76
+ constructor();
77
+ ngOnDestroy(): void;
78
+ /** Traduce una clave del namespace `_auth`. */
79
+ t(key: string): string;
80
+ /** Cierre iniciado por el user (X / backdrop). */
81
+ close(): void;
82
+ /** Consulta el perfil para conocer el estado MFA y posicionar el flujo. */
83
+ private resolveStatus;
84
+ private loadBackupCount;
85
+ goToMethodSelect(): void;
86
+ goToDisable(): void;
87
+ backToStatus(): void;
88
+ /** Continúa desde el selector de método al setup correspondiente. */
89
+ proceedWithMethod(): void;
90
+ private setupTotp;
91
+ /** Verifica el código TOTP de la app de autenticación y activa MFA. */
92
+ verifyTotp(): void;
93
+ /** Confirma el código EMAIL/SMS y activa MFA. */
94
+ confirmCode(): void;
95
+ /** Reenvía el código EMAIL/SMS (re-ejecuta el setup). */
96
+ resendCode(): void;
97
+ /** Regenera los códigos de respaldo TOTP y los muestra una vez. */
98
+ regenerateBackupCodes(): void;
99
+ /** Deshabilita MFA — requiere la contraseña de la cuenta. */
100
+ confirmDisable(): void;
101
+ /** Copia una lista de códigos de respaldo al portapapeles. */
102
+ copyCodes(codes: string[]): Promise<void>;
103
+ /** Etiqueta i18n legible para un método MFA. */
104
+ methodLabel(method: MFAMethod | null): string;
105
+ private resetFlow;
106
+ private startCooldown;
107
+ private stopCooldown;
108
+ /** Mapea los códigos de error MFA del backend a mensajes del namespace `_auth`. */
109
+ private resolveError;
110
+ private showToast;
111
+ static ɵfac: i0.ɵɵFactoryDeclaration<MfaModalComponent, never>;
112
+ static ɵcmp: i0.ɵɵComponentDeclaration<MfaModalComponent, "val-mfa-modal", never, { "isOpen": { "alias": "isOpen"; "required": false; }; }, { "changed": "changed"; "dismissed": "dismissed"; }, never, never, true, never>;
113
+ }
114
+ export {};
package/lib/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export declare const VERSION = "2.0.833";
5
+ export declare const VERSION = "2.0.835";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.833",
3
+ "version": "2.0.835",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -191,6 +191,7 @@ export * from './lib/components/organisms/form/form-footer/form-footer.component
191
191
  export * from './lib/components/organisms/form/form.component';
192
192
  export * from './lib/components/organisms/header/header.component';
193
193
  export * from './lib/components/organisms/header/types';
194
+ export * from './lib/components/organisms/mfa-modal/mfa-modal.component';
194
195
  export * from './lib/components/organisms/item-list/item-list.component';
195
196
  export * from './lib/components/organisms/item-list/types';
196
197
  export * from './lib/components/organisms/no-content/no-content.component';