mirror of
https://github.com/screentinker/screentinker.git
synced 2026-08-15 23:03:14 -06:00
feat(dashboard): version loading indicator + immediate first poll (#181)
* feat(dashboard): show version loading indicator and fire poll immediately - Show "Verificando..." while /api/version resolves on first load - Fire first version poll immediately instead of waiting 15s - Fallback to "-" when version is unavailable * i18n: localize the version-check loading label The sidebar version indicator hard-coded the Spanish string 'Verificando...', shipping it to every user regardless of locale. Route it through i18n instead: new 'common.checking' key (en: 'Checking...', es: 'Verificando...'); all other locales fall back to the English canonical, matching the rest of the UI. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: ScreenTinker <hello@screentinker.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f10373551f
commit
87a1e02ff3
|
|
@ -570,10 +570,15 @@ let knownHash = null;
|
||||||
export function updateVersionIndicator({ version, latest_version, update_available }) {
|
export function updateVersionIndicator({ version, latest_version, update_available }) {
|
||||||
const label = document.getElementById('versionLabel');
|
const label = document.getElementById('versionLabel');
|
||||||
const badge = document.getElementById('versionBadge');
|
const badge = document.getElementById('versionBadge');
|
||||||
if (label) label.textContent = version ? 'v' + version : '';
|
if (label) label.textContent = version ? 'v' + version : '-';
|
||||||
if (badge) badge.hidden = !update_available;
|
if (badge) badge.hidden = !update_available;
|
||||||
}
|
}
|
||||||
setInterval(async () => {
|
|
||||||
|
// Show loading state while first poll resolves
|
||||||
|
const verLabel = document.getElementById('versionLabel');
|
||||||
|
if (verLabel) verLabel.textContent = t('common.checking');
|
||||||
|
|
||||||
|
async function checkVersion() {
|
||||||
try {
|
try {
|
||||||
const res = await fetch('/api/version');
|
const res = await fetch('/api/version');
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
@ -590,7 +595,9 @@ setInterval(async () => {
|
||||||
}
|
}
|
||||||
updateVersionIndicator(data);
|
updateVersionIndicator(data);
|
||||||
} catch {}
|
} catch {}
|
||||||
}, 15000);
|
}
|
||||||
|
checkVersion(); // Fire first poll immediately
|
||||||
|
setInterval(checkVersion, 15000);
|
||||||
|
|
||||||
// Session timeout warning - check JWT expiry every minute
|
// Session timeout warning - check JWT expiry every minute
|
||||||
if (isAuthenticated()) {
|
if (isAuthenticated()) {
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ export default {
|
||||||
'common.saving': 'Saving...',
|
'common.saving': 'Saving...',
|
||||||
'common.deleting': 'Deleting...',
|
'common.deleting': 'Deleting...',
|
||||||
'common.loading': 'Loading...',
|
'common.loading': 'Loading...',
|
||||||
|
'common.checking': 'Checking...',
|
||||||
'confirm_delete.type_label': 'Type "{name}" to confirm',
|
'confirm_delete.type_label': 'Type "{name}" to confirm',
|
||||||
'confirm_delete.failed': 'Action failed',
|
'confirm_delete.failed': 'Action failed',
|
||||||
'common.connected': 'Connected',
|
'common.connected': 'Connected',
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ export default {
|
||||||
'common.edit': 'Editar',
|
'common.edit': 'Editar',
|
||||||
'common.done': 'Listo',
|
'common.done': 'Listo',
|
||||||
'common.loading': 'Cargando...',
|
'common.loading': 'Cargando...',
|
||||||
|
'common.checking': 'Verificando...',
|
||||||
'common.connected': 'Conectado',
|
'common.connected': 'Conectado',
|
||||||
'common.disconnected': 'Desconectado',
|
'common.disconnected': 'Desconectado',
|
||||||
'common.never': 'Nunca',
|
'common.never': 'Nunca',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue