diff --git a/package.json b/package.json
index 599d90d..bf5798d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "multi-hoster-uploader",
- "version": "1.9.7",
+ "version": "1.9.8",
"description": "Upload files to doodstream, voe, vidmoly, byse simultaneously",
"main": "main.js",
"scripts": {
diff --git a/renderer/app.js b/renderer/app.js
index f48ae30..abb6904 100644
--- a/renderer/app.js
+++ b/renderer/app.js
@@ -144,7 +144,7 @@ function getAvailableHosters() {
const hoster = config.hosters[name] || {};
return { name, hoster, hasCreds: hosterHasCredentials(name, hoster) };
})
- .filter(item => item.hasCreds);
+ .filter(item => item.hasCreds && item.hoster.enabled !== false);
}
function syncSelectedUploadHosters() {
@@ -2148,23 +2148,27 @@ function renderAccounts() {
}
container.innerHTML = accounts.map(({ name, hoster }) => {
+ const isDisabled = hoster.enabled === false;
const st = accountStatuses[name] || { status: 'unchecked', message: '' };
const statusLabels = { ok: 'Bereit', warn: 'Warnung', checking: 'Prüfe...', error: 'Fehler', unchecked: 'Nicht geprüft' };
- const statusLabel = statusLabels[st.status] || 'Nicht geprüft';
+ const statusLabel = isDisabled ? 'Deaktiviert' : (statusLabels[st.status] || 'Nicht geprüft');
+ const statusClass = isDisabled ? 'disabled' : st.status;
const credLabel = getCredentialLabel(name, hoster);
+ const toggleLabel = isDisabled ? 'Aktivieren' : 'Deaktivieren';
return `
-
+
${escapeHtml(getAccountDisplayName(name, hoster))}
-
${escapeHtml(credLabel)}${st.message ? ` • ${escapeHtml(st.message)}` : ''}
+
${escapeHtml(credLabel)}${st.message && !isDisabled ? ` • ${escapeHtml(st.message)}` : ''}
-
+
${statusLabel}
-
+
+
@@ -2172,6 +2176,9 @@ function renderAccounts() {
}).join('');
// Wire up buttons
+ container.querySelectorAll('[data-account-toggle]').forEach(btn => {
+ btn.addEventListener('click', () => toggleAccount(btn.dataset.accountToggle));
+ });
container.querySelectorAll('[data-account-edit]').forEach(btn => {
btn.addEventListener('click', () => openAccountModal(btn.dataset.accountEdit));
});
@@ -2183,6 +2190,20 @@ function renderAccounts() {
});
}
+async function toggleAccount(hosterName) {
+ const hosters = { ...config.hosters };
+ const hoster = { ...hosters[hosterName] };
+ hoster.enabled = hoster.enabled === false ? true : false;
+ hosters[hosterName] = hoster;
+ await window.api.saveConfig({ hosters });
+ config = await window.api.getConfig();
+ syncSelectedUploadHosters();
+ renderAccounts();
+ renderHosterSummary();
+ renderHosterModal();
+ renderSettings();
+}
+
async function checkSingleAccount(hosterName) {
if (!hosterName || healthCheckRunning) return;
healthCheckRunning = true;
diff --git a/renderer/styles.css b/renderer/styles.css
index 25afe2d..15c24c2 100644
--- a/renderer/styles.css
+++ b/renderer/styles.css
@@ -785,6 +785,9 @@ body {
.account-status.status-error { background: rgba(231, 76, 60, 0.2); color: var(--danger); }
.account-status.status-warn { background: rgba(240, 195, 108, 0.2); color: var(--warning); }
.account-status.status-unchecked { background: rgba(255, 255, 255, 0.05); color: var(--text-dim); }
+.account-status.status-disabled { background: rgba(255, 255, 255, 0.05); color: var(--text-muted); }
+.account-card.account-disabled { opacity: 0.5; }
+.account-card.account-disabled:hover { opacity: 0.7; }
.account-status-dot {
width: 7px;