diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index a577e17..f1e8f41 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Link-Hervorhebungsfarben anpassen", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Jetzt aktualisieren", + "description": "Update now button text" + }, + "updating": { + "message": "Aktualisiere...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "Filterliste erfolgreich aktualisiert!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Aktualisierung fehlgeschlagen. Bitte erneut versuchen.", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 4f21782..5e99fd9 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Customize link highlighting colors", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Update Now", + "description": "Update now button text" + }, + "updating": { + "message": "Updating...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "Filterlist updated successfully!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Update failed. Please try again.", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 27eb687..a942a85 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Personaliza los colores de resaltado de enlaces", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Actualizar ahora", + "description": "Update now button text" + }, + "updating": { + "message": "Actualizando...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "¡Lista de filtros actualizada correctamente!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Error en la actualización. Inténtalo de nuevo.", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 67dd437..a21bffc 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Personnaliser les couleurs de mise en évidence des liens", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Mettre à jour maintenant", + "description": "Update now button text" + }, + "updating": { + "message": "Mise à jour...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "Liste de filtres mise à jour avec succès !", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Échec de la mise à jour. Veuillez réessayer.", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 88c422e..1f6d92d 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "リンクハイライトの色をカスタマイズ", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "今すぐ更新", + "description": "Update now button text" + }, + "updating": { + "message": "更新中...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "フィルターリストが正常に更新されました!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "更新に失敗しました。もう一度お試しください。", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/pt/messages.json b/src/_locales/pt/messages.json index d633c53..cb8c78e 100644 --- a/src/_locales/pt/messages.json +++ b/src/_locales/pt/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Personalizar cores de destaque de links", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Atualizar agora", + "description": "Update now button text" + }, + "updating": { + "message": "Atualizando...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "Lista de filtros atualizada com sucesso!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Falha na atualização. Tente novamente.", + "description": "Filterlist update failed message" } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index ffefaff..321b6e0 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -354,5 +354,21 @@ "welcomeStep3Item5": { "message": "Настройте цвета подсветки ссылок", "description": "Welcome step 3 item 5" + }, + "updateNow": { + "message": "Обновить сейчас", + "description": "Update now button text" + }, + "updating": { + "message": "Обновление...", + "description": "Updating status text" + }, + "filterlistUpdated": { + "message": "Список фильтров успешно обновлён!", + "description": "Filterlist update success message" + }, + "updateFailed": { + "message": "Ошибка обновления. Попробуйте ещё раз.", + "description": "Filterlist update failed message" } } diff --git a/src/js/background.js b/src/js/background.js index c0885a4..b545ba7 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -675,7 +675,7 @@ function checkSiteAndUpdatePageAction(tabId, url) { async function shouldUpdate() { try { const { lastUpdated } = await browserAPI.storage.local.get("lastUpdated"); - const { updateFrequency = "daily" } = await browserAPI.storage.sync.get({ + const { updateFrequency = "daily" } = await browserAPI.storage.local.get({ updateFrequency: "daily", }); @@ -703,7 +703,7 @@ async function setupUpdateSchedule() { await browserAPI.alarms.clearAll(); // Get the user's preferred update frequency from storage - const { updateFrequency } = await browserAPI.storage.sync.get({ + const { updateFrequency } = await browserAPI.storage.local.get({ updateFrequency: "daily", }); diff --git a/src/pub/settings-page.html b/src/pub/settings-page.html index 8ea6e41..59472ac 100644 --- a/src/pub/settings-page.html +++ b/src/pub/settings-page.html @@ -196,15 +196,9 @@ .update-status { font-size: 0.875rem; color: var(--text-secondary); - text-align: right; - padding: 0.5rem 0.75rem; - background: rgba(255, 255, 255, 0.03); - border-radius: 8px; display: flex; align-items: center; - justify-content: flex-end; gap: 0.5rem; - margin-top: 1rem; } .update-icon { @@ -426,6 +420,63 @@ opacity: 0.95; } + .update-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-top: 0.75rem; + min-height: 32px; + } + + .update-now-btn { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.35rem 0.75rem; + border-radius: 5px; + border: 1px solid var(--section-border); + background: var(--card-bg); + color: var(--text-secondary); + font-family: inherit; + font-size: 0.8rem; + cursor: pointer; + transition: background 0.2s, border-color 0.2s, color 0.2s; + flex-shrink: 0; + } + + .update-now-btn svg { + stroke: var(--text-secondary) !important; + } + + .update-now-btn svg path { + stroke: inherit; + } + + .update-now-btn:hover { + background: rgba(128, 128, 128, 0.15); + border-color: var(--accent-blue); + color: var(--text-primary); + } + + .update-now-btn:hover svg { + stroke: var(--text-primary) !important; + } + + .update-now-btn:disabled { + opacity: 0.6; + cursor: not-allowed; + } + + .update-now-btn.updating svg { + animation: spin 1s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + .btn:active { transform: translateY(0); } @@ -522,12 +573,18 @@ -
- - - - Next update scheduled for: Checking... +
+
+ + + + Next update scheduled for: Checking... +
+
diff --git a/src/pub/settings-page.js b/src/pub/settings-page.js index 7456187..53d932f 100644 --- a/src/pub/settings-page.js +++ b/src/pub/settings-page.js @@ -15,6 +15,7 @@ document.addEventListener("DOMContentLoaded", () => { const lastUpdated = document.getElementById("lastUpdated"); const updateStatus = document.getElementById("updateStatus"); const forceRefreshButton = document.getElementById("forceRefresh"); + const updateNowBtn = document.getElementById("updateNowBtn"); // Get link highlighting elements const highlightTrustedToggle = document.getElementById( @@ -441,5 +442,29 @@ document.addEventListener("DOMContentLoaded", () => { } }); + // Update Now button handler + if (updateNowBtn) { + updateNowBtn.addEventListener("click", async () => { + updateNowBtn.disabled = true; + updateNowBtn.classList.add("updating"); + const originalText = updateNowBtn.querySelector("span") || updateNowBtn; + const btnText = updateNowBtn.textContent; + updateNowBtn.querySelector("span").textContent = window.i18n ? window.i18n.getMessage("updating") : "Updating..."; + + try { + await browserAPI.runtime.sendMessage({ action: "forceUpdate" }); + await loadFilterlistStats(); + showNotification(window.i18n ? window.i18n.getMessage("filterlistUpdated") : "Filterlist updated successfully!"); + } catch (error) { + console.error("Update failed:", error); + showNotification(window.i18n ? window.i18n.getMessage("updateFailed") : "Update failed. Please try again."); + } finally { + updateNowBtn.disabled = false; + updateNowBtn.classList.remove("updating"); + updateNowBtn.querySelector("span").textContent = window.i18n ? window.i18n.getMessage("updateNow") : "Update Now"; + } + }); + } + setInterval(updateNextUpdateStatus, 60000); });