import { createTopBar } from '../components/topbar.js'; import { state } from '../state.js'; import { loadEncryptedUserSecrets } from '../services/key-vault.js'; export const pageMeta = { id: 'connect-device-view', title: 'Подключить устройство' }; export function render({navigate, chrome}) { const screen = document.createElement('section'); screen.className = 'stack'; chrome?.setTopbar(createTopBar({ title: 'Подключить устройство', back: { label: '←', onClick: () => navigate('device-view') }, })); const card = document.createElement('div'); card.className = 'card stack'; card.innerHTML = `

Что будет передано

Новое устройство автоматически получит ключ доступа и ключ блокчейна.

Ключ восстановления никогда не передаётся и не сохраняется на устройствах.

Проверяем ключи на этом устройстве...

`; const statusEl = card.querySelector('#connect-keys-status'); const openQrBtn = card.querySelector('#open-qr'); const openPairBtn = card.querySelector('#open-pairing'); const helpModal = document.createElement('div'); helpModal.className = 'modal-shell'; helpModal.hidden = true; helpModal.innerHTML = ` `; const openHelp = () => { helpModal.hidden = false; helpModal.querySelector('.modal-dialog')?.focus(); }; const closeHelp = () => { helpModal.hidden = true; }; card.querySelector('#tech-help').addEventListener('click', openHelp); card.querySelector('#open-qr').addEventListener('click', () => navigate('device-qr-view')); card.querySelector('#open-pairing').addEventListener('click', () => navigate('device-pairing-view')); card.querySelector('#open-camera').addEventListener('click', () => navigate('device-camera-view')); (async () => { try { if (!state.session.login || !state.session.storagePwdInMemory) { throw new Error('Нет активной сессии'); } const savedKeys = await loadEncryptedUserSecrets(state.session.login, state.session.storagePwdInMemory); const hasBlockchain = Boolean(savedKeys.blockchainKey); const hasClient = Boolean(savedKeys.clientKey); const ready = hasBlockchain && hasClient; openQrBtn.disabled = !ready; openPairBtn.disabled = !ready; statusEl.textContent = ready ? 'Ключ доступа и ключ блокчейна готовы к безопасной передаче.' : 'На этом устройстве не хватает рабочих ключей. Выполните вход по паролю заново.'; } catch { openQrBtn.disabled = true; openPairBtn.disabled = true; statusEl.textContent = 'Не удалось прочитать рабочие ключи на этом устройстве.'; } })(); helpModal.addEventListener('click', (event) => { const target = event.target; if (target instanceof HTMLElement && target.dataset.close === 'true') closeHelp(); }); helpModal.addEventListener('keydown', (event) => { if (event.key === 'Escape') closeHelp(); }); screen.append(card); const modalRoot = document.getElementById('modal-root'); modalRoot?.append(helpModal); screen.cleanup = () => { helpModal.remove(); }; return screen; }