import { renderHeader } from '../components/header.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 }) { const screen = document.createElement('section'); screen.className = 'stack'; screen.append( renderHeader({ title: 'Подключить устройство', leftAction: { label: '←', onClick: () => navigate('device-view') }, }), ); const card = document.createElement('div'); card.className = 'card stack'; card.innerHTML = `

Выберите, какие ключи передать на подключаемое устройство

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

`; const rootToggle = card.querySelector('#connect-root'); const blockchainToggle = card.querySelector('#connect-blockchain'); const deviceToggle = card.querySelector('#connect-device'); const statusEl = card.querySelector('#connect-keys-status'); const openQrBtn = card.querySelector('#open-qr'); const openPairBtn = card.querySelector('#open-pairing'); deviceToggle.checked = true; rootToggle.addEventListener('change', () => { state.deviceConnect.root = rootToggle.checked; }); blockchainToggle.addEventListener('change', () => { state.deviceConnect.blockchain = blockchainToggle.checked; }); deviceToggle.addEventListener('change', () => { state.deviceConnect.device = true; deviceToggle.checked = true; }); 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 hasRoot = Boolean(savedKeys.rootKey); const hasBlockchain = Boolean(savedKeys.blockchainKey); const hasDevice = Boolean(savedKeys.deviceKey); rootToggle.disabled = !hasRoot; blockchainToggle.disabled = !hasBlockchain; deviceToggle.disabled = true; state.deviceConnect.root = hasRoot && rootToggle.checked; state.deviceConnect.blockchain = hasBlockchain && blockchainToggle.checked; state.deviceConnect.device = hasDevice; rootToggle.checked = state.deviceConnect.root; blockchainToggle.checked = state.deviceConnect.blockchain; deviceToggle.checked = hasDevice; openQrBtn.disabled = !hasDevice; openPairBtn.disabled = !hasDevice; const available = [ hasDevice ? 'device' : '', hasBlockchain ? 'blockchain' : '', hasRoot ? 'root' : '', ].filter(Boolean); statusEl.textContent = available.length ? `На этом устройстве доступны: ${available.join(', ')}.` : 'На этом устройстве нет сохранённых ключей для передачи.'; } catch { rootToggle.disabled = true; blockchainToggle.disabled = true; deviceToggle.checked = false; state.deviceConnect.root = false; state.deviceConnect.blockchain = false; state.deviceConnect.device = false; 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, helpModal); return screen; }