fetch de usuarios ya funcional junto con la ui de usurios

This commit is contained in:
2025-11-27 20:11:21 -03:00
parent f31b2ab7b1
commit 535723900d
5 changed files with 75 additions and 33 deletions
+38
View File
@@ -0,0 +1,38 @@
<script lang="ts">
import TableBody from '@/components/ui/table/table-body.svelte';
import TableCell from '@/components/ui/table/table-cell.svelte';
import TableHead from '@/components/ui/table/table-head.svelte';
import TableHeader from '@/components/ui/table/table-header.svelte';
import TableRow from '@/components/ui/table/table-row.svelte';
import Table from '@/components/ui/table/table.svelte';
import type { UserResponseDto } from '../../../types';
interface Props {
usuarios: UserResponseDto[];
}
let { usuarios }: Props = $props();
</script>
<Table>
<TableHeader>
<TableRow>
<TableHead>Usuario</TableHead>
<TableHead>Nombre</TableHead>
<TableHead>Cantidad de posts</TableHead>
<TableHead>Fecha de Creacion</TableHead>
<TableHead>Acciones</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{#each usuarios as usuario}
<TableRow>
<TableCell>@{usuario.username}</TableCell>
<TableCell>{usuario.displayName}</TableCell>
<TableCell>?</TableCell>
<TableCell>{usuario.createdAt.replace('Z', ' ').replace('T', ' | ')}</TableCell>
<TableCell>?</TableCell>
</TableRow>
{/each}
</TableBody>
</Table>
+1
View File
@@ -85,6 +85,7 @@
<TooltipTrigger class="*: flex"> <TooltipTrigger class="*: flex">
<InputGroupButton <InputGroupButton
variant="default" variant="default"
disabled={cargando}
type="submit" type="submit"
class="transform rounded-full transition-transform ease-in hover:scale-120" class="transform rounded-full transition-transform ease-in hover:scale-120"
size="xs" size="xs"
@@ -1,9 +0,0 @@
import { sesionStore } from '@/stores/usuario';
import { redirect } from '@sveltejs/kit';
import { get } from 'svelte/store';
export async function load({ params }) {
if (get(sesionStore)?.isAdmin !== true) {
redirect(302, '/');
}
}
+7 -24
View File
@@ -1,8 +1,5 @@
<script lang="ts"> <script lang="ts">
import CardAction from '@/components/ui/card/card-action.svelte';
import CardContent from '@/components/ui/card/card-content.svelte'; import CardContent from '@/components/ui/card/card-content.svelte';
import CardHeader from '@/components/ui/card/card-header.svelte';
import CardTitle from '@/components/ui/card/card-title.svelte';
import Card from '@/components/ui/card/card.svelte'; import Card from '@/components/ui/card/card.svelte';
import TableBody from '@/components/ui/table/table-body.svelte'; import TableBody from '@/components/ui/table/table-body.svelte';
import TableHead from '@/components/ui/table/table-head.svelte'; import TableHead from '@/components/ui/table/table-head.svelte';
@@ -12,10 +9,11 @@
import type { User } from '../../../types'; import type { User } from '../../../types';
import CardDescription from '@/components/ui/card/card-description.svelte'; import CardDescription from '@/components/ui/card/card-description.svelte';
import Spinner from '@/components/ui/spinner/spinner.svelte'; import Spinner from '@/components/ui/spinner/spinner.svelte';
import TableCell from '@/components/ui/table/table-cell.svelte';
import { page } from '$app/state';
import TablaUsuarios from '@/components/TablaUsuarios.svelte';
let usuarios: User[] = $state([]);
let cargando = $state(true); let cargando = $state(true);
let error = $state(true);
</script> </script>
<div class="flex min-h-fit w-full items-center justify-center p-6 md:p-10"> <div class="flex min-h-fit w-full items-center justify-center p-6 md:p-10">
@@ -25,33 +23,18 @@
> >
Gestion Usuarios Gestion Usuarios
</h1> </h1>
<Card class={error ? 'border-red-400' : ''}> <Card class={page.data.error ? 'border-red-400' : ''}>
<CardContent> <CardContent>
{#if usuarios.length === 0} {#if page.data.usuarios.length === 0}
{#if error} {#if page.data.error}
<CardDescription class="flex items-center justify-center space-x-2 text-destructive"> <CardDescription class="flex items-center justify-center space-x-2 text-destructive">
<span class="text-sm">Error al cargar usuarios.</span> <span class="text-sm">Error al cargar usuarios.</span>
</CardDescription> </CardDescription>
{:else if cargando}
<CardDescription class="flex items-center justify-center space-x-2">
<Spinner aria-label="Cargando usuarios" />
<span class="text-md text-muted-foreground">Cargando usuarios...</span>
</CardDescription>
{:else} {:else}
<CardDescription>No hay posts que mostar</CardDescription> <CardDescription>No hay posts que mostar</CardDescription>
{/if} {/if}
{:else} {:else}
<Table> <TablaUsuarios usuarios={page.data.usuarios}></TablaUsuarios>
<TableHeader>
<TableRow>
<TableHead>Usuario</TableHead>
<TableHead>Nombre</TableHead>
<TableHead>Cantidad de posts</TableHead>
<TableHead>Acciones</TableHead>
</TableRow>
</TableHeader>
<TableBody></TableBody>
</Table>
{/if} {/if}
</CardContent> </CardContent>
</Card> </Card>
+29
View File
@@ -0,0 +1,29 @@
import { apiBase } from '@/stores/url.js';
import { sesionStore } from '@/stores/usuario';
import { redirect } from '@sveltejs/kit';
import { get } from 'svelte/store';
import type { UserResponseDto } from '../../../types.js';
//para que solo se envie cuando se requiere
export const prerender = true;
export async function load({}) {
const response = await fetch(get(apiBase) + '/api/admin/users', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${get(sesionStore)?.accessToken}`
}
});
if (response.status === 401) {
throw redirect(302, '/');
}
if (!response.ok) {
return { error: true };
}
const usuarios: UserResponseDto[] = await response.json();
return { usuarios, error: false };
}