From 08e84a1e277954d02b4a728b30ddebc984ff0fe9 Mon Sep 17 00:00:00 2001 From: fede Date: Sun, 21 Dec 2025 22:53:27 -0300 Subject: [PATCH 01/13] arrelgado tema de pagina de htags --- src/lib/components/PostCard.svelte | 2 +- src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts | 22 ++++++ src/routes/htag/[htag]/+page.svelte | 75 ++++++++++++++++++++ src/routes/htag/[htag]/+page.ts | 10 +++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts create mode 100644 src/routes/htag/[htag]/+page.svelte create mode 100644 src/routes/htag/[htag]/+page.ts diff --git a/src/lib/components/PostCard.svelte b/src/lib/components/PostCard.svelte index bd9ab80..5a48e3c 100644 --- a/src/lib/components/PostCard.svelte +++ b/src/lib/components/PostCard.svelte @@ -47,7 +47,7 @@ let contenido = $derived(() => { let t = post.content.replaceAll('\n', '
'); t = t.replace( - /#\w*/gm, + /#\p{L}*/u, (match) => `${match}` ); diff --git a/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts new file mode 100644 index 0000000..1289737 --- /dev/null +++ b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts @@ -0,0 +1,22 @@ +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { get } from 'svelte/store'; + +export async function obtenerCantidadDeUsosdeHtag(htag: string) { + if (!htag) return null; + try { + const req = await fetch(`${get(apiBase)}/api/posts/hashtag/${htag}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + if (req.ok) { + let data = await req.json(); + return data; + } + return null; + } catch { + return null; + } +} diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte new file mode 100644 index 0000000..8ad1003 --- /dev/null +++ b/src/routes/htag/[htag]/+page.svelte @@ -0,0 +1,75 @@ + + +
+
+ + + +

+ #{data.htag} +

+ + Uso del hashtag: + +
+
+ +

El hashtag se ha utilizado {data.cantidad} veces

+
+
+
+ +
+ {#each postsfiltro as post} + + {/each} +
+
+
+{#if postAModificar} +
+ +
+{/if} diff --git a/src/routes/htag/[htag]/+page.ts b/src/routes/htag/[htag]/+page.ts new file mode 100644 index 0000000..6055d00 --- /dev/null +++ b/src/routes/htag/[htag]/+page.ts @@ -0,0 +1,10 @@ +import { obtenerCantidadDeUsosdeHtag } from '@/hooks/obtenerCantidadDeUsosdeHtag.js'; +import { error } from '@sveltejs/kit'; + +export async function load({ params }) { + let { htag } = params; + + const cantidad = await obtenerCantidadDeUsosdeHtag(htag); + if (cantidad == null || cantidad.lenght == 0) return error(404, 'no existe el #(hashtag)'); + return { htag, cantidad }; +} From 4f3af346e68759003e15c52100d6bea38169d89a Mon Sep 17 00:00:00 2001 From: fede Date: Sun, 21 Dec 2025 22:57:29 -0300 Subject: [PATCH 02/13] refactors a imports innesesarios y archivos mal formateados --- src/routes/+page.svelte | 1 - src/routes/[perfil]/+page.svelte | 5 -- src/routes/login/+page.js | 6 +- src/routes/login/+page.svelte | 90 +++++++++++++-------------- src/routes/register/+page.svelte | 50 +++++++-------- src/routes/search/[user]/+page.svelte | 1 - 6 files changed, 68 insertions(+), 85 deletions(-) diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index cfb4bff..ff7ccdb 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,7 +1,6 @@ + $effect(() => { + resetAlert(); + if (data.message) { + history.replaceState(history.state, '', '/login'); + setTimeout(() => { + message = ''; + }, 7000); + } + }); + async function resetAlert() { + if (showAlert == true) { + await new Promise((res) => setTimeout(res, 2000)); + showAlert = false; + } + } +
- {#if message} -
- - - Info - - Ingrese las credenciales de la cuenta recien creada - - -
- - {/if} - - {#if showAlert} -
- - - No se pudo iniciar sesion - - Revise su usuario o contraseƱa - - -
- {/if} + {#if message} +
+ + + Info + Ingrese las credenciales de la cuenta recien creada + +
+ {/if} + + {#if showAlert} +
+ + + No se pudo iniciar sesion + Revise su usuario o contraseƱa + +
+ {/if}
diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index 471d138..696f18c 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -1,38 +1,34 @@
-
- - {#if showAlert} -
- - - No se pudo crear la cuenta - - Intente nuevamente. - - -
- {/if} +
+ + {#if showAlert} +
+ + + No se pudo crear la cuenta + Intente nuevamente. + +
+ {/if}
diff --git a/src/routes/search/[user]/+page.svelte b/src/routes/search/[user]/+page.svelte index 13e3e4f..98cbe1e 100644 --- a/src/routes/search/[user]/+page.svelte +++ b/src/routes/search/[user]/+page.svelte @@ -1,6 +1,5 @@ From d8fdaafd356ce58ec4b251184886160c9cfc7f2f Mon Sep 17 00:00:00 2001 From: fede Date: Sun, 21 Dec 2025 23:43:36 -0300 Subject: [PATCH 03/13] fix: interfaz de htags --- src/routes/htag/[htag]/+page.svelte | 51 ++++++++++++++++------------- src/routes/htag/[htag]/+page.ts | 6 ++-- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte index 8ad1003..7a2aea8 100644 --- a/src/routes/htag/[htag]/+page.svelte +++ b/src/routes/htag/[htag]/+page.svelte @@ -1,7 +1,6 @@
-
- - - -

- #{data.htag} -

- - Uso del hashtag: - -
-
- -

El hashtag se ha utilizado {data.cantidad} veces

-
-
+
+
+ + + +

+ #{data.htag} +

+ +
+

+ El hashtag se ha utilizado {data.posts.count} ve{#if data.posts.count > 1}ces{:else}z{/if} +

+
+
+

-
+
{#each postsfiltro as post} {/each} diff --git a/src/routes/htag/[htag]/+page.ts b/src/routes/htag/[htag]/+page.ts index 6055d00..a4c51d3 100644 --- a/src/routes/htag/[htag]/+page.ts +++ b/src/routes/htag/[htag]/+page.ts @@ -4,7 +4,7 @@ import { error } from '@sveltejs/kit'; export async function load({ params }) { let { htag } = params; - const cantidad = await obtenerCantidadDeUsosdeHtag(htag); - if (cantidad == null || cantidad.lenght == 0) return error(404, 'no existe el #(hashtag)'); - return { htag, cantidad }; + const posts = await obtenerCantidadDeUsosdeHtag(htag); + // if (cantidad == null || posts.lenght == 0) return error(404, 'no existe el #(hashtag)'); + return { htag, posts }; } From ae381c00ff2c5f4b7c91bacdc8dbe13097c1cbda Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 22 Dec 2025 00:11:46 -0300 Subject: [PATCH 04/13] =?UTF-8?q?a=C3=B1adido=20opengraph?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/+page.svelte | 8 ++++++++ src/routes/[perfil]/+page.svelte | 7 +++++++ src/routes/htag/[htag]/+page.svelte | 9 +++++++++ src/routes/login/+page.svelte | 8 ++++++++ src/routes/register/+page.svelte | 8 ++++++++ src/routes/search/[user]/+page.svelte | 9 +++++++++ static/x.png | Bin 0 -> 2216 bytes 7 files changed, 49 insertions(+) create mode 100644 static/x.png diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index ff7ccdb..50ac318 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -33,6 +33,14 @@ } + + + + + + + +
diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index a762f32..50ea510 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -177,3 +177,10 @@
+ + + + + + + diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte index 7a2aea8..bc7cacc 100644 --- a/src/routes/htag/[htag]/+page.svelte +++ b/src/routes/htag/[htag]/+page.svelte @@ -9,6 +9,7 @@ import { updatePostStore } from '@/stores/posts'; import { updatePost } from '@/hooks/updatePost'; import Separator from '@/components/ui/separator/separator.svelte'; + import { page } from '$app/state'; interface props { data: { @@ -78,3 +79,11 @@
{/if} + + + + + + + + diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte index 2e9a300..276fa50 100644 --- a/src/routes/login/+page.svelte +++ b/src/routes/login/+page.svelte @@ -52,3 +52,11 @@ {/if}
+ + + + + + + + diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index 696f18c..11d6656 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -32,3 +32,11 @@ {/if}
+ + + + + + + + diff --git a/src/routes/search/[user]/+page.svelte b/src/routes/search/[user]/+page.svelte index 98cbe1e..23634fd 100644 --- a/src/routes/search/[user]/+page.svelte +++ b/src/routes/search/[user]/+page.svelte @@ -1,4 +1,5 @@ @@ -8,3 +9,11 @@ {/each}
+ + + + + + + + diff --git a/static/x.png b/static/x.png new file mode 100644 index 0000000000000000000000000000000000000000..62fc83007826297939b4d090d9e5fa0237150b7a GIT binary patch literal 2216 zcmeAS@N?(olHy`uVBq!ia0y~yV3@$bz>v+s#=yWZLzp{>fq^66)5S5QV$R#U;Td6` z5^N8`dy^bpdv7@OH1TqGh>B=0N?<+MwzuKN(RJc+5e|+Ao0|3}FdvL-iU?SIEG{7M zAooVKuz)ph-dTH>ZN9nU=l|k!=Ele0@0>Ja-uL;&PiN1ZV*ih6>7*%4OPMY(taLDO z&=TOCz~#ccgsD)=VY&bOV^2>{Kf8Z**xIgte}6mgTswjL@Q=j9Z4VDLGFNhT{3l)nxrZViU`+Lh~-lT)mUc9@zJ0MSkCvoP?nV#+KKTbS; z9*`%%f8o{D)q)`s^PO9r{|JU{Oma<0Pgm}^awQ}sHP!K^`YoonH#RC4RCLTwzPqb5 z;9Do#iehE-p*Is`u9kuaN5(l@9*vgd^(~o zv{>uni`(1vr|Cp8sh&O+74h}e)sH_uCc7lQxv?=~XOZd@o{wT35x<3}hOQ1w=L11p1<3#hWS_b=g-wNjCh zOX}2reI#<@OYYaZjo#hg-)~j=%Hh(pv$G8=J|wg>E{xn&qRA&`(_!$l=vk}q?J5hU ziE(`#kB`^=|F>82t?R+*43X6>Ps^U2k-Y3aaZABNCzir5F9I*x%~?H%L*TT{je~Q| za;27>nQ45yXM#nGAIopeKRedN?rw`xm@dBBy!L@hLy=D0o`@RBq_eY3S?lhv4qrb@ zaeIr#VM(>+OfE5}yNXsS+s|41@6XTA{`b>QPt#SixxOy8`PcMfMx}p_k%bytc?w@# zP!!RRyR&BD)2~lX3YWaRbkwKD%g^nXk@%A%8gJ4q!jG^9X@;+hah$B?duIR5Ksm#t zmZ`@(`5rr~Y|V3fdTQ$7dA8LT_SIHjTt9m{-(%+^@oMgwiDFOxpO|f)f5vCi*$+JO zb~5`uEMh%%@T8lc)iKHG73bz!w|{zi`Y?Ok76;2!AuE%-lpn3~n5guOMgWy zRews!ecHu(>f@)U-XW_(IPDTLmif#~TE_WEL5xx9U!uk0H%4{+mrk1me*PsmO`3aG z%-yF4oVV^MHp_ds@WvL0oj2#OoY7TPWqo~pJ^$KY7hN}IHWo#1NMMX9`1t5(M0e3^ZHU2pB`$BV5euut58{t>L;8o-~FCRegKY=|A7@V0s)&hiuw58zJkE_3``l z!os)I|F4^(5y)hkeXV8v9*zki?Uj#?bf(q+`S$j@)qrS9RPC=I9&6#2vuheGEeYRn1_H{m9 zDU*gN@9*!QJ*{J_>$(CZhnX{HKAS2kDkp1G{LIItac#g9*?)gFZ0lJ4OE2csqa(^a z)yFq)-YnS4FK@^4?z700UN6Qt!J}_owngMOS}1jC*|c(ti*fU_?yXmr+*5Th%{#@` zA#mQoGlJ7q@*X~{nr1TF`A-Dfin_nQo=rWu`^nNm!zp{2zP(K4}q^4yB^)R zC#oGbV{vHCq_}?@LivPFGwcj9KKtmuoNbi@)9;CI{Jl2IE!dWOdseX5;iAXKcy~03 z?dzX5_I`Qm{^Lc~l@)?9#`XVdK0f8w^keDRYUZf@@zGsZ+bP^sv9q z`Oa^Fo47ab|C_Yxmvr|0$f*-JzKP$=-{Kjqz;0Xr?+y>&r`zV|FN#^8S$F5dV#Xqg z_NT^aXAGSGpPOqvo0oCU&hkz+4_2YmlV44hf!5;}QLA Date: Mon, 22 Dec 2025 20:19:42 -0300 Subject: [PATCH 05/13] algunos arreglos a la ui y correjido un cambio en una api --- bun.lock | 10 +- src/lib/components/CardPerfil.svelte | 103 +++++++++++++------ src/lib/hooks/obtenerSeguidoresPorUsuario.ts | 45 ++++---- src/lib/hooks/obtenerSeguidosPorUsuario.ts | 45 ++++---- src/routes/[perfil]/+page.svelte | 43 -------- src/routes/[perfil]/+page.ts | 12 ++- src/types.d.ts | 28 +++-- 7 files changed, 156 insertions(+), 130 deletions(-) diff --git a/bun.lock b/bun.lock index aff54d0..65a6ea0 100644 --- a/bun.lock +++ b/bun.lock @@ -4,7 +4,7 @@ "": { "name": "mini-x-front", "dependencies": { - "mode-watcher": "^1.1.0", + "mode-watcher": "^1.1.0" }, "devDependencies": { "@internationalized/date": "^3.8.1", @@ -25,9 +25,9 @@ "tailwindcss": "^4.1.14", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^7.1.10", - }, - }, + "vite": "^7.1.10" + } + } }, "packages": { "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], @@ -490,6 +490,6 @@ "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="] } } diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index 2a49fcb..eb5198d 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -11,6 +11,9 @@ import { updateUsuario } from '@/hooks/updateUsuario'; import { sesionStore } from '@/stores/usuario'; import { obtenerUsuarioPorUsername } from '@/hooks/obtenerUsuario'; + import CardHeader from './ui/card/card-header.svelte'; + import CardTitle from './ui/card/card-title.svelte'; + import Badge from './ui/badge/badge.svelte'; let { data = $bindable() } = $props(); @@ -43,9 +46,8 @@ hoverimg = false; } - - - + + {#if cargando}
@@ -54,31 +56,34 @@
{:else if $sesionStore?.isAdmin || $sesionStore?.username == data.username} - +
+ +
+

{data.displayName}

@{data.username}

@@ -106,6 +111,46 @@

{data.bio}

- {/if} + {/if} +
+ + + + Seguidos: + {data.seguidos.response.length} + + + {#if data.seguidos.response.length === 0} +

No hay Seguidos

+ {:else} + {#each data.seguidos.response as seguidos (seguidos.id)} +

+ {seguidos.username} +

+ {/each} + {/if} +
+
+
+ + + + Seguidores: + {data.seguidores.response.length} + + + {#if data.seguidores.response.length === 0} +

No hay Seguidores

+ {:else} + {#each data.seguidores.response as seguidores (seguidores.id)} +

+ {seguidores.username} +

+ {/each} + {/if} +
+
+
+
diff --git a/src/lib/hooks/obtenerSeguidoresPorUsuario.ts b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts index 0a57e4c..bec0430 100644 --- a/src/lib/hooks/obtenerSeguidoresPorUsuario.ts +++ b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts @@ -1,25 +1,28 @@ -import { sesionStore } from "@/stores/usuario"; -import type { UserResponseDto } from "../../types"; -import { get } from "svelte/store"; -import { apiBase } from "@/stores/url"; +import { sesionStore } from '@/stores/usuario'; +import type { UsersResponseDto } from '../../types'; +import { get } from 'svelte/store'; +import { apiBase } from '@/stores/url'; -export async function obtenerSeguidoresPorUsuario(id: string, limit:number = 20): Promise { - try { - const response = await fetch(`${get(apiBase)}/api/users/${id}/followers?limit=${limit}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${get(sesionStore)?.accessToken}` - } - }); +export async function obtenerSeguidoresPorUsuario( + id: string, + limit: number = 20 +): Promise { + try { + const response = await fetch(`${get(apiBase)}/api/users/${id}/followers?limit=${limit}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); - if (!response.ok) { - return null; - } + if (!response.ok) { + return null; + } - const followers: UserResponseDto[] = await response.json(); - return followers; - } catch (error) { - return null; - } + const followers: UsersResponseDto = await response.json(); + return followers; + } catch (error) { + return null; + } } diff --git a/src/lib/hooks/obtenerSeguidosPorUsuario.ts b/src/lib/hooks/obtenerSeguidosPorUsuario.ts index a32aebe..160f075 100644 --- a/src/lib/hooks/obtenerSeguidosPorUsuario.ts +++ b/src/lib/hooks/obtenerSeguidosPorUsuario.ts @@ -1,25 +1,28 @@ -import { sesionStore } from "@/stores/usuario"; -import type { UserResponseDto } from "../../types"; -import { apiBase } from "@/stores/url"; -import { get } from "svelte/store"; +import { sesionStore } from '@/stores/usuario'; +import type { UsersResponseDto } from '../../types'; +import { apiBase } from '@/stores/url'; +import { get } from 'svelte/store'; -export async function obtenerSeguidosPorUsuario(id: string, limit:number = 20): Promise { - try { - const response = await fetch(`${get(apiBase)}/api/users/${id}/following?limit=${limit}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${get(sesionStore)?.accessToken}` - } - }); +export async function obtenerSeguidosPorUsuario( + id: string, + limit: number = 20 +): Promise { + try { + const response = await fetch(`${get(apiBase)}/api/users/${id}/following?limit=${limit}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); - if (!response.ok) { - return null; - } + if (!response.ok) { + return null; + } - const users: UserResponseDto[] = await response.json(); - return users; - } catch (error) { - return null; - } + const users: UsersResponseDto = await response.json(); + return users; + } catch (error) { + return null; + } } diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index 50ea510..f536653 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -80,50 +80,7 @@
-
- -
-

diff --git a/src/routes/[perfil]/+page.ts b/src/routes/[perfil]/+page.ts index f6695b5..b91cd9d 100644 --- a/src/routes/[perfil]/+page.ts +++ b/src/routes/[perfil]/+page.ts @@ -5,11 +5,13 @@ 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) 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, 3); - const seguidores = await obtenerSeguidoresPorUsuario(usuario.id, 3); + const [seguidos, seguidores] = await Promise.all([ + obtenerSeguidosPorUsuario(usuario.id, 3), + obtenerSeguidoresPorUsuario(usuario.id, 3) + ]); - return { ...usuario, seguidos, seguidores }; + return { ...usuario, seguidos, seguidores }; } diff --git a/src/types.d.ts b/src/types.d.ts index 9ce1978..e38ce95 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -84,18 +84,34 @@ export interface UserResponseDto { displayName: string; email: string; bio: string; - imageUrl: string?; + imageUrl: string?; profileImageUrl: string; followersCount: number; followingCount: number; createdAt: string; postsCount: number; } +export interface UsersResponseDto { + response: { + id: string; + username: string; + displayName: string; + email: string; + bio: string; + imageUrl?: string; + profileImageUrl: string; + followersCount: number; + followingCount: number; + createdAt: string; + postsCount: number; + }[]; + totalCount: number; +} export interface UpdateUserRequest { - username: string?; - displayName: string?; - bio: string?; - email: string?; - profileImage: File?; + username: string?; + displayName: string?; + bio: string?; + email: string?; + profileImage: File?; } From 442fb7e430b6b597622271bdf49069c562f883c5 Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 22 Dec 2025 21:43:52 -0300 Subject: [PATCH 06/13] =?UTF-8?q?a=C3=B1adido=20skeleton=20de=20la=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/[perfil]/+page.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index f536653..50d0170 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -23,6 +23,7 @@ import CardCargando from '@/components/CardCargando.svelte'; import CardError from '@/components/CardError.svelte'; import CardPerfil from '@/components/CardPerfil.svelte'; + import UserPen from '@lucide/svelte/icons/user-pen'; let { params } = $props(); @@ -134,6 +135,13 @@

+ +
+ +
+ From e93148ad75c087739143018515f995316f7eea11 Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 22 Dec 2025 23:57:08 -0300 Subject: [PATCH 07/13] faltaba username en unauth|noadmin --- src/lib/components/CardPerfil.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index eb5198d..2ca9644 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -107,6 +107,7 @@

{data.displayName} +

@{data.username}

{data.bio} From f8b25e9011b8602cc0159ee9239fa0f95061369b Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 23 Dec 2025 16:47:41 -0300 Subject: [PATCH 08/13] snashot de como tenia las cosas cuando fallaba la invalidacion de ruta --- .prettierrc | 5 +- bun.lock | 19 ++-- package.json | 4 +- src/lib/components/CardPerfil.svelte | 13 ++- .../components/DialogModificarUsuario.svelte | 104 ++++++++++++++++++ src/lib/hooks/updateUsuario.ts | 82 +++++++------- src/routes/[perfil]/+page.svelte | 16 +-- 7 files changed, 172 insertions(+), 71 deletions(-) create mode 100644 src/lib/components/DialogModificarUsuario.svelte diff --git a/.prettierrc b/.prettierrc index 8103a0b..8855237 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,7 +3,10 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, - "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "plugins": [ + "prettier-plugin-svelte", + "prettier-plugin-tailwindcss" + ], "overrides": [ { "files": "*.svelte", diff --git a/bun.lock b/bun.lock index 65a6ea0..4622ea0 100644 --- a/bun.lock +++ b/bun.lock @@ -1,10 +1,11 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "mini-x-front", "dependencies": { - "mode-watcher": "^1.1.0" + "mode-watcher": "^1.1.0", }, "devDependencies": { "@internationalized/date": "^3.8.1", @@ -15,9 +16,9 @@ "@tailwindcss/vite": "^4.1.14", "bits-ui": "^2.11.0", "clsx": "^2.1.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.0", - "prettier-plugin-tailwindcss": "^0.7.1", + "prettier-plugin-tailwindcss": "^0.7.2", "svelte": "^5.41.0", "svelte-check": "^4.3.3", "tailwind-merge": "^3.3.1", @@ -25,9 +26,9 @@ "tailwindcss": "^4.1.14", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^7.1.10" - } - } + "vite": "^7.1.10", + }, + }, }, "packages": { "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], @@ -368,11 +369,11 @@ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="], "prettier-plugin-svelte": ["prettier-plugin-svelte@3.4.0", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ=="], - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.7.1", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-Bzv1LZcuiR1Sk02iJTS1QzlFNp/o5l2p3xkopwOrbPmtMeh3fK9rVW5M3neBQzHq+kGKj/4LGQMTNcTH4NGPtQ=="], + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.7.2", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], @@ -490,6 +491,6 @@ "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="] + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], } } diff --git a/package.json b/package.json index 631d920..23ebb7e 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "@tailwindcss/vite": "^4.1.14", "bits-ui": "^2.11.0", "clsx": "^2.1.1", - "prettier": "^3.6.2", + "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.0", - "prettier-plugin-tailwindcss": "^0.7.1", + "prettier-plugin-tailwindcss": "^0.7.2", "svelte": "^5.41.0", "svelte-check": "^4.3.3", "tailwind-merge": "^3.3.1", diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index 2ca9644..01d7caf 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -20,6 +20,7 @@ let cargando = $state(false); let hoverimg = $state(false); let image: File | null = $state(null); + let usu = $state({displayName: data.displayName, bio: data.bio}) async function cambiarFotoDePerfil() { const input = document.createElement('input'); @@ -85,11 +86,11 @@

- {data.displayName} + {usu.displayName}

@{data.username}

-

- {data.bio} +

+ {@html usu.bio.replaceAll("\n", "
")}

{:else}
@@ -106,11 +107,11 @@

- {data.displayName} + {usu.displayName}

@{data.username}

-

- {data.bio} +

+ {@html usu.bio.replaceAll("\n", "
")}

{/if}
diff --git a/src/lib/components/DialogModificarUsuario.svelte b/src/lib/components/DialogModificarUsuario.svelte new file mode 100644 index 0000000..3b06caa --- /dev/null +++ b/src/lib/components/DialogModificarUsuario.svelte @@ -0,0 +1,104 @@ + + + + +
+ +
+
+
+ + + +

Modificar Usuario

+
+
+ + + + Nombre + + + + + + bio + + + + + Email + + + + + + +
+
+
diff --git a/src/lib/hooks/updateUsuario.ts b/src/lib/hooks/updateUsuario.ts index aa6a820..8ced334 100644 --- a/src/lib/hooks/updateUsuario.ts +++ b/src/lib/hooks/updateUsuario.ts @@ -1,48 +1,50 @@ -import { apiBase } from "@/stores/url" -import { sesionStore } from "@/stores/usuario" -import { get } from "svelte/store" +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { get } from 'svelte/store'; export interface AdminUpdateUsuario { - id:string, - displayName: string | null, - bio: string | null, - profileImage:boolean, - image:File, - profileImageUrl:string|null + id: string; + displayName: string | null; + bio: string | null; + profileImage: boolean; + image: File; + profileImageUrl: string | null; } export async function updateUsuario(usuario: Partial) { + const formData = new FormData(); + if (usuario.displayName) formData.append('displayName', usuario.displayName); + if (usuario.bio) formData.append('bio', usuario.bio); + if (usuario.profileImage) { + if (usuario.profileImageUrl) formData.append('profileImageUrl', 'null'); + } else { + if (usuario.profileImageUrl) { + formData.append('profileImageUrl', usuario.profileImageUrl); + } else { + if (usuario.image) formData.append('profileImage', usuario.image); + } + } - const formData = new FormData(); - if (usuario.displayName) formData.append('displayName', usuario.displayName); - if (usuario.bio) formData.append('bio', usuario.bio); - if (usuario.image) formData.append('profileImage', usuario.image); - if (usuario.profileImage){ - if (usuario.profileImageUrl) formData.append('profileImageUrl', 'null'); - }else{ - if (usuario.profileImageUrl) formData.append('profileImageUrl', usuario.profileImageUrl); - } + try { + const req = await fetch(get(apiBase) + '/api/users/' + usuario.id, { + method: 'PUT', + headers: { + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + }, + body: formData + }); + if (req.status === 204) { + let ret = { + // bio: usuario.bio, + displayName: usuario.displayName + // oldImageUrl: usuario.oldImageUrl, + }; + return ret; + } + const dataa = await req.json(); - try { - const req = await fetch(get(apiBase) + "/api/users/"+usuario.id, { - method: "PUT", - headers: { - Authorization: `Bearer ${get(sesionStore)?.accessToken}` - }, - body: formData, - }); - if (req.status === 204) { - let ret = { - // bio: usuario.bio, - displayName: usuario.displayName, - // oldImageUrl: usuario.oldImageUrl, - } - return ret; - } - const dataa = await req.json(); - - return dataa.message; - } catch { - return "No se pudo alcanzar el servidor" - } + return dataa.message; + } catch { + return 'No se pudo alcanzar el servidor'; + } } diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index 50d0170..6415421 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -1,9 +1,6 @@ - +{$inspect(data)}
@@ -136,11 +130,7 @@
-
- -
+ From 6d2bb774d4f6faafd279eba5aa1891a5877d2fec Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 23 Dec 2025 18:22:15 -0300 Subject: [PATCH 09/13] atado con alambre --- src/lib/components/DialogModificarUsuario.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/components/DialogModificarUsuario.svelte b/src/lib/components/DialogModificarUsuario.svelte index 3b06caa..f20b6fa 100644 --- a/src/lib/components/DialogModificarUsuario.svelte +++ b/src/lib/components/DialogModificarUsuario.svelte @@ -44,7 +44,8 @@ cargando = false; open = false; // invalidateAll(); - invalidate(page.url); + // invalidate(page.url); + location.reload(); } From 9508b575f505ba13426179a5b2a6f561be5af121 Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 26 Dec 2025 01:37:10 -0300 Subject: [PATCH 10/13] algunos refactor y ahora arregle lo que no se actualizaba la tarjeta de perfil --- .../components/DialogModificarUsuario.svelte | 135 +++++++++--------- src/lib/hooks/obtenerSeguidoresPorUsuario.ts | 6 +- src/lib/hooks/obtenerSeguidosPorUsuario.ts | 7 +- src/lib/hooks/obtenerUsuario.ts | 9 +- src/routes/[perfil]/+page.svelte | 15 +- src/routes/[perfil]/+page.ts | 9 +- 6 files changed, 91 insertions(+), 90 deletions(-) diff --git a/src/lib/components/DialogModificarUsuario.svelte b/src/lib/components/DialogModificarUsuario.svelte index f20b6fa..1d6403f 100644 --- a/src/lib/components/DialogModificarUsuario.svelte +++ b/src/lib/components/DialogModificarUsuario.svelte @@ -1,27 +1,27 @@ - -
- -
-
-
- - - -

Modificar Usuario

-
-
- - - - Nombre - - - - - - bio - - - - - Email - - - - - - -
-
+ +
+ +
+
+
+ + + +

Modificar Usuario

+
+
+ + + Nombre + + + + bio + + + + Email + + + + + + +
+
diff --git a/src/lib/hooks/obtenerSeguidoresPorUsuario.ts b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts index bec0430..3c84b05 100644 --- a/src/lib/hooks/obtenerSeguidoresPorUsuario.ts +++ b/src/lib/hooks/obtenerSeguidoresPorUsuario.ts @@ -5,10 +5,12 @@ import { apiBase } from '@/stores/url'; export async function obtenerSeguidoresPorUsuario( id: string, - limit: number = 20 + limit: number = 20, + fetch2: Function ): Promise { try { - const response = await fetch(`${get(apiBase)}/api/users/${id}/followers?limit=${limit}`, { + const fetchFunc = fetch2 || fetch; + const response = await fetchFunc(`${get(apiBase)}/api/users/${id}/followers?limit=${limit}`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/src/lib/hooks/obtenerSeguidosPorUsuario.ts b/src/lib/hooks/obtenerSeguidosPorUsuario.ts index 160f075..1db413b 100644 --- a/src/lib/hooks/obtenerSeguidosPorUsuario.ts +++ b/src/lib/hooks/obtenerSeguidosPorUsuario.ts @@ -5,10 +5,13 @@ import { get } from 'svelte/store'; export async function obtenerSeguidosPorUsuario( id: string, - limit: number = 20 + limit: number = 20, + fetch2?: Function ): Promise { try { - const response = await fetch(`${get(apiBase)}/api/users/${id}/following?limit=${limit}`, { + const fetchFunc = fetch2 || fetch; + + const response = await fetchFunc(`${get(apiBase)}/api/users/${id}/following?limit=${limit}`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/src/lib/hooks/obtenerUsuario.ts b/src/lib/hooks/obtenerUsuario.ts index 40481bf..c519c59 100644 --- a/src/lib/hooks/obtenerUsuario.ts +++ b/src/lib/hooks/obtenerUsuario.ts @@ -3,9 +3,14 @@ import type { UserResponseDto } from '../../types'; import { get } from 'svelte/store'; import { sesionStore } from '@/stores/usuario'; -export async function obtenerUsuarioPorUsername(username: string): Promise { +export async function obtenerUsuarioPorUsername( + username: string, + fetch2?: Function +): Promise { try { - const response = await fetch(`${get(apiBase)}/api/users/username/${username}`, { + const fetchFunction = fetch2 || fetch; + + const response = await fetchFunction(`${get(apiBase)}/api/users/username/${username}`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index 6415421..fada5c4 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -28,13 +28,7 @@ let showCrearPost = $state(false); const toggleCrearPost = () => (showCrearPost = !showCrearPost); - const { subscribe } = apiBase; - let baseUrl: string = ''; - let data = $state(page.data); - - subscribe((value) => { - baseUrl = value; - })(); + let data = $derived(page.data); $effect(() => { obtenerPosts(); @@ -42,7 +36,7 @@ async function obtenerPosts() { try { - const req = await fetch(baseUrl + '/api/posts/user/' + params.perfil, { + const req = await fetch($apiBase + '/api/posts/user/' + params.perfil, { method: 'GET', headers: { Authorization: `Bearer ${$sesionStore?.accessToken}` @@ -72,10 +66,13 @@ postAModificar = null; } -{$inspect(data)} + +
+ {#key data} + {/key}

diff --git a/src/routes/[perfil]/+page.ts b/src/routes/[perfil]/+page.ts index b91cd9d..f678027 100644 --- a/src/routes/[perfil]/+page.ts +++ b/src/routes/[perfil]/+page.ts @@ -4,13 +4,14 @@ 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); +export async function load({ params, depends, fetch }) { + depends('perfil:general'); + const usuario: UserResponseDto | null = await obtenerUsuarioPorUsername(params.perfil, fetch); if (!usuario) error(404, 'No se encontro el usuario, ' + params.perfil); const [seguidos, seguidores] = await Promise.all([ - obtenerSeguidosPorUsuario(usuario.id, 3), - obtenerSeguidoresPorUsuario(usuario.id, 3) + obtenerSeguidosPorUsuario(usuario.id, 3, fetch), + obtenerSeguidoresPorUsuario(usuario.id, 3, fetch) ]); return { ...usuario, seguidos, seguidores }; From 6696203979454c3126478954259748023c175af1 Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 26 Dec 2025 01:44:10 -0300 Subject: [PATCH 11/13] refactor --- src/lib/components/CardPerfil.svelte | 57 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index 01d7caf..0d1b879 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -20,7 +20,7 @@ let cargando = $state(false); let hoverimg = $state(false); let image: File | null = $state(null); - let usu = $state({displayName: data.displayName, bio: data.bio}) + let usu = $state({ displayName: data.displayName, bio: data.bio }); async function cambiarFotoDePerfil() { const input = document.createElement('input'); @@ -47,6 +47,7 @@ hoverimg = false; } + @@ -57,33 +58,33 @@

{:else if $sesionStore?.isAdmin || $sesionStore?.username == data.username} -
- -
+
+ +

{usu.displayName} From ff00c3a0d43ebe743e0f82956cc81b18d25393cb Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 26 Dec 2025 01:45:07 -0300 Subject: [PATCH 12/13] fix: fallaba al mostrar pagina si bio == null --- src/lib/components/CardPerfil.svelte | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index 0d1b879..6517782 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -90,9 +90,11 @@ {usu.displayName}

@{data.username}

-

- {@html usu.bio.replaceAll("\n", "
")} -

+ {#if usu.bio} +

+ {@html usu.bio.replaceAll('\n', '
')} +

+ {/if} {:else}
@{data.username}

-

- {@html usu.bio.replaceAll("\n", "
")} -

+ {#if usu.bio} +

+ {@html usu.bio.replaceAll('\n', '
')} +

{/if} -
+ {/if} +
From 4560dbb3f7b5b77d0a7542c5837eaabd9f5b60e6 Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 26 Dec 2025 01:45:22 -0300 Subject: [PATCH 13/13] mostraba boton en todos las paginas --- src/routes/[perfil]/+page.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index fada5c4..6578d40 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -127,7 +127,9 @@
- +{#if $sesionStore?.isAdmin || $sesionStore?.username == params.perfil} + +{/if}