Добавить деплой без clean/тестов и доработки PWA/сессии в UI

This commit is contained in:
AidarKC
2026-04-20 20:33:20 +03:00
parent bec1d08757
commit 2d48ae7a16
8 changed files with 404 additions and 4 deletions
+9
View File
@@ -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);
};
}