valtech-components 2.0.808 → 2.0.809

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.
@@ -0,0 +1,41 @@
1
+ /**
2
+ * UpdateBanner Types
3
+ *
4
+ * Contenido i18n del banner de actualización de la app.
5
+ */
6
+ /**
7
+ * Namespace i18n usado por `val-update-banner`.
8
+ * Las apps consumidoras pueden sobreescribir estas keys registrando
9
+ * contenido bajo este namespace en `I18nService`.
10
+ */
11
+ export declare const UPDATE_BANNER_I18N_NAMESPACE = "UpdateBanner";
12
+ /**
13
+ * Textos por defecto del banner (fallback si la app no registra el namespace).
14
+ * Soporta es / en / pt.
15
+ */
16
+ export declare const UPDATE_BANNER_DEFAULT_CONTENT: {
17
+ readonly es: {
18
+ readonly availableTitle: "Hay una versión nueva disponible";
19
+ readonly availableMessage: "Actualiza para obtener las últimas mejoras.";
20
+ readonly requiredTitle: "Debes actualizar para continuar";
21
+ readonly requiredMessage: "Esta versión ya no es compatible. Actualiza para seguir.";
22
+ readonly updateAction: "Actualizar";
23
+ readonly dismissAction: "Cerrar";
24
+ };
25
+ readonly en: {
26
+ readonly availableTitle: "A new version is available";
27
+ readonly availableMessage: "Update to get the latest improvements.";
28
+ readonly requiredTitle: "You must update to continue";
29
+ readonly requiredMessage: "This version is no longer supported. Please update.";
30
+ readonly updateAction: "Update";
31
+ readonly dismissAction: "Close";
32
+ };
33
+ readonly pt: {
34
+ readonly availableTitle: "Há uma nova versão disponível";
35
+ readonly availableMessage: "Atualize para obter as últimas melhorias.";
36
+ readonly requiredTitle: "Você precisa atualizar para continuar";
37
+ readonly requiredMessage: "Esta versão não é mais compatível. Atualize para seguir.";
38
+ readonly updateAction: "Atualizar";
39
+ readonly dismissAction: "Fechar";
40
+ };
41
+ };
@@ -1,42 +1,48 @@
1
- import { BannerMetadata } from '../../organisms/banner/types';
2
1
  import * as i0 from "@angular/core";
3
2
  /**
4
3
  * val-update-banner
5
4
  *
6
- * Banner de actualización que aparece cuando hay una nueva versión disponible.
7
- * Se cierra automáticamente cuando el usuario hace clic en "Actualizar" o en cerrar.
5
+ * Avisa al usuario de una versión nueva. Colócalo una sola vez, alto en el
6
+ * árbol de la app (p.ej. en `app.component` por encima del router outlet)
7
+ * para que sea visible en cualquier ruta.
8
8
  *
9
9
  * @example
10
10
  * ```html
11
- * <!-- Uso básico -->
12
11
  * <val-update-banner />
13
- *
14
- * <!-- El banner solo aparece si hay actualización disponible -->
15
12
  * ```
16
13
  */
17
14
  export declare class UpdateBannerComponent {
18
- private appConfig;
19
- private i18n;
20
- /**
21
- * Signal para controlar si el banner fue descartado por el usuario.
22
- */
23
- private dismissed;
15
+ private readonly version;
16
+ private readonly i18n;
24
17
  /**
25
- * Indica si el banner debe mostrarse.
18
+ * True cuando el banner está en modo obligatorio (hard gate, no descartable).
26
19
  */
27
- readonly show: import("@angular/core").Signal<boolean>;
20
+ readonly required: import("@angular/core").Signal<boolean>;
28
21
  /**
29
- * Props del banner calculadas reactivamente.
22
+ * True cuando el banner debe renderizarse:
23
+ * - siempre que el estado sea `update-required`, o
24
+ * - si es `update-available` y el usuario no lo descartó.
30
25
  */
31
- readonly bannerProps: import("@angular/core").Signal<BannerMetadata>;
26
+ readonly visible: import("@angular/core").Signal<boolean>;
32
27
  /**
33
- * Maneja el clic en acciones del banner.
28
+ * Textos resolvidos del banner. Reactivo a idioma y al estado required.
29
+ * Usa el namespace `UpdateBanner` de `I18nService` con fallback embebido.
34
30
  */
35
- onAction(token: string): void;
31
+ readonly t: import("@angular/core").Signal<{
32
+ title: string;
33
+ message: string;
34
+ updateAction: string;
35
+ dismissAction: string;
36
+ }>;
37
+ /** Aplica la actualización (activa el SW si existe + recarga). */
38
+ onUpdate(): void;
39
+ /** Descarta el banner opcional. No-op en modo obligatorio. */
40
+ onDismiss(): void;
36
41
  /**
37
- * Descarta el banner temporalmente (hasta que se recargue la página).
42
+ * Resuelve una key i18n del namespace `UpdateBanner` con fallback al
43
+ * contenido por defecto embebido (es / en / pt).
38
44
  */
39
- dismiss(): void;
45
+ private tr;
40
46
  static ɵfac: i0.ɵɵFactoryDeclaration<UpdateBannerComponent, never>;
41
47
  static ɵcmp: i0.ɵɵComponentDeclaration<UpdateBannerComponent, "val-update-banner", never, {}, {}, never, never, true, never>;
42
48
  }
@@ -0,0 +1,64 @@
1
+ import { Signal } from '@angular/core';
2
+ import { AppVersionStatus } from './types';
3
+ import * as i0 from "@angular/core";
4
+ export declare class AppVersionService {
5
+ /** SwUpdate solo existe si el SW está registrado (prod build). */
6
+ private readonly swUpdate;
7
+ /** AppConfigService es opcional: la app puede no wirearlo. */
8
+ private readonly appConfig;
9
+ private readonly serviceConfig;
10
+ private readonly document;
11
+ private readonly destroyRef;
12
+ /** True cuando el SW reportó un bundle nuevo listo (`VERSION_READY`). */
13
+ private readonly swUpdateReady;
14
+ /**
15
+ * True cuando el usuario descartó el banner de actualización opcional.
16
+ * El banner obligatorio (`update-required`) ignora este flag.
17
+ */
18
+ private readonly _dismissed;
19
+ readonly dismissed: Signal<boolean>;
20
+ /**
21
+ * Versión local del build actual de la app.
22
+ * Proviene del provider `provideValtechAppVersion({ currentVersion })`.
23
+ */
24
+ readonly currentVersion: Signal<string>;
25
+ /**
26
+ * Última versión publicada según el config remoto.
27
+ * `null` si `AppConfigService` no está disponible o aún no cargó.
28
+ */
29
+ readonly latestVersion: Signal<string | null>;
30
+ /**
31
+ * Estado de la versión:
32
+ * - `update-required` — la versión local quedó por debajo de `minVersion`
33
+ * del config remoto. Hard gate. Solo si `AppConfigService` tiene datos.
34
+ * - `update-available` — el SW descargó un bundle nuevo (`VERSION_READY`)
35
+ * o `AppConfigService.hasUpdate` es true.
36
+ * - `up-to-date` — en cualquier otro caso.
37
+ */
38
+ readonly status: Signal<AppVersionStatus>;
39
+ constructor();
40
+ /**
41
+ * Aplica la actualización pendiente.
42
+ *
43
+ * Si el SW está habilitado, activa la versión descargada y recarga; si no,
44
+ * solo recarga la página (la web obtiene el bundle nuevo del servidor).
45
+ */
46
+ applyUpdate(): Promise<void>;
47
+ /**
48
+ * Descarta el banner de actualización opcional.
49
+ * No tiene efecto sobre el estado `update-required` (hard gate).
50
+ */
51
+ dismiss(): void;
52
+ /**
53
+ * Fuerza un chequeo de actualización del service worker.
54
+ * No-op si el SW no está habilitado.
55
+ */
56
+ checkNow(): Promise<void>;
57
+ /**
58
+ * Suscribe `versionUpdates`, programa chequeos periódicos y reacciona al
59
+ * volver la app a foreground. Solo actúa si el SW está habilitado.
60
+ */
61
+ private wireServiceWorker;
62
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppVersionService, never>;
63
+ static ɵprov: i0.ɵɵInjectableDeclaration<AppVersionService>;
64
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * AppVersion Provider
3
+ *
4
+ * Provider e injection token para el servicio de verificación de versión.
5
+ */
6
+ import { EnvironmentProviders, InjectionToken } from '@angular/core';
7
+ import { AppVersionServiceConfig } from './types';
8
+ /**
9
+ * Token de inyección para la configuración de AppVersionService.
10
+ */
11
+ export declare const VALTECH_APP_VERSION: InjectionToken<Required<AppVersionServiceConfig>>;
12
+ /**
13
+ * Provee el servicio de verificación de versión a la aplicación Angular.
14
+ *
15
+ * Detecta cuándo hay una versión nueva de la app combinando dos señales:
16
+ * - `SwUpdate` (PWA service worker) — bundle nuevo descargado y listo.
17
+ * - `AppConfigService` (config remoto en Firestore) — `version` / `minVersion`.
18
+ *
19
+ * @param config - Configuración del servicio. `currentVersion` es obligatorio.
20
+ * @returns EnvironmentProviders para usar en bootstrapApplication.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * // main.ts
25
+ * import { provideValtechAppVersion } from 'valtech-components';
26
+ * import pkg from '../package.json';
27
+ *
28
+ * bootstrapApplication(AppComponent, {
29
+ * providers: [
30
+ * provideValtechAppVersion({ currentVersion: pkg.version }),
31
+ * ],
32
+ * });
33
+ * ```
34
+ */
35
+ export declare function provideValtechAppVersion(config: AppVersionServiceConfig): EnvironmentProviders;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * AppVersion Service Module
3
+ *
4
+ * Verificación de versión de la app para PWA / web. Detecta cuándo hay una
5
+ * versión nueva combinando el service worker (`SwUpdate`) y el config remoto
6
+ * (`AppConfigService`), con soporte para actualización obligatoria (hard gate).
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // main.ts
11
+ * import { provideValtechAppVersion } from 'valtech-components';
12
+ * import pkg from '../package.json';
13
+ *
14
+ * bootstrapApplication(AppComponent, {
15
+ * providers: [
16
+ * provideValtechAppVersion({ currentVersion: pkg.version }),
17
+ * ],
18
+ * });
19
+ * ```
20
+ */
21
+ export * from './types';
22
+ export { VALTECH_APP_VERSION, provideValtechAppVersion } from './config';
23
+ export { AppVersionService } from './app-version.service';
@@ -0,0 +1,35 @@
1
+ /**
2
+ * AppVersion Types
3
+ *
4
+ * Tipos para el servicio de verificación de versión de la aplicación.
5
+ */
6
+ /**
7
+ * Estado de la versión de la aplicación respecto a la versión publicada.
8
+ *
9
+ * - `up-to-date` — la app está al día, no hay nada que hacer.
10
+ * - `update-available` — hay una versión nueva (bundle del SW listo o config
11
+ * remoto más nuevo). El usuario puede actualizar pero NO está obligado.
12
+ * - `update-required` — la versión local quedó por debajo de `minVersion`
13
+ * del config remoto (hard gate). El usuario DEBE actualizar para continuar.
14
+ */
15
+ export type AppVersionStatus = 'up-to-date' | 'update-available' | 'update-required';
16
+ /**
17
+ * Configuración para el proveedor de AppVersionService.
18
+ *
19
+ * @property currentVersion - Versión del build actual de la app (semver string).
20
+ * Normalmente proviene del `version` de `package.json`.
21
+ * @property checkIntervalMs - Intervalo (ms) entre llamadas a
22
+ * `SwUpdate.checkForUpdate()`. Default: 30 minutos.
23
+ */
24
+ export interface AppVersionServiceConfig {
25
+ currentVersion: string;
26
+ checkIntervalMs?: number;
27
+ }
28
+ /**
29
+ * Intervalo por defecto de chequeo de actualizaciones: 30 minutos.
30
+ */
31
+ export declare const DEFAULT_CHECK_INTERVAL_MS: number;
32
+ /**
33
+ * Configuración por defecto del servicio.
34
+ */
35
+ export declare const DEFAULT_APP_VERSION_SERVICE_CONFIG: Required<AppVersionServiceConfig>;
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.808";
5
+ export declare const VERSION = "2.0.809";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.808",
3
+ "version": "2.0.809",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
@@ -14,6 +14,7 @@
14
14
  "@angular/common": "^18.0.0",
15
15
  "@angular/core": "^18.0.0",
16
16
  "@angular/fire": "^18.0.1",
17
+ "@angular/service-worker": "^18.0.0",
17
18
  "@capacitor/app": ">=5.0.0",
18
19
  "@capacitor/clipboard": "^6.0.1",
19
20
  "@ionic/angular": "^8.0.0",
@@ -24,6 +25,9 @@
24
25
  "peerDependenciesMeta": {
25
26
  "@capacitor/app": {
26
27
  "optional": true
28
+ },
29
+ "@angular/service-worker": {
30
+ "optional": true
27
31
  }
28
32
  },
29
33
  "dependencies": {
package/public-api.d.ts CHANGED
@@ -167,6 +167,7 @@ export * from './lib/components/molecules/links-accordion/types';
167
167
  export * from './lib/components/molecules/refresher/refresher.component';
168
168
  export * from './lib/components/molecules/refresher/types';
169
169
  export * from './lib/components/molecules/update-banner/update-banner.component';
170
+ export * from './lib/components/molecules/update-banner/types';
170
171
  export * from './lib/components/molecules/action-card/action-card.component';
171
172
  export * from './lib/components/molecules/action-card/types';
172
173
  export * from './lib/components/molecules/username-input/username-input.component';
@@ -265,6 +266,7 @@ export * from './lib/services/preferences';
265
266
  export * from './lib/services/page-refresh/page-refresh.service';
266
267
  export * from './lib/services/refreshable-stream';
267
268
  export * from './lib/services/app-config';
269
+ export * from './lib/services/app-version';
268
270
  export * from './lib/services/presets';
269
271
  export * from './lib/services/skeleton';
270
272
  export * from './lib/services/pagination';