import { ActionCardMetadata } from '../../molecules/action-card/types'; import { ActionHeaderMetadata } from '../../molecules/action-header/types'; import { PageLinksMetadata } from '../../molecules/page-links/types'; import { ButtonMetadata } from '../../types'; import { DeviceInfo, SessionInfo } from '../../../services/auth/types'; import { SecurityViewConfig } from './types'; import * as i0 from "@angular/core"; /** * `val-security-view` — vista Seguridad full-feature autocontenida (organism). * * Promovida desde `showcase` bajo el proceso de ADR-021. Reúne en una sola vista: * - **Sesiones activas** — única vista user-facing de "dónde tengo sesión". * Lista inline (limit 3) + modal "Ver todas" (`val-session-list-modal`) + * revoke individual / revoke-all (con confirmación). * - **Action-cards** — cambiar contraseña, cambiar email y MFA (cada una abre * el modal correspondiente de la lib). * - **Políticas legales** — links resueltos vía `LegalLinkService` (apps * satélite apuntan al main site). * * Deep-links del email (gateados por `config.handleDeepLinks`, default `true`): * - `?token=...&action=...` → modal `val-login-attempt-modal` (autorizar/bloquear * el nuevo acceso). * - `?mfaCode=...` → abre el modal MFA con el código pre-cargado. * * NO renderiza ion-content — vive dentro de val-page-wrapper. * * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no * proveyó el namespace configurado (default `Settings.Security`). */ export declare class SecurityViewComponent { private nav; private i18n; private deviceService; private legalLink; private toast; private errors; private router; private route; private sessionService; private modalService; private confirmDialog; /** * Config vía @Input (object-first). Si no se pasa, se cae al route data * `securityConfig` (poblado por `provideValtechSecurityRoutes`). * `resolvedConfig` mergea con los defaults — `@Input` gana sobre route data. */ config?: SecurityViewConfig; readonly resolvedConfig: import("@angular/core").Signal> & Pick>; /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */ private get ns(); /** * Lista de dispositivos del user. No se renderiza — solo alimenta el modal * de confirmación de inicio de sesión (`handleActionTokenFromUrl`) para * resolver un label legible desde el `targetId` del token. */ protected devices: import("@angular/core").WritableSignal; readonly sessions: import("@angular/core").WritableSignal; readonly sessionsLoading: import("@angular/core").WritableSignal; readonly isChangeEmailModalOpen: import("@angular/core").WritableSignal; readonly isChangePasswordModalOpen: import("@angular/core").WritableSignal; readonly isMfaModalOpen: import("@angular/core").WritableSignal; /** Código MFA del deep-link `/verify` — pre-carga el modal en confirmación. */ readonly mfaPrefillCode: import("@angular/core").WritableSignal; readonly pageTitle: import("@angular/core").Signal; readonly pageDescription: import("@angular/core").Signal; readonly quickActionsTitle: import("@angular/core").Signal; readonly policiesTitle: import("@angular/core").Signal; readonly hasActionCards: import("@angular/core").Signal; readonly actionCards: import("@angular/core").Signal; /** * Fuente única de links legales del producto. Se resuelven vía * `LegalLinkService` — apps satélite apuntan al main site, el main site los * deja relativos. */ readonly policyLinksProps: import("@angular/core").Signal; readonly sessionsTitle: import("@angular/core").Signal; readonly sessionsEmptyLabel: import("@angular/core").Signal; readonly sessionsThis: import("@angular/core").Signal; readonly hasOtherSessions: import("@angular/core").Signal; /** Sesiones ordenadas: current primero, resto por createdAt desc. */ readonly sortedSessions: import("@angular/core").Signal; /** Limit de sesiones mostradas inline. Si total > limit, "Ver todas" abre modal. */ private readonly VISIBLE_LIMIT; readonly visibleSessions: import("@angular/core").Signal; readonly hasMoreSessions: import("@angular/core").Signal; /** Titulo con count: "Sesiones activas (4)". Sin count si N=0. */ readonly sessionsTitleWithCount: import("@angular/core").Signal; readonly revokeOneButtonProps: import("@angular/core").Signal>; readonly viewAllButtonProps: import("@angular/core").Signal>; /** Action-header de Sesiones: title + count + boton "Cerrar todas las demas". */ readonly sessionsHeader: import("@angular/core").Signal; constructor(); /** * Llega vía link del email de "nuevo acceso" (`?token=...`). Valida el token * (sin ejecutar) y levanta el modal de confirmación. El bloqueo solo se * ejecuta si el user confirma "no fui yo" dentro del modal. */ private handleActionTokenFromUrl; private toastTokenInvalid; loadDevices(): Promise; onActionClick(action: ActionCardMetadata): void; onMfaModalDismissed(): void; /** * El user llegó vía link del email, confirmó MFA en el modal. Cerramos el * modal y, si hay hook `onMfaCompleted`, lo invocamos; si no, navegamos al * `homeRoute` configurado — quedarse en Settings → Security daría la * sensación de "tarea inconclusa" cuando el flow ya terminó. */ onMfaEnabledViaDeeplink(): void; /** * Deep-link `/verify?...&verify-code=` → redirige a esta vista con `?mfaCode=`. * Abre el modal MFA con el código pre-cargado en el paso de confirmación. */ private handleMfaCodeFromUrl; protected describeDevice(d: DeviceInfo): string; protected formatDate(iso?: string): string; private toastOk; /** Icono según device: phone si UA mobile, sino laptop. */ deviceIcon(s: SessionInfo): string; formatSessionMeta(s: SessionInfo): string; onRevokeOne(sessionId: string): Promise; onRevokeAll(): Promise; /** Abre modal con la lista completa. Cada revoke pasa por `onRevoke`. */ openSessionsModal(): Promise; private loadSessions; /** Lee del namespace configurado. */ protected tt(key: string): string; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }