Show actionable warning when card server fetch fails; fix connect-button locale
- Detect likely browser PNA/local-network block via origin-vs-target heuristic
- Show warning mentioning both causes (server down + browser block)
- Fix 'Connect' button resetting to English after failed connect (t('Connect'))
- Fix 'Connection failed:' translation never matching (trailing-space key)
This commit is contained in:
+25
-4
@@ -2648,6 +2648,21 @@ async function pysimFetch(path, body) {
|
|||||||
return await res.json();
|
return await res.json();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pysimTargetSpace() {
|
||||||
|
let h;
|
||||||
|
try { h = new URL(pysimBase).hostname.toLowerCase(); } catch (e) { return 'public'; }
|
||||||
|
if (h === 'localhost' || h === '[::1]' || h === '::1' || /^127\./.test(h)) return 'loopback';
|
||||||
|
if (/^10\./.test(h) || /^192\.168\./.test(h) || /^172\.(1[6-9]|2\d|3[01])\./.test(h)) return 'private';
|
||||||
|
return 'public';
|
||||||
|
}
|
||||||
|
|
||||||
|
function pysimIsLikelyBlocked() {
|
||||||
|
const pagePublic = location.protocol === 'https:'
|
||||||
|
|| !(location.hostname === 'localhost' || /^127\./.test(location.hostname));
|
||||||
|
const s = pysimTargetSpace();
|
||||||
|
return pagePublic && (s === 'loopback' || s === 'private');
|
||||||
|
}
|
||||||
|
|
||||||
function pysimSetConnected(state) {
|
function pysimSetConnected(state) {
|
||||||
const img = document.getElementById('pysim-status-img');
|
const img = document.getElementById('pysim-status-img');
|
||||||
if (state === 'spin') {
|
if (state === 'spin') {
|
||||||
@@ -2694,7 +2709,7 @@ async function pysimRefresh() {
|
|||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
pysimSetConnected(false);
|
pysimSetConnected(false);
|
||||||
statusEl.textContent = t('Connection failed: ') + ' ' + e.message;
|
statusEl.textContent = t('Connection failed:') + ' ' + e.message;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2715,7 +2730,7 @@ async function pysimConnect() {
|
|||||||
const sv = (ver.version || '').split('.').map(Number);
|
const sv = (ver.version || '').split('.').map(Number);
|
||||||
if (sv[0] < 1 || (sv[0] === 1 && sv[1] < 0)) {
|
if (sv[0] < 1 || (sv[0] === 1 && sv[1] < 0)) {
|
||||||
statusEl.innerHTML = '<span class="text-red-500">Server version ' + esc(ver.version) + ' is outdated. Please update pysim-otaman-server.</span>';
|
statusEl.innerHTML = '<span class="text-red-500">Server version ' + esc(ver.version) + ' is outdated. Please update pysim-otaman-server.</span>';
|
||||||
btn.textContent = 'Connect';
|
btn.textContent = t('Connect');
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2746,8 +2761,12 @@ async function pysimConnect() {
|
|||||||
stkCheckMenu();
|
stkCheckMenu();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
pysimSetConnected(false);
|
pysimSetConnected(false);
|
||||||
statusEl.innerHTML = '<span class="text-red-500">' + t('Connection failed: ') + ' ' + esc(e.message) + '</span>';
|
const hint = t(pysimIsLikelyBlocked() ? 'pysim-blocked-hint' : 'pysim-unreachable-hint')
|
||||||
btn.textContent = 'Connect';
|
.replace('{url}', esc(pysimBase));
|
||||||
|
statusEl.innerHTML =
|
||||||
|
'<span class="text-red-500">' + t('Connection failed:') + ' ' + esc(e.message) + '</span>' +
|
||||||
|
'<br><span class="text-sm text-gray-600 dark:text-slate-400">' + hint + '</span>';
|
||||||
|
btn.textContent = t('Connect');
|
||||||
}
|
}
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
}
|
}
|
||||||
@@ -4698,6 +4717,8 @@ const LANG_RU = {
|
|||||||
'Checking card...': 'Проверка карты...',
|
'Checking card...': 'Проверка карты...',
|
||||||
'Connected': 'Подключено',
|
'Connected': 'Подключено',
|
||||||
'Connection failed:': 'Ошибка подключения:',
|
'Connection failed:': 'Ошибка подключения:',
|
||||||
|
'pysim-blocked-hint': 'Браузер, вероятно, заблокировал доступ к локальному серверу карт. Разрешите доступ к локальной сети для этого сайта (Chrome/Edge/Vivaldi: Настройки сайта → Доступ к локальной сети → Разрешить). Также проверьте, что pysim-otaman-server запущен по адресу {url}.',
|
||||||
|
'pysim-unreachable-hint': 'Не удалось подключиться к серверу карт. Проверьте, что pysim-otaman-server запущен и адрес указан верно ({url}). Если эта страница открыта по HTTPS, также разрешите доступ к локальной сети в браузере (Chrome/Edge/Vivaldi: Настройки сайта → Доступ к локальной сети → Разрешить).',
|
||||||
'No card detected. Insert card and click Equip card button': 'Карта не обнаружена. Вставьте карту и нажмите Подключить карту',
|
'No card detected. Insert card and click Equip card button': 'Карта не обнаружена. Вставьте карту и нажмите Подключить карту',
|
||||||
'Checking...': 'Проверка...',
|
'Checking...': 'Проверка...',
|
||||||
'Resetting...': 'Сброс...',
|
'Resetting...': 'Сброс...',
|
||||||
|
|||||||
Reference in New Issue
Block a user