valtech-components 2.0.867 → 2.0.868
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/templates/page-wrapper/page-wrapper.component.mjs +2 -6
- package/esm2022/lib/services/errors/interpret-error.mjs +9 -5
- package/esm2022/lib/services/i18n/default-content.mjs +1 -17
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +1 -4
- package/fesm2022/valtech-components.mjs +11 -177
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +0 -2
- package/esm2022/lib/components/molecules/network-banner/network-banner.component.mjs +0 -98
- package/esm2022/lib/services/network-status/index.mjs +0 -2
- package/esm2022/lib/services/network-status/network-status.service.mjs +0 -59
- package/lib/components/molecules/network-banner/network-banner.component.d.ts +0 -27
- package/lib/services/network-status/index.d.ts +0 -1
- package/lib/services/network-status/network-status.service.d.ts +0 -18
package/lib/version.d.ts
CHANGED
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -277,8 +277,6 @@ export * from './lib/services/firebase';
|
|
|
277
277
|
export * from './lib/services/auth';
|
|
278
278
|
export * from './lib/services/i18n';
|
|
279
279
|
export * from './lib/services/preferences';
|
|
280
|
-
export * from './lib/services/network-status';
|
|
281
|
-
export * from './lib/components/molecules/network-banner/network-banner.component';
|
|
282
280
|
export * from './lib/services/page-refresh/page-refresh.service';
|
|
283
281
|
export * from './lib/services/refreshable-stream';
|
|
284
282
|
export * from './lib/services/app-config';
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { Component, computed, inject } from '@angular/core';
|
|
2
|
-
import { I18nService } from '../../../services/i18n';
|
|
3
|
-
import { NetworkStatusService } from '../../../services/network-status/network-status.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
const NAMESPACE = 'NetworkBanner';
|
|
6
|
-
/**
|
|
7
|
-
* val-network-banner
|
|
8
|
-
*
|
|
9
|
-
* Banner de estado de red que empuja el contenido hacia abajo (no fixed/overlay).
|
|
10
|
-
* - Offline: banner rojo sin cierre, persiste hasta reconexion.
|
|
11
|
-
* - Reconexion: banner verde con boton de cierre y countdown 10s.
|
|
12
|
-
* - Online desde inicio: no renderiza nada.
|
|
13
|
-
*
|
|
14
|
-
* Colocar como primer hijo dentro de ion-content, antes de val-container.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* <val-network-banner />
|
|
18
|
-
*/
|
|
19
|
-
export class NetworkBannerComponent {
|
|
20
|
-
constructor() {
|
|
21
|
-
this.i18n = inject(I18nService);
|
|
22
|
-
this.network = inject(NetworkStatusService);
|
|
23
|
-
this.showBanner = computed(() => !this.network.isOnline() || this.network.justReconnected());
|
|
24
|
-
this.isOffline = computed(() => !this.network.isOnline());
|
|
25
|
-
this.isReconnected = computed(() => this.network.justReconnected());
|
|
26
|
-
this.countdown = this.network.countdown;
|
|
27
|
-
this.closeLabel = computed(() => {
|
|
28
|
-
this.i18n.lang();
|
|
29
|
-
const s = String(this.countdown() ?? 0);
|
|
30
|
-
return this.t('closeCountdown').replace('{s}', s);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
t(key) {
|
|
34
|
-
return this.i18n.t(key, NAMESPACE);
|
|
35
|
-
}
|
|
36
|
-
dismiss() {
|
|
37
|
-
this.network.dismiss();
|
|
38
|
-
}
|
|
39
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NetworkBannerComponent, isStandalone: true, selector: "val-network-banner", ngImport: i0, template: `
|
|
41
|
-
<div
|
|
42
|
-
class="network-banner"
|
|
43
|
-
[class.network-banner--visible]="showBanner()"
|
|
44
|
-
[class.network-banner--offline]="isOffline()"
|
|
45
|
-
[class.network-banner--reconnected]="isReconnected()"
|
|
46
|
-
role="alert"
|
|
47
|
-
[attr.aria-live]="isOffline() ? 'assertive' : 'polite'"
|
|
48
|
-
>
|
|
49
|
-
<div class="network-banner__content">
|
|
50
|
-
<span class="network-banner__icon">{{ isOffline() ? '⚠' : '✓' }}</span>
|
|
51
|
-
<span class="network-banner__text">
|
|
52
|
-
@if (isOffline()) {
|
|
53
|
-
<strong>{{ t('offlineTitle') }}</strong>
|
|
54
|
-
{{ t('offlineBody') }}
|
|
55
|
-
} @else {
|
|
56
|
-
<strong>{{ t('reconnectedTitle') }}</strong>
|
|
57
|
-
}
|
|
58
|
-
</span>
|
|
59
|
-
@if (isReconnected()) {
|
|
60
|
-
<button class="network-banner__close" (click)="dismiss()" [attr.aria-label]="t('close')">
|
|
61
|
-
{{ closeLabel() }} ✕
|
|
62
|
-
</button>
|
|
63
|
-
}
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
`, isInline: true, styles: [".network-banner{max-height:0;overflow:hidden;transition:max-height .35s ease-out}.network-banner--visible{max-height:100px}.network-banner__content{display:flex;align-items:center;gap:.5rem;padding:.6rem 1rem;font-size:.875rem;line-height:1.4}.network-banner--offline .network-banner__content{background:var(--ion-color-danger, #eb445a);color:#fff}.network-banner--reconnected .network-banner__content{background:var(--ion-color-success, #2dd36f);color:#fff}.network-banner__icon{flex-shrink:0;font-size:1rem}.network-banner__text{flex:1}.network-banner__close{background:#fff3;border:1px solid rgba(255,255,255,.4);border-radius:4px;color:#fff;cursor:pointer;font-size:.8rem;padding:.25rem .5rem;white-space:nowrap}.network-banner__close:hover{background:#ffffff59}\n"] }); }
|
|
67
|
-
}
|
|
68
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkBannerComponent, decorators: [{
|
|
69
|
-
type: Component,
|
|
70
|
-
args: [{ selector: 'val-network-banner', standalone: true, template: `
|
|
71
|
-
<div
|
|
72
|
-
class="network-banner"
|
|
73
|
-
[class.network-banner--visible]="showBanner()"
|
|
74
|
-
[class.network-banner--offline]="isOffline()"
|
|
75
|
-
[class.network-banner--reconnected]="isReconnected()"
|
|
76
|
-
role="alert"
|
|
77
|
-
[attr.aria-live]="isOffline() ? 'assertive' : 'polite'"
|
|
78
|
-
>
|
|
79
|
-
<div class="network-banner__content">
|
|
80
|
-
<span class="network-banner__icon">{{ isOffline() ? '⚠' : '✓' }}</span>
|
|
81
|
-
<span class="network-banner__text">
|
|
82
|
-
@if (isOffline()) {
|
|
83
|
-
<strong>{{ t('offlineTitle') }}</strong>
|
|
84
|
-
{{ t('offlineBody') }}
|
|
85
|
-
} @else {
|
|
86
|
-
<strong>{{ t('reconnectedTitle') }}</strong>
|
|
87
|
-
}
|
|
88
|
-
</span>
|
|
89
|
-
@if (isReconnected()) {
|
|
90
|
-
<button class="network-banner__close" (click)="dismiss()" [attr.aria-label]="t('close')">
|
|
91
|
-
{{ closeLabel() }} ✕
|
|
92
|
-
</button>
|
|
93
|
-
}
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
`, styles: [".network-banner{max-height:0;overflow:hidden;transition:max-height .35s ease-out}.network-banner--visible{max-height:100px}.network-banner__content{display:flex;align-items:center;gap:.5rem;padding:.6rem 1rem;font-size:.875rem;line-height:1.4}.network-banner--offline .network-banner__content{background:var(--ion-color-danger, #eb445a);color:#fff}.network-banner--reconnected .network-banner__content{background:var(--ion-color-success, #2dd36f);color:#fff}.network-banner__icon{flex-shrink:0;font-size:1rem}.network-banner__text{flex:1}.network-banner__close{background:#fff3;border:1px solid rgba(255,255,255,.4);border-radius:4px;color:#fff;cursor:pointer;font-size:.8rem;padding:.25rem .5rem;white-space:nowrap}.network-banner__close:hover{background:#ffffff59}\n"] }]
|
|
97
|
-
}] });
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9uZXR3b3JrLWJhbm5lci9uZXR3b3JrLWJhbm5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5REFBeUQsQ0FBQzs7QUFFL0YsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7R0FZRztBQXdGSCxNQUFNLE9BQU8sc0JBQXNCO0lBdkZuQztRQXdGbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFL0MsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUVuQyxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztLQVNKO0lBUEMsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzsrR0FyQlUsc0JBQXNCO21HQUF0QixzQkFBc0IsOEVBcEZ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQ7OzRGQTBEVSxzQkFBc0I7a0JBdkZsQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFlBQ047Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmV0d29ya1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uZXR3b3JrLXN0YXR1cy9uZXR3b3JrLXN0YXR1cy5zZXJ2aWNlJztcblxuY29uc3QgTkFNRVNQQUNFID0gJ05ldHdvcmtCYW5uZXInO1xuXG4vKipcbiAqIHZhbC1uZXR3b3JrLWJhbm5lclxuICpcbiAqIEJhbm5lciBkZSBlc3RhZG8gZGUgcmVkIHF1ZSBlbXB1amEgZWwgY29udGVuaWRvIGhhY2lhIGFiYWpvIChubyBmaXhlZC9vdmVybGF5KS5cbiAqIC0gT2ZmbGluZTogYmFubmVyIHJvam8gc2luIGNpZXJyZSwgcGVyc2lzdGUgaGFzdGEgcmVjb25leGlvbi5cbiAqIC0gUmVjb25leGlvbjogYmFubmVyIHZlcmRlIGNvbiBib3RvbiBkZSBjaWVycmUgeSBjb3VudGRvd24gMTBzLlxuICogLSBPbmxpbmUgZGVzZGUgaW5pY2lvOiBubyByZW5kZXJpemEgbmFkYS5cbiAqXG4gKiBDb2xvY2FyIGNvbW8gcHJpbWVyIGhpam8gZGVudHJvIGRlIGlvbi1jb250ZW50LCBhbnRlcyBkZSB2YWwtY29udGFpbmVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8dmFsLW5ldHdvcmstYmFubmVyIC8+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1uZXR3b3JrLWJhbm5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJuZXR3b3JrLWJhbm5lclwiXG4gICAgICBbY2xhc3MubmV0d29yay1iYW5uZXItLXZpc2libGVdPVwic2hvd0Jhbm5lcigpXCJcbiAgICAgIFtjbGFzcy5uZXR3b3JrLWJhbm5lci0tb2ZmbGluZV09XCJpc09mZmxpbmUoKVwiXG4gICAgICBbY2xhc3MubmV0d29yay1iYW5uZXItLXJlY29ubmVjdGVkXT1cImlzUmVjb25uZWN0ZWQoKVwiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgW2F0dHIuYXJpYS1saXZlXT1cImlzT2ZmbGluZSgpID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cIm5ldHdvcmstYmFubmVyX19jb250ZW50XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmV0d29yay1iYW5uZXJfX2ljb25cIj57eyBpc09mZmxpbmUoKSA/ICcmIzk4ODg7JyA6ICcmIzEwMDAzOycgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmV0d29yay1iYW5uZXJfX3RleHRcIj5cbiAgICAgICAgICBAaWYgKGlzT2ZmbGluZSgpKSB7XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ29mZmxpbmVUaXRsZScpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICB7eyB0KCdvZmZsaW5lQm9keScpIH19XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHQoJ3JlY29ubmVjdGVkVGl0bGUnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICBAaWYgKGlzUmVjb25uZWN0ZWQoKSkge1xuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuZXR3b3JrLWJhbm5lcl9fY2xvc2VcIiAoY2xpY2spPVwiZGlzbWlzcygpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjbG9zZScpXCI+XG4gICAgICAgICAgICB7eyBjbG9zZUxhYmVsKCkgfX0gJiN4MjcxNTtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5uZXR3b3JrLWJhbm5lciB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMzUwbXMgZWFzZS1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tdmlzaWJsZSB7XG4gICAgICAgIG1heC1oZWlnaHQ6IDEwMHB4O1xuICAgICAgfVxuXG4gICAgICAubmV0d29yay1iYW5uZXJfX2NvbnRlbnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgICAgcGFkZGluZzogMC42cmVtIDFyZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tb2ZmbGluZSAubmV0d29yay1iYW5uZXJfX2NvbnRlbnQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyLCAjZWI0NDVhKTtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICB9XG5cbiAgICAgIC5uZXR3b3JrLWJhbm5lci0tcmVjb25uZWN0ZWQgLm5ldHdvcmstYmFubmVyX19jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3MsICMyZGQzNmYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19pY29uIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX190ZXh0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19jbG9zZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLm5ldHdvcmstYmFubmVyX19jbG9zZTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmV0d29ya0Jhbm5lckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29yayA9IGluamVjdChOZXR3b3JrU3RhdHVzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgc2hvd0Jhbm5lciA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLm5ldHdvcmsuaXNPbmxpbmUoKSB8fCB0aGlzLm5ldHdvcmsuanVzdFJlY29ubmVjdGVkKCkpO1xuICByZWFkb25seSBpc09mZmxpbmUgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5uZXR3b3JrLmlzT25saW5lKCkpO1xuICByZWFkb25seSBpc1JlY29ubmVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5uZXR3b3JrLmp1c3RSZWNvbm5lY3RlZCgpKTtcbiAgcmVhZG9ubHkgY291bnRkb3duID0gdGhpcy5uZXR3b3JrLmNvdW50ZG93bjtcblxuICByZWFkb25seSBjbG9zZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgY29uc3QgcyA9IFN0cmluZyh0aGlzLmNvdW50ZG93bigpID8/IDApO1xuICAgIHJldHVybiB0aGlzLnQoJ2Nsb3NlQ291bnRkb3duJykucmVwbGFjZSgne3N9Jywgcyk7XG4gIH0pO1xuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMubmV0d29yay5kaXNtaXNzKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { NetworkStatusService } from './network-status.service';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL25ldHdvcmstc3RhdHVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgTmV0d29ya1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmstc3RhdHVzLnNlcnZpY2UnO1xuIl19
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Injectable, signal } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class NetworkStatusService {
|
|
4
|
-
constructor() {
|
|
5
|
-
this._isOnline = signal(typeof navigator !== 'undefined' ? navigator.onLine : true);
|
|
6
|
-
this._justReconnected = signal(false);
|
|
7
|
-
this._countdown = signal(null);
|
|
8
|
-
this.isOnline = this._isOnline.asReadonly();
|
|
9
|
-
this.justReconnected = this._justReconnected.asReadonly();
|
|
10
|
-
this.countdown = this._countdown.asReadonly();
|
|
11
|
-
if (typeof window !== 'undefined') {
|
|
12
|
-
window.addEventListener('online', () => this.onOnline());
|
|
13
|
-
window.addEventListener('offline', () => this.onOffline());
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
onOnline() {
|
|
17
|
-
if (!this._isOnline()) {
|
|
18
|
-
this._isOnline.set(true);
|
|
19
|
-
this._justReconnected.set(true);
|
|
20
|
-
this.startCountdown();
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
onOffline() {
|
|
24
|
-
this._isOnline.set(false);
|
|
25
|
-
this._justReconnected.set(false);
|
|
26
|
-
this.clearCountdown();
|
|
27
|
-
}
|
|
28
|
-
startCountdown() {
|
|
29
|
-
this.clearCountdown();
|
|
30
|
-
this._countdown.set(10);
|
|
31
|
-
this._countdownTimer = setInterval(() => {
|
|
32
|
-
const current = this._countdown();
|
|
33
|
-
if (current === null || current <= 1) {
|
|
34
|
-
this.dismiss();
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
this._countdown.set(current - 1);
|
|
38
|
-
}
|
|
39
|
-
}, 1000);
|
|
40
|
-
}
|
|
41
|
-
clearCountdown() {
|
|
42
|
-
if (this._countdownTimer) {
|
|
43
|
-
clearInterval(this._countdownTimer);
|
|
44
|
-
this._countdownTimer = undefined;
|
|
45
|
-
}
|
|
46
|
-
this._countdown.set(null);
|
|
47
|
-
}
|
|
48
|
-
dismiss() {
|
|
49
|
-
this._justReconnected.set(false);
|
|
50
|
-
this.clearCountdown();
|
|
51
|
-
}
|
|
52
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
53
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, providedIn: 'root' }); }
|
|
54
|
-
}
|
|
55
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NetworkStatusService, decorators: [{
|
|
56
|
-
type: Injectable,
|
|
57
|
-
args: [{ providedIn: 'root' }]
|
|
58
|
-
}], ctorParameters: () => [] });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1zdGF0dXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvbmV0d29yay1zdGF0dXMvbmV0d29yay1zdGF0dXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHbkQsTUFBTSxPQUFPLG9CQUFvQjtJQVUvQjtRQVRRLGNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFHeEMsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkMsb0JBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckQsY0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7UUFHaEQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFTyxRQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBdkRVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZXR3b3JrU3RhdHVzU2VydmljZSB7XG4gIHByaXZhdGUgX2lzT25saW5lID0gc2lnbmFsKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLm9uTGluZSA6IHRydWUpO1xuICBwcml2YXRlIF9qdXN0UmVjb25uZWN0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9jb3VudGRvd24gPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX2NvdW50ZG93blRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuXG4gIHJlYWRvbmx5IGlzT25saW5lID0gdGhpcy5faXNPbmxpbmUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBqdXN0UmVjb25uZWN0ZWQgPSB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBjb3VudGRvd24gPSB0aGlzLl9jb3VudGRvd24uYXNSZWFkb25seSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29ubGluZScsICgpID0+IHRoaXMub25PbmxpbmUoKSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsICgpID0+IHRoaXMub25PZmZsaW5lKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25PbmxpbmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc09ubGluZSgpKSB7XG4gICAgICB0aGlzLl9pc09ubGluZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zdGFydENvdW50ZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25PZmZsaW5lKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzT25saW5lLnNldChmYWxzZSk7XG4gICAgdGhpcy5fanVzdFJlY29ubmVjdGVkLnNldChmYWxzZSk7XG4gICAgdGhpcy5jbGVhckNvdW50ZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duKCk7XG4gICAgdGhpcy5fY291bnRkb3duLnNldCgxMCk7XG4gICAgdGhpcy5fY291bnRkb3duVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY291bnRkb3duKCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50IDw9IDEpIHtcbiAgICAgICAgdGhpcy5kaXNtaXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb3VudGRvd24uc2V0KGN1cnJlbnQgLSAxKTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDb3VudGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvdW50ZG93blRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2NvdW50ZG93blRpbWVyKTtcbiAgICAgIHRoaXMuX2NvdW50ZG93blRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9jb3VudGRvd24uc2V0KG51bGwpO1xuICB9XG5cbiAgZGlzbWlzcygpOiB2b2lkIHtcbiAgICB0aGlzLl9qdXN0UmVjb25uZWN0ZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
/**
|
|
3
|
-
* val-network-banner
|
|
4
|
-
*
|
|
5
|
-
* Banner de estado de red que empuja el contenido hacia abajo (no fixed/overlay).
|
|
6
|
-
* - Offline: banner rojo sin cierre, persiste hasta reconexion.
|
|
7
|
-
* - Reconexion: banner verde con boton de cierre y countdown 10s.
|
|
8
|
-
* - Online desde inicio: no renderiza nada.
|
|
9
|
-
*
|
|
10
|
-
* Colocar como primer hijo dentro de ion-content, antes de val-container.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* <val-network-banner />
|
|
14
|
-
*/
|
|
15
|
-
export declare class NetworkBannerComponent {
|
|
16
|
-
private readonly i18n;
|
|
17
|
-
private readonly network;
|
|
18
|
-
readonly showBanner: import("@angular/core").Signal<boolean>;
|
|
19
|
-
readonly isOffline: import("@angular/core").Signal<boolean>;
|
|
20
|
-
readonly isReconnected: import("@angular/core").Signal<boolean>;
|
|
21
|
-
readonly countdown: import("@angular/core").Signal<number>;
|
|
22
|
-
readonly closeLabel: import("@angular/core").Signal<string>;
|
|
23
|
-
t(key: string): string;
|
|
24
|
-
dismiss(): void;
|
|
25
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NetworkBannerComponent, never>;
|
|
26
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NetworkBannerComponent, "val-network-banner", never, {}, {}, never, never, true, never>;
|
|
27
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { NetworkStatusService } from './network-status.service';
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
export declare class NetworkStatusService {
|
|
3
|
-
private _isOnline;
|
|
4
|
-
private _justReconnected;
|
|
5
|
-
private _countdown;
|
|
6
|
-
private _countdownTimer?;
|
|
7
|
-
readonly isOnline: import("@angular/core").Signal<boolean>;
|
|
8
|
-
readonly justReconnected: import("@angular/core").Signal<boolean>;
|
|
9
|
-
readonly countdown: import("@angular/core").Signal<number>;
|
|
10
|
-
constructor();
|
|
11
|
-
private onOnline;
|
|
12
|
-
private onOffline;
|
|
13
|
-
private startCountdown;
|
|
14
|
-
private clearCountdown;
|
|
15
|
-
dismiss(): void;
|
|
16
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NetworkStatusService, never>;
|
|
17
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<NetworkStatusService>;
|
|
18
|
-
}
|