diff --git a/Dev_Docs/Pending_Features/2026-06-14_2035_ui_подключение_по_коду.md b/Dev_Docs/Pending_Features/2026-06-14_2035_ui_подключение_по_коду.md index 92c0d3d..5d326d1 100644 --- a/Dev_Docs/Pending_Features/2026-06-14_2035_ui_подключение_по_коду.md +++ b/Dev_Docs/Pending_Features/2026-06-14_2035_ui_подключение_по_коду.md @@ -16,6 +16,8 @@ - с передачей выбранных ключей; - убедиться, что новое устройство реально входит в аккаунт и сохраняет нужные ключи; - отдельно проверить отклонение заявки и истечение TTL. + - при отклонении заявки убедиться, что на новом устройстве сразу исчезает карточка со старым 7-значным кодом и остаётся только сообщение об отклонении; + - убедиться, что экран `Войти` больше не показывает неработающую QR-заглушку сверху. - ожидаемый результат: - новое устройство получает код, доверённое устройство видит ту же заявку и может её подтвердить или отклонить; diff --git a/VERSION.properties b/VERSION.properties index f9a0d9b..d88584a 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.198 -server.version=1.2.187 +client.version=1.2.199 +server.version=1.2.188 diff --git a/shine-UI/js/app.js b/shine-UI/js/app.js index 2ca07f7..d798963 100644 --- a/shine-UI/js/app.js +++ b/shine-UI/js/app.js @@ -40,9 +40,9 @@ import * as registrationKeysView from './pages/registration-keys-view.js'; import * as registrationDraftKeysView from './pages/registration-draft-keys-view.js'; import * as topupView from './pages/topup-view.js'; import * as devnetTopupView from './pages/devnet-topup-view.js'; -import * as loginView from './pages/login-view.js?v=202606142055'; +import * as loginView from './pages/login-view.js?v=202606150110'; import * as loginCameraView from './pages/login-camera-view.js'; -import * as loginOtherDeviceView from './pages/login-other-device-view.js?v=202606150010'; +import * as loginOtherDeviceView from './pages/login-other-device-view.js?v=202606150110'; import * as loginPasswordView from './pages/login-password-view.js'; import * as keyStorageView from './pages/key-storage-view.js'; diff --git a/shine-UI/js/pages/login-other-device-view.js b/shine-UI/js/pages/login-other-device-view.js index cea7200..40cc7ae 100644 --- a/shine-UI/js/pages/login-other-device-view.js +++ b/shine-UI/js/pages/login-other-device-view.js @@ -44,6 +44,14 @@ function formatExpiresAt(ms) { return new Date(ts).toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit', second: '2-digit' }); } +function resetCodeCard(resultWrap, shortCodeEl, statusHintEl, onlineHintEl, expireHintEl) { + resultWrap.style.display = 'none'; + shortCodeEl.textContent = '0000000'; + statusHintEl.textContent = 'Покажите этот код на уже подключённом устройстве в разделе «Подключить по коду».'; + onlineHintEl.textContent = ''; + expireHintEl.textContent = ''; +} + export function render({ navigate }) { const screen = document.createElement('section'); screen.className = 'stack'; @@ -161,16 +169,18 @@ export function render({ navigate }) { } if (stateValue === 'rejected') { stopPolling(); + activePairingId = ''; startBtn.disabled = false; + resetCodeCard(resultWrap, shortCodeEl, statusHintEl, onlineHintEl, expireHintEl); setStatus(status, 'Подключение отклонено на доверенном устройстве.', 'error'); - statusHintEl.textContent = 'Заявка отклонена. Можно попробовать снова.'; return; } if (stateValue === 'expired') { stopPolling(); + activePairingId = ''; startBtn.disabled = false; + resetCodeCard(resultWrap, shortCodeEl, statusHintEl, onlineHintEl, expireHintEl); setStatus(status, 'Время ожидания истекло. Получите новый код.', 'error'); - statusHintEl.textContent = 'Заявка истекла. Создайте новую заявку.'; return; } schedulePoll(); @@ -205,8 +215,9 @@ export function render({ navigate }) { setAuthError(''); setAuthInfo(''); setStatus(status, 'Проверяем пользователя и создаём pairing-заявку...', 'info'); - resultWrap.style.display = 'none'; stopPolling(); + activePairingId = ''; + resetCodeCard(resultWrap, shortCodeEl, statusHintEl, onlineHintEl, expireHintEl); try { await authService.reconnect(state.entrySettings.shineServer); diff --git a/shine-UI/js/pages/login-view.js b/shine-UI/js/pages/login-view.js index 7912de8..6674476 100644 --- a/shine-UI/js/pages/login-view.js +++ b/shine-UI/js/pages/login-view.js @@ -2,40 +2,10 @@ import { renderHeader } from '../components/header.js'; export const pageMeta = { id: 'login-view', title: 'Войти', showAppChrome: false }; -function createQrCode() { - const svgNS = 'http://www.w3.org/2000/svg'; - const svg = document.createElementNS(svgNS, 'svg'); - svg.setAttribute('viewBox', '0 0 100 100'); - svg.classList.add('qr-code'); - - const cells = [ - [6, 6, 22, 22], [72, 6, 22, 22], [6, 72, 22, 22], [14, 14, 6, 6], [80, 14, 6, 6], [14, 80, 6, 6], - [38, 12, 8, 8], [52, 12, 8, 8], [38, 26, 8, 8], [52, 26, 8, 8], [32, 40, 10, 10], [48, 40, 10, 10], - [64, 40, 10, 10], [40, 56, 8, 8], [56, 56, 8, 8], [72, 56, 8, 8], [32, 72, 8, 8], [48, 72, 8, 8], - [64, 72, 8, 8], [48, 86, 8, 8], - ]; - - cells.forEach(([x, y, width, height]) => { - const rect = document.createElementNS(svgNS, 'rect'); - rect.setAttribute('x', x); - rect.setAttribute('y', y); - rect.setAttribute('width', width); - rect.setAttribute('height', height); - rect.setAttribute('rx', '2'); - svg.append(rect); - }); - - return svg; -} - export function render({ navigate }) { const screen = document.createElement('section'); screen.className = 'stack'; - const qrCard = document.createElement('div'); - qrCard.className = 'card stack qr-card'; - qrCard.append(createQrCode()); - const cameraButton = document.createElement('button'); cameraButton.className = 'primary-btn'; cameraButton.type = 'button'; @@ -69,7 +39,6 @@ export function render({ navigate }) { title: 'Войти', leftAction: { label: '←', onClick: () => navigate('start-view') }, }), - qrCard, actions, backButton, );