import { useState } from 'react' import { useMutation } from '@tanstack/react-query' import { UserIcon, BellIcon, MapIcon, PaintBrushIcon, ShieldCheckIcon, GlobeAltIcon, } from '@heroicons/react/24/outline' import clsx from 'clsx' import { useAuthStore } from '@/store/authStore' import { useConfigStore } from '@/store/configStore' import { authApi } from '@/api' import Card, { CardHeader } from '@/components/ui/Card' import Button from '@/components/ui/Button' import Input from '@/components/ui/Input' import Select from '@/components/ui/Select' import Checkbox from '@/components/ui/Checkbox' import { Tabs, TabPanel } from '@/components/ui/Tabs' import { useToast } from '@/components/ui/Toast' export default function Configuracion() { const toast = useToast() const user = useAuthStore((state) => state.user) const config = useConfigStore() const [activeTab, setActiveTab] = useState('perfil') const [passwordForm, setPasswordForm] = useState({ current: '', new: '', confirm: '', }) const cambiarPasswordMutation = useMutation({ mutationFn: (data: { currentPassword: string; newPassword: string }) => authApi.cambiarPassword(data), onSuccess: () => { toast.success('Contrasena actualizada') setPasswordForm({ current: '', new: '', confirm: '' }) }, onError: () => { toast.error('Error al cambiar contrasena') }, }) const handleCambiarPassword = (e: React.FormEvent) => { e.preventDefault() if (passwordForm.new !== passwordForm.confirm) { toast.error('Las contrasenas no coinciden') return } if (passwordForm.new.length < 8) { toast.error('La contrasena debe tener al menos 8 caracteres') return } cambiarPasswordMutation.mutate({ currentPassword: passwordForm.current, newPassword: passwordForm.new, }) } const tabs = [ { id: 'perfil', label: 'Perfil', icon: UserIcon }, { id: 'notificaciones', label: 'Notificaciones', icon: BellIcon }, { id: 'mapa', label: 'Mapa', icon: MapIcon }, { id: 'apariencia', label: 'Apariencia', icon: PaintBrushIcon }, { id: 'seguridad', label: 'Seguridad', icon: ShieldCheckIcon }, ] return (
{/* Header */}

Configuracion

Personaliza tu experiencia en la plataforma

{/* Sidebar tabs */}
{tabs.map((tab) => ( ))}
{/* Content */}
{/* Perfil */} {activeTab === 'perfil' && (
{user?.nombre?.charAt(0) || 'U'}

{user?.nombre}

{user?.email}

Rol: {user?.rol}

Para cambiar tu nombre o email, contacta al administrador.

)} {/* Notificaciones */} {activeTab === 'notificaciones' && (

Notificaciones en la app

config.setNotificaciones({ sonido: checked }) } /> config.setNotificaciones({ escritorio: checked }) } /> config.setNotificaciones({ email: checked }) } />

Sonidos

config.setNotificaciones({ sonido: checked }) } />
)} {/* Mapa */} {activeTab === 'mapa' && (
config.setMapa({ centroInicial: { ...config.mapa.centroInicial, lat: parseFloat(e.target.value), }, }) } /> config.setMapa({ centroInicial: { ...config.mapa.centroInicial, lng: parseFloat(e.target.value), }, }) } />
config.setMapa({ zoomInicial: parseInt(e.target.value) }) } />

Capas visibles

config.setMapa({ mostrarTrafico: checked })} /> config.setMapa({ mostrarGeocercas: checked })} /> config.setMapa({ mostrarPOIs: checked })} /> config.setMapa({ clusterVehiculos: checked })} />
)} {/* Apariencia */} {activeTab === 'apariencia' && (
config.setIdioma(e.target.value)} options={[ { value: 'es', label: 'Espanol' }, { value: 'en', label: 'English' }, ]} /> config.setUnidades({ distancia: e.target.value as 'km' | 'mi', velocidad: e.target.value === 'km' ? 'kmh' : 'mph', }) } options={[ { value: 'km', label: 'Metrico (km, km/h)' }, { value: 'mi', label: 'Imperial (mi, mph)' }, ]} />
)} {/* Seguridad */} {activeTab === 'seguridad' && (

Cambiar contrasena

setPasswordForm({ ...passwordForm, current: e.target.value }) } placeholder="Ingresa tu contrasena actual" /> setPasswordForm({ ...passwordForm, new: e.target.value }) } placeholder="Minimo 8 caracteres" /> setPasswordForm({ ...passwordForm, confirm: e.target.value }) } placeholder="Repite la nueva contrasena" />

Sesiones activas

Sesion actual

Este navegador - Activo ahora

Activo

Zona de peligro

)}
) }