import { Computer, Moon, Sun, Trash2 } from "lucide-react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link } from "react-router";
import { usePageTitle } from "~/contexts/PageTitleContext";
import { useApp, type Theme } from "../AppContext";
import "../tailwind-full.css";
export default function Settings() {
const { t, i18n } = useTranslation();
usePageTitle(t("navbar.settings", "Ajustes"));
const [showClearConfirm, setShowClearConfirm] = useState(false);
const [cleared, setCleared] = useState(false);
const {
theme,
setTheme,
mapPositionMode,
setMapPositionMode,
showTraffic,
setShowTraffic,
showCameras,
setShowCameras,
showBusStops,
setShowBusStops,
showCoachStops,
setShowCoachStops,
showTrainStops,
setShowTrainStops,
} = useApp();
const THEMES = [
{
value: "light" as Theme,
label: t("about.theme_light", "Claro"),
icon: Sun,
},
{
value: "dark" as Theme,
label: t("about.theme_dark", "Oscuro"),
icon: Moon,
},
{
value: "system" as Theme,
label: t("about.theme_system", "Sistema"),
icon: Computer,
},
];
return (
{/* Theme Selection */}
{t("about.theme", "Tema")}
{THEMES.map(({ value, label, icon: Icon }) => (
setTheme(value)}
className={`
p-4 sm:p-6 flex flex-col items-center justify-center gap-2
rounded-lg border-2 transition-all duration-200
hover:bg-surface/50
focus:outline-none focus:ring focus:ring-primary/50
${
value === theme
? "border-primary bg-primary/10 text-primary font-semibold"
: "border-border text-muted"
}
`}
>
{label}
))}
{/* Map Position Mode */}
{t("about.map_position_mode")}
setMapPositionMode(e.target.value as "gps" | "last")}
>
{t("about.map_position_gps")}
{t("about.map_position_last")}
{/* Map Layers */}
{/* Language Selection */}
{t("about.language", "Idioma")}
i18n.changeLanguage(e.target.value)}
>
Español
Galego
English
{/* Privacy / Clear data */}
{t("settings.privacy_title", "Privacidad y datos")}
{!showClearConfirm && !cleared && (
setShowClearConfirm(true)}
className="flex items-center gap-2 px-4 py-3 rounded-lg border border-border
bg-surface text-text hover:bg-red-50 hover:border-red-300 hover:text-red-700
dark:hover:bg-red-950 dark:hover:border-red-700 dark:hover:text-red-400
transition-colors duration-200 focus:outline-none focus:ring focus:ring-red-300"
>
{t("settings.clear_data", "Borrar mis datos guardados")}
)}
{showClearConfirm && (
{t(
"settings.clear_data_confirm",
"Se eliminarán tus paradas favoritas, nombres personalizados, paradas recientes, historial de rutas, lugares guardados y posición del mapa. Las preferencias de ajustes se conservarán."
)}
{
const personalKeys = [
"mapState",
"specialPlace_home",
"specialPlace_work",
"recentPlaces",
"planner_route_history",
`favouriteStops`,
`recentStops`,
`customStopNames`,
`stops_cache`,
];
personalKeys.forEach((key) => localStorage.removeItem(key));
setShowClearConfirm(false);
setCleared(true);
}}
className="px-4 py-2 rounded-lg bg-red-600 text-white hover:bg-red-700
transition-colors duration-200 focus:outline-none focus:ring focus:ring-red-300"
>
{t("settings.clear_data_confirm_btn", "Sí, borrar datos")}
setShowClearConfirm(false)}
className="px-4 py-2 rounded-lg border border-border bg-surface text-text
hover:bg-surface/50 transition-colors duration-200 focus:outline-none focus:ring focus:ring-primary/50"
>
{t("settings.cancel", "Cancelar")}
)}
{cleared && (
{t(
"settings.clear_data_done",
"Tus datos se han borrado correctamente."
)}
)}
{t("settings.privacy_policy_link", "Política de privacidad")}
);
}