From 324b6b388ec0a090e8bb6fc82533c9c53e05f809 Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 2 Dec 2025 21:13:02 -0300 Subject: [PATCH] skeleton de la interfaz de seguidores y seguidos --- src/lib/components/ui/badge/badge.svelte | 50 ++++++++++++++ src/lib/components/ui/badge/index.ts | 2 + src/lib/hooks/obtenerSeguidoresPorUsuario.ts | 25 +++++++ src/lib/hooks/obtenerSeguidosPorUsuario.ts | 25 +++++++ src/routes/[perfil]/+page.server.ts | 14 ++-- src/routes/[perfil]/+page.svelte | 69 ++++++++++++++------ 6 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 src/lib/components/ui/badge/badge.svelte create mode 100644 src/lib/components/ui/badge/index.ts create mode 100644 src/lib/hooks/obtenerSeguidoresPorUsuario.ts create mode 100644 src/lib/hooks/obtenerSeguidosPorUsuario.ts diff --git a/src/lib/components/ui/badge/badge.svelte b/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 0000000..bfaa9c5 --- /dev/null +++ b/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + diff --git a/src/lib/components/ui/badge/index.ts b/src/lib/components/ui/badge/index.ts new file mode 100644 index 0000000..64e0aa9 --- /dev/null +++ b/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from "./badge.svelte"; +export { badgeVariants, type BadgeVariant } from "./badge.svelte"; diff --git a/src/lib/hooks/obtenerSeguidoresPorUsuario.ts b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts new file mode 100644 index 0000000..641aef3 --- /dev/null +++ b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts @@ -0,0 +1,25 @@ +import { sesionStore } from "@/stores/usuario"; +import type { UserResponseDto } from "../../types"; +import { get } from "svelte/store"; +import { apiBase } from "@/stores/url"; + +export async function obtenerSeguidoresPorUsuario(Id: string): Promise { + try { + const response = await fetch(`${get(apiBase)}/api/users/${Id}/followers`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + + if (!response.ok) { + return null; + } + + const followers: UserResponseDto[] = await response.json(); + return followers; + } catch (error) { + return null; + } +} diff --git a/src/lib/hooks/obtenerSeguidosPorUsuario.ts b/src/lib/hooks/obtenerSeguidosPorUsuario.ts new file mode 100644 index 0000000..2c1340a --- /dev/null +++ b/src/lib/hooks/obtenerSeguidosPorUsuario.ts @@ -0,0 +1,25 @@ +import { sesionStore } from "@/stores/usuario"; +import type { UserResponseDto } from "../../types"; +import { apiBase } from "@/stores/url"; +import { get } from "svelte/store"; + +export async function obtenerSeguidosPorUsuario(id: string): Promise { + try { + const response = await fetch(`${get(apiBase)}/api/users/${id}/following`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + + if (!response.ok) { + return null; + } + + const users: UserResponseDto[] = await response.json(); + return users; + } catch (error) { + return null; + } +} diff --git a/src/routes/[perfil]/+page.server.ts b/src/routes/[perfil]/+page.server.ts index 641b412..9c5399f 100644 --- a/src/routes/[perfil]/+page.server.ts +++ b/src/routes/[perfil]/+page.server.ts @@ -1,11 +1,15 @@ import { obtenerUsuarioPorUsername } from '@/hooks/obtenerUsuario.js'; import type { User, UserResponseDto } from '../../types.js'; import { error } from '@sveltejs/kit'; +import { obtenerSeguidosPorUsuario } from '@/hooks/obtenerSeguidosPorUsuario.js'; +import { obtenerSeguidoresPorUsuario } from '@/hooks/obtenerSeguidoresPorUsuario.js'; export async function load({ params }) { - const usuario: UserResponseDto | null = await obtenerUsuarioPorUsername(params.perfil); - if (usuario) { - return usuario; - } - error(404, 'No se encontro el usuario, ' + params.perfil); + const usuario: UserResponseDto | null = await obtenerUsuarioPorUsername(params.perfil); + if(!usuario) error(404, 'No se encontro el usuario, ' + params.perfil); + + const seguidos = await obtenerSeguidosPorUsuario(usuario.id); + const seguidores = await obtenerSeguidoresPorUsuario(usuario.id); + + return { ...usuario, seguidos, seguidores }; } diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index d676b13..52ecf28 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -22,6 +22,9 @@ import DialogHeader from '@/components/ui/dialog/dialog-header.svelte'; import DialogTitle from '@/components/ui/dialog/dialog-title.svelte'; import { sesionStore } from '@/stores/usuario.js'; + import CardHeader from '@/components/ui/card/card-header.svelte'; + import CardTitle from '@/components/ui/card/card-title.svelte'; + import Badge from '@/components/ui/badge/badge.svelte'; let { params } = $props(); @@ -62,7 +65,6 @@ async function handleEditar(e: SubmitEvent) { e.preventDefault(); - // post.content = 'test'; if (postAModificar == null) return; await updatePost( postAModificar, @@ -76,24 +78,53 @@
- - -
- - - {page.data.displayName[0].toUpperCase()} - -
-

- {page.data.displayName} -

-

- @{params.perfil} -

-
-
+
+ + +
+ + + {page.data.displayName?.[0]?.toUpperCase() || ''} + +
+

+ {page.data.displayName} +

+

+ @{params.perfil} +

+

+ {page.data.bio} +

+
+
+ +