import { EventEmitter, OnDestroy } from '@angular/core'; import { FormControl } from '@angular/forms'; import { FormMetadata, FormSubmit } from '../../types'; import { MFAMethod, TOTPSetupResponse } from '../../../services/auth/types'; import { QrResult } from '../../../services/qr-generator/types'; import * as i0 from "@angular/core"; /** Paso del flujo del modal. */ type MfaStep = 'loading' | 'status' | 'method-select' | 'totp-setup' | 'code-confirm' | 'disable'; /** * `val-mfa-modal` — modal de gestión de autenticación de dos factores (MFA) * para un usuario autenticado. Mismo patrón que `val-change-password-modal`. * * Flujo (máquina de estados interna): * - `loading` → `getProfile()` para conocer el estado MFA. * - `status` → muestra MFA habilitado/deshabilitado. Si está habilitado: * gestión de backup codes (TOTP) + deshabilitar. Si no: botón habilitar. * - `method-select` → elegir TOTP / EMAIL / SMS. * - `totp-setup` → QR + secreto manual + backup codes → verificar código. * - `code-confirm` → (EMAIL/SMS) ingresar código recibido, con reenvío. * - `disable` → contraseña para deshabilitar MFA. * * El QR se genera **client-side** (`QrGeneratorService`) — el secreto TOTP * nunca sale del navegador. * * Self-contained: inyecta `AuthService` y llama los endpoints directo. La app * controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`. * * i18n: namespace compartido `_auth`. * * @example * ```html * * ``` */ export declare class MfaModalComponent implements OnDestroy { private _isOpen; /** Controla la visibilidad. Cada apertura re-resuelve el estado MFA. */ set isOpen(value: boolean); get isOpen(): boolean; /** * Código MFA pre-cargado (deep-link desde el email de setup MFA-email). Si * está presente al abrir, el modal salta directo al paso de confirmación * con el código rellenado. */ prefillCode?: string; /** Emite cuando el estado MFA cambia (habilitado / deshabilitado). */ changed: EventEmitter; /** * Emitido cuando un setup MFA se confirma exitosamente y el modal fue abierto * vía deep-link (con `prefillCode`). El host puede usarlo para cerrar el * modal y navegar (ej. a home) en lugar de quedarse en la página de Security. */ enabledViaDeeplink: EventEmitter; /** Emite cuando el user cierra el modal (botón X o backdrop). */ dismissed: EventEmitter; private auth; private toast; private i18n; private i18nHelper; private qrGen; private readonly _step; /** Paso actual del flujo. */ readonly step: import("@angular/core").Signal; /** `true` mientras una llamada al backend está en curso. */ readonly working: import("@angular/core").WritableSignal; readonly mfaEnabled: import("@angular/core").WritableSignal; readonly mfaMethod: import("@angular/core").WritableSignal; readonly userPhone: import("@angular/core").WritableSignal; readonly backupCodesCount: import("@angular/core").WritableSignal; /** Default true para no romper el flow viejo si el backend no devuelve el campo. */ readonly hasPassword: import("@angular/core").WritableSignal; readonly selectedMethod: import("@angular/core").WritableSignal; readonly totpSetup: import("@angular/core").WritableSignal; readonly totpQr: import("@angular/core").WritableSignal; /** Códigos de respaldo recién regenerados — se muestran una sola vez. */ readonly regeneratedCodes: import("@angular/core").WritableSignal; /** Marca momentánea cuando el secreto TOTP se acaba de copiar (feedback visual). */ readonly copiedSecret: import("@angular/core").WritableSignal; readonly resendCooldown: import("@angular/core").WritableSignal; readonly disableCodeSent: import("@angular/core").WritableSignal; readonly pinControl: FormControl; readonly phoneControl: FormControl; readonly pinInputProps: { control: FormControl; token: string; length: number; allowNumbersOnly: boolean; autoFocus: boolean; }; /** Form de deshabilitación — `val-form` con un campo de contraseña. */ readonly disableFormProps: import("@angular/core").Signal; private resendTimer; constructor(); ngOnDestroy(): void; /** Traduce una clave del namespace `_auth`. */ t(key: string): string; /** Cierre iniciado por el user (X / backdrop). */ close(): void; /** * Punto de entrada al abrir el modal. Con `prefillCode` (deep-link del email * de setup MFA-email) salta directo a la confirmación; si no, resuelve el * estado MFA actual. */ private open; /** Consulta el perfil para conocer el estado MFA y posicionar el flujo. */ private resolveStatus; private loadBackupCount; goToMethodSelect(): void; goToDisable(): void; backToStatus(): void; /** Continúa desde el selector de método al setup correspondiente. */ proceedWithMethod(): void; private setupTotp; /** Verifica el código TOTP de la app de autenticación y activa MFA. */ verifyTotp(): void; /** Confirma el código EMAIL/SMS y activa MFA. */ confirmCode(): void; /** Reenvía el código EMAIL/SMS (re-ejecuta el setup). */ resendCode(): void; /** Regenera los códigos de respaldo TOTP y los muestra una vez. */ regenerateBackupCodes(): void; /** Deshabilita MFA usando la contraseña de la cuenta. */ onDisableSubmit(event: FormSubmit): void; /** Deshabilita MFA usando un código TOTP — para cuentas OAuth-only sin contraseña. */ disableWithMfaCode(): void; sendDisableCode(): void; private disable; /** Copia una lista de códigos de respaldo al portapapeles. */ copyCodes(codes: string[]): Promise; /** Copia el secreto TOTP al portapapeles + feedback visual (check) durante 2s. */ copySecret(secret: string): Promise; /** Etiqueta i18n legible para un método MFA. */ methodLabel(method: MFAMethod | null): string; private resetFlow; private startCooldown; private stopCooldown; /** Mapea los códigos de error MFA del backend a mensajes del namespace `_auth`. */ private resolveError; private showToast; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; } export {};