@asteby/metacore-pwa 0.6.1 → 0.6.2
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/dist/components/install-prompt.d.ts.map +1 -1
- package/dist/components/install-prompt.js +1 -0
- package/dist/components/install-prompt.js.map +1 -1
- package/dist/components/notification-permission-prompt.d.ts +8 -4
- package/dist/components/notification-permission-prompt.d.ts.map +1 -1
- package/dist/components/notification-permission-prompt.js +56 -25
- package/dist/components/notification-permission-prompt.js.map +1 -1
- package/dist/components/update-prompt.d.ts +8 -1
- package/dist/components/update-prompt.d.ts.map +1 -1
- package/dist/components/update-prompt.js +4 -1
- package/dist/components/update-prompt.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-prompt.d.ts","sourceRoot":"","sources":["../../src/components/install-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AASD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAgB,EAAE,GAAE,kBAAuB,
|
|
1
|
+
{"version":3,"file":"install-prompt.d.ts","sourceRoot":"","sources":["../../src/components/install-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AASD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAgB,EAAE,GAAE,kBAAuB,QAoCvF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-prompt.js","sourceRoot":"","sources":["../../src/components/install-prompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAe3C,MAAM,QAAQ,GAAoC;IAChD,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,2DAA2D;IACxE,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,KAAyB,EAAE;IACtF,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE,CAAA;IACrD,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QAC3C,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC;YAAE,OAAM;QAChG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QAEpB,qBAAqB,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,QAAQ;YACR,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,UAAU,EAAE,CAAA;gBACnB,CAAC;aACF;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;wBACxC,YAAY,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC;aACF;SACF,CAAC,CAAA;QACF,uDAAuD;IACzD,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"install-prompt.js","sourceRoot":"","sources":["../../src/components/install-prompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAe3C,MAAM,QAAQ,GAAoC;IAChD,KAAK,EAAE,cAAc;IACrB,WAAW,EAAE,2DAA2D;IACxE,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,UAAU;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,KAAyB,EAAE;IACtF,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE,CAAA;IACrD,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QAC3C,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC;YAAE,OAAM;QAChG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QAEpB,qBAAqB,CAAC;YACpB,EAAE,EAAE,iBAAiB;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,QAAQ;YACR,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,UAAU,EAAE,CAAA;gBACnB,CAAC;aACF;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;wBACxC,YAAY,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC;aACF;SACF,CAAC,CAAA;QACF,uDAAuD;IACzD,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -13,11 +13,15 @@ export interface NotificationPermissionPromptProps {
|
|
|
13
13
|
autoShowDelayMs?: number;
|
|
14
14
|
/** Reload the page after granting to sync state. Default: true. */
|
|
15
15
|
reloadOnGrant?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Stable Sonner id — re-triggers replace the same card (no flood).
|
|
18
|
+
* Default: `sys:push-permission`.
|
|
19
|
+
*/
|
|
20
|
+
toastId?: string | number;
|
|
16
21
|
}
|
|
22
|
+
export declare const PUSH_PERMISSION_TOAST_ID = "sys:push-permission";
|
|
17
23
|
/**
|
|
18
|
-
*
|
|
19
|
-
* fixed-position banner, so it stacks with every other app notification
|
|
20
|
-
* rather than competing for a corner of the screen.
|
|
24
|
+
* Ask once per snooze window. "Ahora no" silences SSE/WS re-prompts.
|
|
21
25
|
*/
|
|
22
|
-
export declare function NotificationPermissionPrompt({ messages, autoShowDelayMs, reloadOnGrant, }?: NotificationPermissionPromptProps): null;
|
|
26
|
+
export declare function NotificationPermissionPrompt({ messages, autoShowDelayMs, reloadOnGrant, toastId, }?: NotificationPermissionPromptProps): null;
|
|
23
27
|
//# sourceMappingURL=notification-permission-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-permission-prompt.d.ts","sourceRoot":"","sources":["../../src/components/notification-permission-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,oCAAoC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,oCAAoC,CAAA;IAC/C,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"notification-permission-prompt.d.ts","sourceRoot":"","sources":["../../src/components/notification-permission-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,oCAAoC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,EAAE,oCAAoC,CAAA;IAC/C,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC1B;AAcD,eAAO,MAAM,wBAAwB,wBAAwB,CAAA;AA8B7D;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,QAAQ,EACR,eAAsB,EACtB,aAAoB,EACpB,OAAkC,GACnC,GAAE,iCAAsC,QAwExC"}
|
|
@@ -10,15 +10,46 @@ const DEFAULTS = {
|
|
|
10
10
|
blockedTitle: 'Notificaciones bloqueadas por el navegador',
|
|
11
11
|
blockedDescription: 'Debes habilitarlas manualmente: Click en el ícono de la barra de direcciones → Permisos → Notificaciones → Permitir',
|
|
12
12
|
};
|
|
13
|
+
export const PUSH_PERMISSION_TOAST_ID = 'sys:push-permission';
|
|
14
|
+
const DISMISS_KEY = 'notification-prompt-dismissed';
|
|
15
|
+
const DISMISS_UNTIL_KEY = 'notification-prompt-dismissed-until';
|
|
16
|
+
const SNOOZE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
17
|
+
let closedThisTab = false;
|
|
18
|
+
function isSnoozed() {
|
|
19
|
+
if (closedThisTab)
|
|
20
|
+
return true;
|
|
21
|
+
if (typeof window === 'undefined')
|
|
22
|
+
return true;
|
|
23
|
+
try {
|
|
24
|
+
if (sessionStorage.getItem(DISMISS_KEY) === 'true')
|
|
25
|
+
return true;
|
|
26
|
+
const until = Number(localStorage.getItem(DISMISS_UNTIL_KEY) || '');
|
|
27
|
+
if (Number.isFinite(until) && Date.now() < until)
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* private mode */
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
function snooze() {
|
|
36
|
+
closedThisTab = true;
|
|
37
|
+
try {
|
|
38
|
+
localStorage.setItem(DISMISS_UNTIL_KEY, String(Date.now() + SNOOZE_MS));
|
|
39
|
+
sessionStorage.setItem(DISMISS_KEY, 'true');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* private mode — tab flag still blocks */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
13
45
|
/**
|
|
14
|
-
*
|
|
15
|
-
* fixed-position banner, so it stacks with every other app notification
|
|
16
|
-
* rather than competing for a corner of the screen.
|
|
46
|
+
* Ask once per snooze window. "Ahora no" silences SSE/WS re-prompts.
|
|
17
47
|
*/
|
|
18
|
-
export function NotificationPermissionPrompt({ messages, autoShowDelayMs = 2000, reloadOnGrant = true, } = {}) {
|
|
48
|
+
export function NotificationPermissionPrompt({ messages, autoShowDelayMs = 2000, reloadOnGrant = true, toastId = PUSH_PERMISSION_TOAST_ID, } = {}) {
|
|
19
49
|
const msgs = { ...DEFAULTS, ...messages };
|
|
20
|
-
const
|
|
50
|
+
const offeredRef = useRef(false);
|
|
21
51
|
const handleAllow = async () => {
|
|
52
|
+
snooze();
|
|
22
53
|
try {
|
|
23
54
|
const permission = await Notification.requestPermission();
|
|
24
55
|
if (permission === 'granted') {
|
|
@@ -39,23 +70,29 @@ export function NotificationPermissionPrompt({ messages, autoShowDelayMs = 2000,
|
|
|
39
70
|
console.error(error);
|
|
40
71
|
}
|
|
41
72
|
};
|
|
42
|
-
const handleDismiss = () => {
|
|
43
|
-
if (typeof sessionStorage !== 'undefined') {
|
|
44
|
-
sessionStorage.setItem('notification-prompt-dismissed', 'true');
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
73
|
const show = () => {
|
|
48
|
-
if (typeof
|
|
74
|
+
if (typeof window === 'undefined')
|
|
49
75
|
return;
|
|
50
|
-
|
|
76
|
+
if (!('Notification' in window) || Notification.permission !== 'default')
|
|
77
|
+
return;
|
|
78
|
+
if (isSnoozed() || offeredRef.current)
|
|
79
|
+
return;
|
|
80
|
+
offeredRef.current = true;
|
|
51
81
|
showNotificationToast({
|
|
82
|
+
id: toastId,
|
|
52
83
|
title: msgs.title,
|
|
53
84
|
body: msgs.description,
|
|
54
85
|
type: 'info',
|
|
55
86
|
icon: 'bell',
|
|
56
|
-
duration:
|
|
57
|
-
action: {
|
|
58
|
-
|
|
87
|
+
duration: Infinity,
|
|
88
|
+
action: {
|
|
89
|
+
label: msgs.allowLabel,
|
|
90
|
+
onClick: () => {
|
|
91
|
+
snooze();
|
|
92
|
+
void handleAllow();
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
cancel: { label: msgs.dismissLabel, onClick: () => snooze() },
|
|
59
96
|
});
|
|
60
97
|
};
|
|
61
98
|
useEffect(() => {
|
|
@@ -63,12 +100,9 @@ export function NotificationPermissionPrompt({ messages, autoShowDelayMs = 2000,
|
|
|
63
100
|
return;
|
|
64
101
|
if (!('Notification' in window) || Notification.permission !== 'default')
|
|
65
102
|
return;
|
|
66
|
-
if (
|
|
103
|
+
if (isSnoozed())
|
|
67
104
|
return;
|
|
68
|
-
const timer = setTimeout(
|
|
69
|
-
shownRef.current = true;
|
|
70
|
-
show();
|
|
71
|
-
}, autoShowDelayMs);
|
|
105
|
+
const timer = setTimeout(show, autoShowDelayMs);
|
|
72
106
|
return () => clearTimeout(timer);
|
|
73
107
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
108
|
}, [autoShowDelayMs]);
|
|
@@ -76,12 +110,9 @@ export function NotificationPermissionPrompt({ messages, autoShowDelayMs = 2000,
|
|
|
76
110
|
if (typeof window === 'undefined')
|
|
77
111
|
return;
|
|
78
112
|
const handleTrigger = () => {
|
|
79
|
-
if (
|
|
113
|
+
if (isSnoozed() || offeredRef.current)
|
|
80
114
|
return;
|
|
81
|
-
|
|
82
|
-
sessionStorage.removeItem('notification-prompt-dismissed');
|
|
83
|
-
show();
|
|
84
|
-
}
|
|
115
|
+
show();
|
|
85
116
|
};
|
|
86
117
|
window.addEventListener('show-notification-prompt', handleTrigger);
|
|
87
118
|
return () => window.removeEventListener('show-notification-prompt', handleTrigger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-permission-prompt.js","sourceRoot":"","sources":["../../src/components/notification-permission-prompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"notification-permission-prompt.js","sourceRoot":"","sources":["../../src/components/notification-permission-prompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,18 @@ export interface UpdatePromptProps {
|
|
|
8
8
|
messages?: UpdatePromptMessages;
|
|
9
9
|
/** How long the toast stays before auto-dismissing (ms). Default: 0 (sticky). */
|
|
10
10
|
duration?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Stable Sonner id so concurrent update prompts (SW backup, recovery, etc.)
|
|
13
|
+
* replace this card instead of stacking. Default: `sys:app-update`.
|
|
14
|
+
*/
|
|
15
|
+
toastId?: string | number;
|
|
11
16
|
}
|
|
17
|
+
/** Canonical id shared with host SW/recovery coalescing. */
|
|
18
|
+
export declare const PWA_UPDATE_TOAST_ID = "sys:app-update";
|
|
12
19
|
/**
|
|
13
20
|
* Renders through the shared notification toast instead of its own
|
|
14
21
|
* fixed-position banner, so it stacks with every other app notification
|
|
15
22
|
* rather than competing for a corner of the screen.
|
|
16
23
|
*/
|
|
17
|
-
export declare function PWAUpdatePrompt({ messages, duration }?: UpdatePromptProps): null;
|
|
24
|
+
export declare function PWAUpdatePrompt({ messages, duration, toastId, }?: UpdatePromptProps): null;
|
|
18
25
|
//# sourceMappingURL=update-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-prompt.d.ts","sourceRoot":"","sources":["../../src/components/update-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"update-prompt.d.ts","sourceRoot":"","sources":["../../src/components/update-prompt.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC1B;AASD,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAY,EACZ,OAA6B,GAC9B,GAAE,iBAAsB,QA6BxB"}
|
|
@@ -7,12 +7,14 @@ const DEFAULTS = {
|
|
|
7
7
|
updateLabel: 'Actualizar',
|
|
8
8
|
dismissLabel: 'Después',
|
|
9
9
|
};
|
|
10
|
+
/** Canonical id shared with host SW/recovery coalescing. */
|
|
11
|
+
export const PWA_UPDATE_TOAST_ID = 'sys:app-update';
|
|
10
12
|
/**
|
|
11
13
|
* Renders through the shared notification toast instead of its own
|
|
12
14
|
* fixed-position banner, so it stacks with every other app notification
|
|
13
15
|
* rather than competing for a corner of the screen.
|
|
14
16
|
*/
|
|
15
|
-
export function PWAUpdatePrompt({ messages, duration = 0 } = {}) {
|
|
17
|
+
export function PWAUpdatePrompt({ messages, duration = 0, toastId = PWA_UPDATE_TOAST_ID, } = {}) {
|
|
16
18
|
const { needRefresh, updateApp, closeUpdatePrompt } = usePWAContext();
|
|
17
19
|
const msgs = { ...DEFAULTS, ...messages };
|
|
18
20
|
const shown = useRef(false);
|
|
@@ -21,6 +23,7 @@ export function PWAUpdatePrompt({ messages, duration = 0 } = {}) {
|
|
|
21
23
|
return;
|
|
22
24
|
shown.current = true;
|
|
23
25
|
showNotificationToast({
|
|
26
|
+
id: toastId,
|
|
24
27
|
title: msgs.title,
|
|
25
28
|
body: msgs.description,
|
|
26
29
|
type: 'info',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-prompt.js","sourceRoot":"","sources":["../../src/components/update-prompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"update-prompt.js","sourceRoot":"","sources":["../../src/components/update-prompt.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAoB3C,MAAM,QAAQ,GAAmC;IAC/C,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,kCAAkC;IAC/C,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,SAAS;CACxB,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAEnD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAQ,GAAG,CAAC,EACZ,OAAO,GAAG,mBAAmB,MACR,EAAE;IACvB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAAA;IACrE,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QACzC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QAEpB,qBAAqB,CAAC;YACpB,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,QAAQ,IAAI,QAAQ;YAC9B,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,OAAO,EAAE,SAAS;aACnB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,OAAO,EAAE,iBAAiB;aAC3B;SACF,CAAC,CAAA;QACF,uDAAuD;IACzD,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-pwa",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Metacore PWA helpers — vite plugin wrapper, install/update prompts, push notifications, offline indicator",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"lucide-react": "^1.0.0",
|
|
52
|
-
"@asteby/metacore-notifications": "26.0.
|
|
52
|
+
"@asteby/metacore-notifications": "26.0.1"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@types/react": "^19.0.0",
|