import { OnDestroy, OnInit } from '@angular/core'; import { FormControl } from '@angular/forms'; import { ToggleInputMetadata } from '../../molecules/toggle-input/types'; import { ButtonMetadata } from '../../types'; import { NotificationPermissionState } from '../../../services/auth/types'; import { PreferencesService } from '../../../services/preferences/preferences.service'; import { NotificationPreferencesViewConfig } from './types'; import * as i0 from "@angular/core"; /** * Estados de la vista de preferencias push: * - `idle`: toggle off, sin operación en curso, sin errores * - `enabling`: secuencia de activación en curso (toggle spinner) * - `enabled`: todo OK (master=true + permission=granted + token registrado) * - `disabling`: desactivación en curso * - `error`: último intento falló → mensaje + botón "Reintentar" * - `blocked`: navegador denegó permisos → mensaje + cómo arreglar * - `unsupported`: navegador no soporta FCM → mensaje * - `needs-install`: iOS sin standalone → instrucciones de instalación PWA */ type UiState = 'idle' | 'enabling' | 'enabled' | 'disabling' | 'error' | 'blocked' | 'unsupported' | 'needs-install'; /** * `val-notification-preferences-view` — **preferencias de notificaciones push** * (FCM) full-feature autocontenida (organism). Promovida desde `showcase` bajo el * proceso de ADR-021. * * Separada de `val-notifications-view` (el inbox / feed). Aquí el user **activa o * desactiva** las notificaciones push en este dispositivo. * * UX simplificado: UN solo toggle que ejecuta toda la secuencia (pedir permiso → * SW ready → getToken → registrar en backend → set master pref) vía * `MessagingService.enable()`. El registro del device en el backend va como * callback (la lib no depende de `AuthService` para evitar ciclos). Mensajes * contextuales y botón "Reintentar" aparecen solo cuando aplican. * * NO renderiza ion-content — vive dentro de val-page-wrapper. `ActivatedRoute` se * inyecta `{ optional: true }` → funciona sin router (embebida / Storybook). */ export declare class NotificationPreferencesViewComponent implements OnInit, OnDestroy { private nav; private i18n; private toast; private auth; private messaging; private pageRefresh; readonly prefs: PreferencesService; private route; /** * Config vía @Input (object-first). Si no se pasa, se cae al route data * `notificationPreferencesConfig` (poblado por * `provideValtechNotificationPreferencesRoutes`). `resolvedConfig` mergea con * los defaults — `@Input` gana sobre route data. */ config?: NotificationPreferencesViewConfig; readonly resolvedConfig: import("@angular/core").Signal> & Pick>; /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */ private get ns(); /** Operación en curso (gobierna spinner del toggle + label "Activando…"). */ private readonly _busy; /** True si el último intento falló — gobierna estado `error` + retry button. */ private readonly _lastFailed; /** True mientras se re-obtiene el token FCM en background (no afecta la UI). */ private _repairingToken; /** Toggle del expand de detalles técnicos. */ readonly showDetails: import("@angular/core").WritableSignal; readonly permission: import("@angular/core").WritableSignal; readonly isSupported: import("@angular/core").WritableSignal; readonly currentToken: import("@angular/core").WritableSignal; readonly needsIOSInstall: import("@angular/core").WritableSignal; /** FormControl del toggle (sync-eado con `isEnabled` via effect). */ readonly toggleControl: FormControl; /** Handler del listener `focus` — referencia guardada para poder removerlo. */ private readonly onWindowFocus; /** Timer del debounce del refresh disparado por `focus`. */ private focusDebounceTimer; /** Ventana de debounce (ms) para el refresh disparado por `focus`. */ private readonly FOCUS_DEBOUNCE_MS; readonly pageTitle: import("@angular/core").Signal; readonly pageDescription: import("@angular/core").Signal; /** * Estado efectivo del toggle: "el usuario tiene push activo". * * Se deriva SOLO de la decisión del usuario (`master`) y del permiso del SO * (`permission`). El token FCM NO forma parte del estado de UI: vive en * memoria, se pierde en cada recarga/suspensión de la PWA y produciría flicker. * Si falta token con `master && granted`, es un detalle reparable en * background (ver `repairTokenIfNeeded`), no un cambio del toggle. */ readonly isEnabled: import("@angular/core").Signal; readonly state: import("@angular/core").Signal; readonly busyLabel: import("@angular/core").Signal; readonly contextMessage: import("@angular/core").Signal; readonly alertVariant: import("@angular/core").Signal<"warning" | "danger" | "info">; readonly alertIcon: import("@angular/core").Signal<"alert-circle-outline" | "close-circle-outline">; readonly toggleProps: import("@angular/core").Signal; readonly retryButtonProps: import("@angular/core").Signal>; readonly tokenPreview: import("@angular/core").Signal; constructor(); /** * Registra el pull-to-refresh estándar. Aunque esta vista no muestra una * lista remota, sí refleja estado mutable del browser (permiso, token, * soporte FCM) que puede cambiar fuera de la app — el refresh re-evalúa todo. * * Se usa `ngOnInit`/`ngOnDestroy` (NO `ionViewWillEnter`) porque * `val-page-wrapper` usa `` plano — los hooks `ionView*` solo * disparan dentro de ``. */ ngOnInit(): void; ngOnDestroy(): void; /** Refresca el estado del browser con debounce — evita ráfagas de `focus`. */ private scheduleBrowserRefresh; /** * Secuencia completa de activación. * * Toda la mecánica (permission → SW ready → getToken con retry → watchdog de * auto-reload) vive en `MessagingService.enable()` de la lib. El paso de * registro del device en el backend se pasa como callback (`registerDevice`) * porque la lib no puede depender de `AuthService` sin crear un ciclo. * * `enable()` no hace throw: resuelve con un `EnablePushResult` descriptivo. */ onEnable(): Promise; onDisable(): Promise; /** Reintentar la secuencia completa de activación, sin importar el estado actual. */ onRetry(): Promise; toggleDetails(): void; private refreshBrowserState; /** * Repara el token FCM en background. * * Si el usuario tiene push activo (`master && granted`) pero no hay token en * memoria — caso típico tras un cold start de la PWA — re-obtenemos el token * y re-registramos el device sin tocar el toggle ni mostrar un error * alarmista. El token es un detalle de implementación reparable, no parte del * estado de UI (ver `isEnabled`). */ private repairTokenIfNeeded; /** * iOS browser sin estar instalado como PWA — push web no disponible. * Aplica a Safari y a Edge/Chrome/Firefox en iOS (todos WebKit por mandato Apple). */ private detectNeedsIOSInstall; protected tt(key: string): string; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; } export {};