import { renderHeader } from '../components/header.js'; import { addAppLogEntry, authService, closeCurrentSessionAndSignOut, state } from '../state.js'; import { canInstallPwa, isStandalonePwaMode, onPwaInstallAvailabilityChange, promptPwaInstall, } from '../services/pwa-install-service.js'; import { initPwaPush } from '../services/pwa-push-service.js'; export const pageMeta = { id: 'settings-view', title: 'Настройки' }; export function render({ navigate }) { const screen = document.createElement('section'); screen.className = 'stack'; screen.append( renderHeader({ title: 'Настройки', leftAction: { label: '←', onClick: () => navigate('profile-view') }, }), ); const card = document.createElement('div'); card.className = 'card stack'; card.innerHTML = ` `; card.querySelector('#settings-device').addEventListener('click', () => navigate('device-view')); card.querySelector('#settings-servers').addEventListener('click', () => navigate('server-settings-view')); card.querySelector('#settings-language').addEventListener('click', () => navigate('language-view')); card.querySelector('#settings-app-log').addEventListener('click', () => navigate('app-log-view')); const signOutBtn = card.querySelector('#settings-signout'); const pwaInstallBtn = card.querySelector('#settings-pwa-install'); const syncPwaButtonLabel = () => { if (isStandalonePwaMode()) { pwaInstallBtn.textContent = 'PWA установлено (проверить WebPush)'; return; } if (canInstallPwa()) { pwaInstallBtn.textContent = 'Зарегистрировать PWA'; return; } pwaInstallBtn.textContent = 'Как установить PWA'; }; const unsubscribeInstallAvailability = onPwaInstallAvailabilityChange(() => { syncPwaButtonLabel(); }); syncPwaButtonLabel(); signOutBtn.addEventListener('click', async () => { const confirmed = window.confirm( 'Завершить текущую сессию на сервере, отключиться, очистить локальные данные и перейти на стартовый экран?' ); if (!confirmed) return; signOutBtn.disabled = true; try { addAppLogEntry({ level: 'info', source: 'session', message: `Запрошено завершение текущей сессии: ${state.session.sessionId || 'unknown'}`, }); await closeCurrentSessionAndSignOut({ infoMessage: 'Сеанс завершён. Выполните вход заново.', }); } finally { signOutBtn.disabled = false; } }); pwaInstallBtn.addEventListener('click', async () => { pwaInstallBtn.disabled = true; try { await initPwaPush({ authService, onLog: (entry) => addAppLogEntry(entry), }); if (canInstallPwa()) { const result = await promptPwaInstall(); const accepted = result.outcome === 'accepted'; addAppLogEntry({ level: 'info', source: 'pwa-install', message: accepted ? 'Пользователь принял установку PWA' : 'Пользователь отклонил установку PWA', details: { outcome: result.outcome || 'unknown' }, }); if (accepted) { window.alert('Установка PWA подтверждена. Проверьте приложение на главном экране устройства.'); } } else if (!isStandalonePwaMode()) { window.alert('Для установки откройте меню браузера и выберите "Установить приложение" или "Добавить на главный экран".'); } else { window.alert('PWA уже установлено. WebPush перерегистрирован.'); } } catch (error) { addAppLogEntry({ level: 'warn', source: 'pwa-install', message: 'Не удалось зарегистрировать PWA/WebPush', details: { error: error?.message || 'unknown' }, }); window.alert(`Ошибка регистрации PWA: ${error?.message || 'unknown'}`); } finally { pwaInstallBtn.disabled = false; syncPwaButtonLabel(); } }); screen.append(card); screen.cleanup = () => { unsubscribeInstallAvailability(); }; return screen; }