Files
seguidorDeLotes/nuxt4-app/app/pages/index.vue
josedario87 1269b2e489
All checks were successful
build-and-deploy / build (push) Successful in 30s
build-and-deploy / deploy (push) Successful in 3s
Fix SSR error with navigator.onLine in index page
Use reactive ref with onMounted to safely access navigator.onLine
only on client-side, preventing server-side rendering errors.
2025-10-11 19:02:23 -06:00

120 lines
3.8 KiB
Vue

<script setup lang="ts">
const { loggedIn, user } = useUserSession()
// Estado de conexión (solo en cliente)
const isOnline = ref(true)
onMounted(() => {
// Inicializar estado de conexión
isOnline.value = navigator.onLine
// Escuchar cambios de conexión
const handleOnline = () => { isOnline.value = true }
const handleOffline = () => { isOnline.value = false }
window.addEventListener('online', handleOnline)
window.addEventListener('offline', handleOffline)
onUnmounted(() => {
window.removeEventListener('online', handleOnline)
window.removeEventListener('offline', handleOffline)
})
})
</script>
<template>
<div class="min-h-screen">
<header class="border-b border-gray-200 dark:border-gray-800">
<div class="container mx-auto px-4 py-4 flex justify-between items-center">
<h1 class="text-2xl font-bold">Seguidor de Lotes</h1>
<UserMenu />
</div>
</header>
<main class="container mx-auto px-4 py-8">
<div v-if="loggedIn" class="space-y-6">
<UCard>
<template #header>
<h2 class="text-xl font-semibold">Bienvenido, {{ user?.name }}!</h2>
</template>
<div class="space-y-4">
<p>Has iniciado sesión correctamente.</p>
<div class="grid gap-4 md:grid-cols-2">
<UCard>
<template #header>
<h3 class="font-semibold">Información del Usuario</h3>
</template>
<dl class="space-y-2 text-sm">
<div>
<dt class="font-medium">Email:</dt>
<dd class="text-gray-600 dark:text-gray-400">{{ user?.email }}</dd>
</div>
<div>
<dt class="font-medium">Usuario:</dt>
<dd class="text-gray-600 dark:text-gray-400">{{ user?.username }}</dd>
</div>
<div v-if="user?.groups?.length">
<dt class="font-medium">Grupos:</dt>
<dd class="text-gray-600 dark:text-gray-400">{{ user.groups.join(', ') }}</dd>
</div>
</dl>
</UCard>
<UCard>
<template #header>
<h3 class="font-semibold">Estado PWA</h3>
</template>
<div class="space-y-2 text-sm">
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full" :class="isOnline ? 'bg-green-500' : 'bg-red-500'"></div>
<span>{{ isOnline ? 'En línea' : 'Sin conexión' }}</span>
</div>
<p class="text-gray-600 dark:text-gray-400">
La aplicación funciona offline gracias al service worker
</p>
</div>
</UCard>
</div>
</div>
</UCard>
<UCard>
<template #header>
<h3 class="font-semibold">Páginas Protegidas</h3>
</template>
<div class="flex gap-2">
<UButton to="/dashboard" color="primary">
Ir al Dashboard
</UButton>
<UButton to="/profile" color="gray">
Ver Perfil
</UButton>
</div>
</UCard>
</div>
<div v-else class="text-center space-y-4">
<UCard>
<template #header>
<h2 class="text-xl font-semibold">Bienvenido a Seguidor de Lotes</h2>
</template>
<div class="space-y-4">
<p>Por favor, inicia sesión para acceder a la aplicación.</p>
<UButton
to="/login"
color="primary"
size="lg"
>
Iniciar Sesión
</UButton>
</div>
</UCard>
</div>
</main>
</div>
</template>