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 = `
Техсправка
client key (ключ доступа) передаётся всегда
blockchain key (ключ блокчейна) передаётся всегда
root/recovery private key никогда не передаётся
QR-сценарий передаёт рабочие ключи напрямую между устройствами
для сценария через сервер используйте кнопку «Подключить по коду»
`;
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;
}