SHA256
Добавить деплой без clean/тестов и доработки PWA/сессии в UI
This commit is contained in:
@@ -48,3 +48,12 @@ export async function listStoredMessages() {
|
||||
req.onerror = () => reject(req.error || new Error('IndexedDB getAll failed'));
|
||||
}));
|
||||
}
|
||||
|
||||
export async function clearStoredMessages() {
|
||||
await new Promise((resolve, reject) => {
|
||||
const request = indexedDB.deleteDatabase(DB_NAME);
|
||||
request.onsuccess = () => resolve();
|
||||
request.onerror = () => reject(request.error || new Error('IndexedDB delete failed'));
|
||||
request.onblocked = () => reject(new Error('IndexedDB delete blocked'));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
let initialized = false;
|
||||
let deferredInstallPrompt = null;
|
||||
const listeners = new Set();
|
||||
|
||||
function notifyAvailability() {
|
||||
const canInstall = Boolean(deferredInstallPrompt);
|
||||
listeners.forEach((listener) => {
|
||||
try {
|
||||
listener(canInstall);
|
||||
} catch {
|
||||
// ignore listener errors
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function initPwaInstallPromptHandling() {
|
||||
if (initialized) return;
|
||||
initialized = true;
|
||||
|
||||
window.addEventListener('beforeinstallprompt', (event) => {
|
||||
event.preventDefault();
|
||||
deferredInstallPrompt = event;
|
||||
notifyAvailability();
|
||||
});
|
||||
|
||||
window.addEventListener('appinstalled', () => {
|
||||
deferredInstallPrompt = null;
|
||||
notifyAvailability();
|
||||
});
|
||||
}
|
||||
|
||||
export function canInstallPwa() {
|
||||
return Boolean(deferredInstallPrompt);
|
||||
}
|
||||
|
||||
export function isStandalonePwaMode() {
|
||||
return (
|
||||
window.matchMedia?.('(display-mode: standalone)')?.matches ||
|
||||
window.navigator?.standalone === true
|
||||
);
|
||||
}
|
||||
|
||||
export async function promptPwaInstall() {
|
||||
if (!deferredInstallPrompt) {
|
||||
return { supported: false, outcome: '' };
|
||||
}
|
||||
|
||||
const promptEvent = deferredInstallPrompt;
|
||||
deferredInstallPrompt = null;
|
||||
notifyAvailability();
|
||||
|
||||
await promptEvent.prompt();
|
||||
const choice = await promptEvent.userChoice;
|
||||
return {
|
||||
supported: true,
|
||||
outcome: String(choice?.outcome || ''),
|
||||
};
|
||||
}
|
||||
|
||||
export function onPwaInstallAvailabilityChange(handler) {
|
||||
if (typeof handler !== 'function') return () => {};
|
||||
listeners.add(handler);
|
||||
return () => {
|
||||
listeners.delete(handler);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user