valtech-components 2.0.807 → 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.
- package/esm2022/lib/components/molecules/update-banner/types.mjs +42 -0
- package/esm2022/lib/components/molecules/update-banner/update-banner.component.mjs +205 -74
- package/esm2022/lib/services/app-version/app-version.service.mjs +187 -0
- package/esm2022/lib/services/app-version/config.mjs +42 -0
- package/esm2022/lib/services/app-version/index.mjs +24 -0
- package/esm2022/lib/services/app-version/types.mjs +17 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/valtech-components.mjs +606 -179
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/update-banner/types.d.ts +41 -0
- package/lib/components/molecules/update-banner/update-banner.component.d.ts +26 -20
- package/lib/services/app-version/app-version.service.d.ts +64 -0
- package/lib/services/app-version/config.d.ts +35 -0
- package/lib/services/app-version/index.d.ts +23 -0
- package/lib/services/app-version/types.d.ts +35 -0
- package/lib/version.d.ts +1 -1
- package/package.json +5 -1
- package/public-api.d.ts +2 -0
|
@@ -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
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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
|
-
*
|
|
18
|
+
* True cuando el banner está en modo obligatorio (hard gate, no descartable).
|
|
26
19
|
*/
|
|
27
|
-
readonly
|
|
20
|
+
readonly required: import("@angular/core").Signal<boolean>;
|
|
28
21
|
/**
|
|
29
|
-
*
|
|
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
|
|
26
|
+
readonly visible: import("@angular/core").Signal<boolean>;
|
|
32
27
|
/**
|
|
33
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
42
|
+
* Resuelve una key i18n del namespace `UpdateBanner` con fallback al
|
|
43
|
+
* contenido por defecto embebido (es / en / pt).
|
|
38
44
|
*/
|
|
39
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "valtech-components",
|
|
3
|
-
"version": "2.0.
|
|
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';
|