diff --git a/lib/speed-history.js b/lib/speed-history.js
index 68f0143..881cdf0 100644
--- a/lib/speed-history.js
+++ b/lib/speed-history.js
@@ -1,6 +1,10 @@
(function (root) {
'use strict';
+ function createInitialSpeedHistoryState() {
+ return { display: 0, history: [0, 0] };
+ }
+
function updateSpeedHistory(state, target, maxSamples = 160) {
const nextTarget = Number.isFinite(Number(target)) ? Math.max(0, Number(target)) : 0;
const previous = Number.isFinite(Number(state.display)) ? Math.max(0, Number(state.display)) : 0;
@@ -14,7 +18,7 @@
return state;
}
- const api = { updateSpeedHistory };
+ const api = { updateSpeedHistory, createInitialSpeedHistoryState };
if (typeof module !== 'undefined' && module.exports) module.exports = api;
else if (root) root.SpeedHistory = api;
})(typeof window !== 'undefined' ? window : this);
diff --git a/lib/startup-renderer.js b/lib/startup-renderer.js
index aea6694..e6dff20 100644
--- a/lib/startup-renderer.js
+++ b/lib/startup-renderer.js
@@ -8,6 +8,11 @@ function resolveStartupLanguage(config) {
return config && config.globalSettings && config.globalSettings.language === 'de' ? 'de' : 'en';
}
+function createStartupQuery(config, version) {
+ const normalizedVersion = /^\d+\.\d+\.\d+$/.test(String(version || '').trim()) ? String(version).trim() : '';
+ return { language: resolveStartupLanguage(config), version: normalizedVersion };
+}
+
function createStartupWindow(BrowserWindow, options) {
const window = new BrowserWindow({ ...options, show: false });
window.once('ready-to-show', () => {
@@ -22,4 +27,4 @@ function createStartupWindow(BrowserWindow, options) {
};
}
-module.exports = { configureStartupRenderer, createStartupWindow, resolveStartupLanguage };
+module.exports = { configureStartupRenderer, createStartupWindow, resolveStartupLanguage, createStartupQuery };
diff --git a/main.js b/main.js
index 5c9848a..b220a37 100644
--- a/main.js
+++ b/main.js
@@ -1,7 +1,7 @@
process.env.UV_THREADPOOL_SIZE = process.env.UV_THREADPOOL_SIZE || '8';
const { monitorEventLoopDelay, PerformanceObserver } = require('perf_hooks');
const { app, BrowserWindow, ipcMain, dialog, clipboard, nativeTheme, Tray, Menu, nativeImage } = require('electron');
-const { configureStartupRenderer, createStartupWindow, resolveStartupLanguage } = require('./lib/startup-renderer');
+const { configureStartupRenderer, createStartupWindow, createStartupQuery } = require('./lib/startup-renderer');
configureStartupRenderer(app);
nativeTheme.themeSource = 'dark';
const path = require('path');
@@ -1508,12 +1508,12 @@ function createWindow() {
debugLog(`CHILD PROCESS GONE: type=${details.type} reason=${details.reason} exitCode=${details.exitCode}`);
});
- let startupLanguage = 'en';
- try { startupLanguage = resolveStartupLanguage(configStore.load()); } catch {}
+ let startupQuery = createStartupQuery(null, app.getVersion());
+ try { startupQuery = createStartupQuery(configStore.load(), app.getVersion()); } catch {}
startupWindow.load(path.join(__dirname, 'renderer', 'index.html'), (err) => {
_writeCrashLog('LOAD FILE FAILED', err);
debugLog(`LOAD FILE FAILED: ${err && err.stack ? err.stack : err}`);
- }, { query: { language: startupLanguage } });
+ }, { query: startupQuery });
}
function createTray() {
@@ -1652,7 +1652,7 @@ app.whenReady().then(async () => {
}
} catch {}
- setTimeout(() => { void runAutomaticUpdateCheck(true); }, 3000);
+ void runAutomaticUpdateCheck(true);
updateCheckInterval = setInterval(() => { void runAutomaticUpdateCheck(true); }, 5 * 60 * 1000);
updateCheckInterval.unref?.();
});
diff --git a/renderer/app.js b/renderer/app.js
index f6b347e..708ee6d 100644
--- a/renderer/app.js
+++ b/renderer/app.js
@@ -309,7 +309,7 @@ let settingsBaseline = '';
let settingsDirty = false;
let settingsSaving = false;
let lastUploadStats = { state: 'idle', globalSpeedKbs: 0, totalBytes: 0, elapsed: 0, activeJobs: 0 };
-const uploadSpeedState = { display: 0, history: [] };
+const uploadSpeedState = window.SpeedHistory.createInitialSpeedHistoryState();
let uploadSpeedTimer = null;
const AUTO_CHECK_PREF_KEY = 'autoHealthCheckBeforeUpload';
const QUEUE_COL_WIDTHS_KEY = 'queueColumnWidthsPx';
@@ -417,7 +417,6 @@ async function init() {
renderAccounts();
setupListeners();
importEntryCoordinator.ready();
- initUploadSpeedSparkline();
restoreQueueColumnWidths();
loadHistory();
_refreshSessionFailedSnapshot();
@@ -808,7 +807,6 @@ function _syncHeaderUpdateState() {
? `Update v${version || 'unbekannt'} verfügbar. Klicken zum Installieren.`
: 'Nach Aktualisierungen suchen';
if (button) {
- button.hidden = !available;
button.classList.toggle('update-available', available);
button.classList.toggle('is-checking', _updateCheckBusy);
button.disabled = _updateCheckBusy;
@@ -4195,6 +4193,14 @@ function initUploadSpeedSparkline() {
window.addEventListener('beforeunload', () => window.clearInterval(uploadSpeedTimer), { once: true });
}
+function initializeStaticHeader() {
+ const version = new URLSearchParams(window.location.search).get('version') || '';
+ const versionLabel = document.getElementById('versionLabel');
+ if (versionLabel && /^\d+\.\d+\.\d+$/.test(version)) versionLabel.textContent = `v${version}`;
+ initUploadSpeedSparkline();
+ _syncHeaderUpdateState();
+}
+
function updateStatusBar() {
const stats = _computeQueueStats();
@@ -8116,6 +8122,7 @@ function updateStatsPanel() {
window.api.onUpdateAvailable(showUpdateBanner);
window.api.onUpdateProgress(handleUpdateProgress);
window.api.onPrepareClose(prepareForWindowClose);
+initializeStaticHeader();
setupDragDrop();
init().then(() => {
window.api.signalCloseHandshakeReady();
diff --git a/renderer/index.html b/renderer/index.html
index ce1c85d..537a915 100644
--- a/renderer/index.html
+++ b/renderer/index.html
@@ -58,7 +58,7 @@
0 B/s
-