Проблема с добавлением приложения на главный экран телефона
Всем привет! Пишу webapp приложение на Python, aiogram. Возникла проблема с кнопкой "добавить на главный экран". Никак не могу понять, почему она не работает и вообще никак не реагирует на нажатие. Кто-то сталкивался с таким? Как это можно исправить?
мой main.js:
document.addEventListener("DOMContentLoaded", function () {
// Переключение панели фильтров
const filterToggle = document.getElementById("filter-toggle");
const filterPanel = document.getElementById("filter-panel");
if (filterToggle && filterPanel) {
filterToggle.addEventListener("click", function () {
filterPanel.classList.toggle("d-none");
});
}
// Открытие/закрытие выезжающего меню (гамбургер)
const hamburgerMenu = document.getElementById("hamburger-menu");
const sideMenu = document.getElementById("side-menu");
const closeSideMenu = document.getElementById("close-side-menu");
if (hamburgerMenu && sideMenu) {
hamburgerMenu.addEventListener("click", function () {
sideMenu.classList.add("open");
});
}
if (closeSideMenu) {
closeSideMenu.addEventListener("click", function () {
sideMenu.classList.remove("open");
});
}
// Кнопка "Наверх"
const backToTop = document.getElementById("back-to-top");
if (backToTop) {
window.addEventListener("scroll", function () {
if (window.scrollY > 300) {
backToTop.style.display = "flex";
} else {
backToTop.style.display = "none";
}
});
backToTop.addEventListener("click", function () {
window.scrollTo({ top: 0, behavior: "smooth" });
});
}
// PWA установка - улучшенная логика
let deferredPrompt;
const addToHomeBtn = document.getElementById("add-to-home-btn");
if (addToHomeBtn) {
// По умолчанию скрываем кнопку
addToHomeBtn.style.display = "none";
// Событие beforeinstallprompt вызывается, если приложение
// может быть установлено и не установлено
window.addEventListener('beforeinstallprompt', (e) => {
// Предотвращаем стандартное поведение
e.preventDefault();
// Сохраняем событие
deferredPrompt = e;
// Показываем кнопку установки
addToHomeBtn.style.display = "flex";
console.log('beforeinstallprompt event fired');
});
// Добавляем обработчик события клика только один раз
addToHomeBtn.addEventListener('click', async () => {
if (!deferredPrompt) {
console.log('No installation prompt available');
return;
}
console.log('Install button clicked');
// Показываем диалог установки
deferredPrompt.prompt();
// Ждем выбора пользователя
const { outcome } = await deferredPrompt.userChoice;
console.log(`User response: ${outcome}`);
// Больше не используем событие
deferredPrompt = null;
// Скрываем кнопку после выбора пользователя
addToHomeBtn.style.display = "none";
});
// Проверяем, не установлено ли уже приложение
window.addEventListener('appinstalled', (evt) => {
console.log('App was installed');
addToHomeBtn.style.display = "none";
});
}
// Обновление placeholder для поля адреса в зависимости от способа доставки
const deliveryMethodSelect = document.getElementById("delivery_method");
const deliveryAddressInput = document.getElementById("deliveryAddress");
if (deliveryMethodSelect && deliveryAddressInput) {
deliveryMethodSelect.addEventListener("change", function () {
if (this.value === "cdek") {
deliveryAddressInput.placeholder = "Введите адрес пункта СДЭК";
} else if (this.value === "post") {
deliveryAddressInput.placeholder = "Введите адрес отделения Почты России";
}
});
}
// Регистрация Service Worker
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('service-worker.js')
.then(function (registration) {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
})
.catch(function (err) {
console.log('ServiceWorker registration failed: ', err);
});
});
}
});
manifest.json:
{
"short_name": "ShopBot",
"name": "Shop Bot WebApp",
"icons": [
{
"src": "/static/images/WU2_classic.png",
"type": "image/png",
"sizes": "192x192",
"purpose": "any"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#007bff",
"background_color": "#ffffff",
"orientation": "portrait",
"scope": "/",
"description": "Удобное приложение для покупок через бота"
}
service-worker.js:
const CACHE_NAME = 'shopbot-cache-v1';
const urlsToCache = [
'/',
'/static/css/style.css',
'/static/js/main.js',
];
self.addEventListener('install', function (event) {
event.waitUntil(
caches.open(CACHE_NAME)
.then(function (cache) {
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function (event) {
event.respondWith(
caches.match(event.request)
.then(function (response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
сама кнопка в html:
<button id="add-to-home-btn" class="pwa-install-button" style="display: none;">
<i class="fas fa-download"></i>
</button>