aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/routes/settings.tsx
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-08-06 21:52:21 +0200
committerAriel Costas Guerrero <ariel@costas.dev>2025-08-06 21:52:21 +0200
commitebfb7c1c8bc0a9ec50bde72eb9a0859c6e5dcee5 (patch)
tree35353c15726d7d036907df731b00d390c1d1f538 /src/frontend/app/routes/settings.tsx
parent5cc27f852b02446659e0ab85305916c9f5e5a5f0 (diff)
Fix this fucking pile of steaming garbage
Diffstat (limited to 'src/frontend/app/routes/settings.tsx')
-rw-r--r--src/frontend/app/routes/settings.tsx114
1 files changed, 113 insertions, 1 deletions
diff --git a/src/frontend/app/routes/settings.tsx b/src/frontend/app/routes/settings.tsx
index c08b2c9..b75434d 100644
--- a/src/frontend/app/routes/settings.tsx
+++ b/src/frontend/app/routes/settings.tsx
@@ -1,6 +1,9 @@
import { useApp } from "../AppContext";
import "./settings.css";
import { useTranslation } from "react-i18next";
+import { useState } from "react";
+import { swManager } from "../utils/serviceWorkerManager";
+import { RotateCcw, Download } from "lucide-react";
export default function Settings() {
const { t, i18n } = useTranslation();
@@ -13,6 +16,66 @@ export default function Settings() {
setMapPositionMode,
} = useApp();
+ const [isCheckingUpdates, setIsCheckingUpdates] = useState(false);
+ const [updateMessage, setUpdateMessage] = useState<string | null>(null);
+
+ const handleCheckForUpdates = async () => {
+ setIsCheckingUpdates(true);
+ setUpdateMessage(null);
+
+ try {
+ // Check if service worker is supported
+ if (!("serviceWorker" in navigator)) {
+ setUpdateMessage(t("about.sw_not_supported", "Service Workers no son compatibles en este navegador"));
+ return;
+ }
+
+ // Force check for updates
+ await swManager.checkForUpdates();
+
+ // Wait a moment for the update check to complete
+ setTimeout(() => {
+ if (swManager.isUpdateAvailable()) {
+ setUpdateMessage(t("about.update_available", "¡Nueva versión disponible! Aparecerá una notificación para actualizar."));
+ } else {
+ setUpdateMessage(t("about.up_to_date", "Ya tienes la versión más reciente."));
+ }
+ }, 2000);
+
+ } catch (error) {
+ console.error("Error checking for updates:", error);
+ setUpdateMessage(t("about.update_error", "Error al comprobar actualizaciones. Intenta recargar la página."));
+ } finally {
+ setIsCheckingUpdates(false);
+ }
+ };
+
+ const handleClearCache = async () => {
+ if (confirm(t("about.clear_cache_confirm", "¿Estás seguro de que quieres limpiar la caché? Esto eliminará todos los datos guardados localmente."))) {
+ try {
+ await swManager.clearCache();
+ setUpdateMessage(t("about.cache_cleared", "Caché limpiada. La página se recargará para aplicar los cambios."));
+ setTimeout(() => {
+ window.location.reload();
+ }, 2000);
+ } catch (error) {
+ console.error("Error clearing cache:", error);
+ setUpdateMessage(t("about.cache_error", "Error al limpiar la caché."));
+ }
+ }
+ };
+
+ const handleResetPWA = async () => {
+ if (confirm(t("about.reset_pwa_confirm", "¿Estás seguro? Esto eliminará TODOS los datos de la aplicación y la reiniciará completamente. Úsalo solo si hay problemas graves de caché."))) {
+ try {
+ await swManager.resetPWA();
+ } catch (error) {
+ console.error("Error resetting PWA:", error);
+ setUpdateMessage(t("about.reset_pwa_error", "Error al reiniciar la PWA."));
+ }
+ }
+ };
+
return (
<div className="page-container">
<h1 className="page-title">{t("about.title")}</h1>
@@ -67,7 +130,7 @@ export default function Settings() {
</div>
<div className="settings-content-inline">
<label htmlFor="language" className="form-label-inline">
- Idioma:
+ {t("about.language", "Idioma")}:
</label>
<select
id="language"
@@ -90,6 +153,55 @@ export default function Settings() {
<dd>{t("about.details_grouped")}</dd>
</dl>
</details>
+
+ <div className="settings-section">
+ <h3>{t("about.app_updates", "Actualizaciones de la aplicación")}</h3>
+ <div className="update-controls">
+ <button
+ className="update-button"
+ onClick={handleCheckForUpdates}
+ disabled={isCheckingUpdates}
+ >
+ {isCheckingUpdates ? (
+ <>
+ <RotateCcw className="spinning" size={18} />
+ {t("about.checking_updates", "Comprobando...")}
+ </>
+ ) : (
+ <>
+ <Download size={18} />
+ {t("about.check_updates", "Comprobar actualizaciones")}
+ </>
+ )}
+ </button>
+
+ <button
+ className="clear-cache-button"
+ onClick={handleClearCache}
+ >
+ <RotateCcw size={18} />
+ {t("about.clear_cache", "Limpiar caché")}
+ </button>
+
+ <button
+ className="reset-pwa-button"
+ onClick={handleResetPWA}
+ >
+ <RotateCcw size={18} />
+ {t("about.reset_pwa", "Reiniciar PWA (Nuclear)")}
+ </button>
+ </div>
+
+ {updateMessage && (
+ <div className={`update-message ${updateMessage.includes("Error") || updateMessage.includes("error") ? 'error' : 'success'}`}>
+ {updateMessage}
+ </div>
+ )}
+
+ <p className="update-help-text">
+ {t("about.update_help", "Si tienes problemas con la aplicación o no ves las últimas funciones, usa estos botones para forzar una actualización o limpiar los datos guardados.")}
+ </p>
+ </div>
</section>
<h2>{t("about.credits")}</h2>
<p>