From bce2c6b9492a871dd3eeca5d2deee35a8568b6c2 Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 29 Dec 2025 19:54:28 -0300 Subject: [PATCH 01/14] las bio vuelven a renderizar html --- src/lib/components/CardPerfil.svelte | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index 71196fc..3fefccb 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -22,6 +22,17 @@ let image: File | null = $state(null); let usu = $state({ displayName: data.displayName, bio: data.bio }); + let contenido = $derived(() => { + let t = data.bio + .replaceAll('&', '') + .replaceAll('<', '') + .replaceAll('>', '') + .replaceAll('fetch', '') + .replaceAll('\n', '
'); + + return t; + }); + async function cambiarFotoDePerfil() { const input = document.createElement('input'); input.type = 'file'; @@ -92,7 +103,8 @@ {#if usu.bio}

- {usu.bio.replaceAll('<', '')} + {@html contenido()} +

{/if} From e21d06e898a88ed3b1a29a6b6d535833a92c1d3a Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 29 Dec 2025 20:46:35 -0300 Subject: [PATCH 02/14] fix: no se usaba el fetch del framework --- src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts | 5 +++-- src/routes/htag/[htag]/+page.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts index 1289737..9f7e2fb 100644 --- a/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts +++ b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts @@ -2,10 +2,11 @@ import { apiBase } from '@/stores/url'; import { sesionStore } from '@/stores/usuario'; import { get } from 'svelte/store'; -export async function obtenerCantidadDeUsosdeHtag(htag: string) { +export async function obtenerCantidadDeUsosdeHtag(htag: string, fetch2?: Function) { if (!htag) return null; + const fetchFn = fetch2 || fetch; try { - const req = await fetch(`${get(apiBase)}/api/posts/hashtag/${htag}`, { + const req = await fetchFn(`${get(apiBase)}/api/posts/hashtag/${htag}`, { method: 'GET', headers: { Authorization: `Bearer ${get(sesionStore)?.accessToken}` diff --git a/src/routes/htag/[htag]/+page.ts b/src/routes/htag/[htag]/+page.ts index a4c51d3..1d92ae1 100644 --- a/src/routes/htag/[htag]/+page.ts +++ b/src/routes/htag/[htag]/+page.ts @@ -1,10 +1,10 @@ import { obtenerCantidadDeUsosdeHtag } from '@/hooks/obtenerCantidadDeUsosdeHtag.js'; import { error } from '@sveltejs/kit'; -export async function load({ params }) { +export async function load({ params, fetch }) { let { htag } = params; - const posts = await obtenerCantidadDeUsosdeHtag(htag); + const posts = await obtenerCantidadDeUsosdeHtag(htag, fetch); // if (cantidad == null || posts.lenght == 0) return error(404, 'no existe el #(hashtag)'); return { htag, posts }; } From 98b1b0d9f2bd51da9fa3f02b01d47aa36ff89852 Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 29 Dec 2025 20:49:33 -0300 Subject: [PATCH 03/14] fix: mensaje equivocado --- src/routes/(privado)/admin/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(privado)/admin/+page.svelte b/src/routes/(privado)/admin/+page.svelte index 956243c..2b9f9e1 100644 --- a/src/routes/(privado)/admin/+page.svelte +++ b/src/routes/(privado)/admin/+page.svelte @@ -23,7 +23,7 @@ {#if page.data.usuarios.length === 0} - No hay posts que mostar + No hay usuarios que mostar {:else} {/if} From b7cfa77a91ad2f05c3085ccda78ca1f1e227495d Mon Sep 17 00:00:00 2001 From: fede Date: Mon, 29 Dec 2025 21:58:56 -0300 Subject: [PATCH 04/14] feat: borrar usaurios --- src/lib/components/BorrarUsuario.svelte | 46 +++++++++++++++++++++++++ src/lib/components/PostCard.svelte | 14 ++++---- src/lib/components/TablaUsuarios.svelte | 36 +++++++++++++++---- src/lib/hooks/borrarUsuario.ts | 21 +++++++++++ src/routes/(privado)/admin/+page.svelte | 4 ++- src/routes/(privado)/admin/+page.ts | 3 +- src/types.d.ts | 1 + 7 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 src/lib/components/BorrarUsuario.svelte create mode 100644 src/lib/hooks/borrarUsuario.ts diff --git a/src/lib/components/BorrarUsuario.svelte b/src/lib/components/BorrarUsuario.svelte new file mode 100644 index 0000000..10d0ba7 --- /dev/null +++ b/src/lib/components/BorrarUsuario.svelte @@ -0,0 +1,46 @@ + + +
+ (open = false)}> + + + Borrar Usuario + +

¿Está seguro que desea borrar al usuario {usuario?.displayName}?

+
+ + +
+
+
+
diff --git a/src/lib/components/PostCard.svelte b/src/lib/components/PostCard.svelte index 3259a71..8ee383f 100644 --- a/src/lib/components/PostCard.svelte +++ b/src/lib/components/PostCard.svelte @@ -99,12 +99,14 @@
- - - - {post.authorDisplayName[0].toUpperCase()} - - + {#if post.authorName !== '[deleted]'} + + + + {post.authorDisplayName[0].toUpperCase()} + + + {/if}
{post.authorDisplayName} @{post.authorName} diff --git a/src/lib/components/TablaUsuarios.svelte b/src/lib/components/TablaUsuarios.svelte index 9f7552f..8524b6d 100644 --- a/src/lib/components/TablaUsuarios.svelte +++ b/src/lib/components/TablaUsuarios.svelte @@ -19,6 +19,8 @@ import { fade } from 'svelte/transition'; import type { Unsubscriber } from 'svelte/store'; import Input from './ui/input/input.svelte'; + import Trash_2 from '@lucide/svelte/icons/trash-2'; + import BorrarUsuario from './BorrarUsuario.svelte'; interface Props { usuarios: UserResponseDto[]; @@ -29,6 +31,9 @@ let open = $state(false); let openModificarUsuario = $state(false); + let openBorrar = $state(false); + let usuarioBorrar: UserResponseDto | null = $state(null); + //si ponia contraseña en español quedaba muy largo el nombre let usuarioCambioPass: UserResponseDto | null = $state(null); @@ -84,12 +89,6 @@ return sortDirection === 'asc' ? '↑' : '↓'; } - $effect(() => { - if (!open) { - usuarioCambioPass = null; - } - }); - function handleCambiarContraseña(usuario: UserResponseDto) { open = true; usuarioCambioPass = usuario; @@ -99,6 +98,13 @@ openModificarUsuario = true; usuarioModificar = usuario; } + + function handleBorrar(usuario: UserResponseDto) { + openBorrar = true; + usuarioBorrar = usuario; + } + + // $inspect(usuarios);
@@ -156,11 +162,27 @@

Modificar Usuario

- + + + + + + {#if usuario.isAdmin} + No se pueden eliminar usuarios Admin + {:else} + Eliminar Usuario + {/if} + + {/each} + diff --git a/src/lib/hooks/borrarUsuario.ts b/src/lib/hooks/borrarUsuario.ts new file mode 100644 index 0000000..1fa61a1 --- /dev/null +++ b/src/lib/hooks/borrarUsuario.ts @@ -0,0 +1,21 @@ +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { get } from 'svelte/store'; + +export async function borrarUsuario(id: string) { + try { + const req = await fetch(`${get(apiBase)}/api/users/${id}`, { + method: 'DELETE', + headers: { + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + + if (req.ok) { + return true; + } + return false; + } catch { + return false; + } +} diff --git a/src/routes/(privado)/admin/+page.svelte b/src/routes/(privado)/admin/+page.svelte index 2b9f9e1..c7df333 100644 --- a/src/routes/(privado)/admin/+page.svelte +++ b/src/routes/(privado)/admin/+page.svelte @@ -25,7 +25,9 @@ {#if page.data.usuarios.length === 0} No hay usuarios que mostar {:else} - + {#key page.data.usuarios} + + {/key} {/if} diff --git a/src/routes/(privado)/admin/+page.ts b/src/routes/(privado)/admin/+page.ts index 84c37d1..7b54d62 100644 --- a/src/routes/(privado)/admin/+page.ts +++ b/src/routes/(privado)/admin/+page.ts @@ -6,7 +6,8 @@ import type { UserResponseDto } from '../../../types.js'; export const ssr = false; -export async function load({}) { +export async function load({ depends }) { + depends('admin:load'); const response = await fetch(get(apiBase) + '/api/admin/users', { method: 'GET', headers: { diff --git a/src/types.d.ts b/src/types.d.ts index e38ce95..f0d647e 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -90,6 +90,7 @@ export interface UserResponseDto { followingCount: number; createdAt: string; postsCount: number; + isAdmin?: bool; } export interface UsersResponseDto { response: { From b7c52ed0b2de38a15e0208f9a2290a40bea05eba Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 30 Dec 2025 13:48:04 -0300 Subject: [PATCH 05/14] update boton --- bun.lock | 4 ++-- package.json | 2 +- src/lib/components/ui/button/button.svelte | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index 4622ea0..5e3d2d5 100644 --- a/bun.lock +++ b/bun.lock @@ -22,7 +22,7 @@ "svelte": "^5.41.0", "svelte-check": "^4.3.3", "tailwind-merge": "^3.3.1", - "tailwind-variants": "^3.1.1", + "tailwind-variants": "^3.2.2", "tailwindcss": "^4.1.14", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", @@ -419,7 +419,7 @@ "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="], - "tailwind-variants": ["tailwind-variants@3.1.1", "", { "peerDependencies": { "tailwind-merge": ">=3.0.0", "tailwindcss": "*" }, "optionalPeers": ["tailwind-merge"] }, "sha512-ftLXe3krnqkMHsuBTEmaVUXYovXtPyTK7ckEfDRXS8PBZx0bAUas+A0jYxuKA5b8qg++wvQ3d2MQ7l/xeZxbZQ=="], + "tailwind-variants": ["tailwind-variants@3.2.2", "", { "peerDependencies": { "tailwind-merge": ">=3.0.0", "tailwindcss": "*" }, "optionalPeers": ["tailwind-merge"] }, "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg=="], "tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="], diff --git a/package.json b/package.json index 23ebb7e..4d3b826 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "svelte": "^5.41.0", "svelte-check": "^4.3.3", "tailwind-merge": "^3.3.1", - "tailwind-variants": "^3.1.1", + "tailwind-variants": "^3.2.2", "tailwindcss": "^4.1.14", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte index 2105474..6499722 100644 --- a/src/lib/components/ui/button/button.svelte +++ b/src/lib/components/ui/button/button.svelte @@ -4,7 +4,7 @@ import { type VariantProps, tv } from "tailwind-variants"; export const buttonVariants = tv({ - base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", + base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", variants: { variant: { default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", From 324546b5f83f46dcdcb2bb1f3cb40a5e0c887fdc Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 30 Dec 2025 13:59:32 -0300 Subject: [PATCH 06/14] feat: ajustes en la ui del panel de admin --- src/lib/components/TablaUsuarios.svelte | 114 ++++++++++++--------- src/lib/components/ui/button/button.svelte | 8 +- 2 files changed, 67 insertions(+), 55 deletions(-) diff --git a/src/lib/components/TablaUsuarios.svelte b/src/lib/components/TablaUsuarios.svelte index 8524b6d..1077734 100644 --- a/src/lib/components/TablaUsuarios.svelte +++ b/src/lib/components/TablaUsuarios.svelte @@ -9,6 +9,8 @@ import Button from './ui/button/button.svelte'; import KeyIcon from '@lucide/svelte/icons/key'; import UserPen from '@lucide/svelte/icons/user-pen'; + import Search from '@lucide/svelte/icons/search'; + import Plus from '@lucide/svelte/icons/plus'; import { Tooltip } from './ui/tooltip'; import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte'; import TooltipContent from './ui/tooltip/tooltip-content.svelte'; @@ -21,6 +23,9 @@ import Input from './ui/input/input.svelte'; import Trash_2 from '@lucide/svelte/icons/trash-2'; import BorrarUsuario from './BorrarUsuario.svelte'; + import InputGroup from './ui/input-group/input-group.svelte'; + import InputGroupAddon from './ui/input-group/input-group-addon.svelte'; + import InputGroupInput from './ui/input-group/input-group-input.svelte'; interface Props { usuarios: UserResponseDto[]; @@ -107,13 +112,12 @@ // $inspect(usuarios); -
- +
+ + + + +
@@ -135,52 +139,60 @@ - {#each usuariosFiltrados as usuario} + {#if usuariosFiltrados.length == 0} - @ - {usuario.username} - + +

No hay usuarios por el nombre de: {search}

- {usuario.displayName} - {usuario.postsCount} - {usuario.createdAt.replace('Z', ' ').replace('T', ' | ')} - - - - - - -

Recuperar Contraseña

-
-
- - - - - -

Modificar Usuario

-
-
- - - - - - {#if usuario.isAdmin} - No se pueden eliminar usuarios Admin - {:else} - Eliminar Usuario - {/if} - - -
-
- {/each} + {:else} + {#each usuariosFiltrados as usuario} + + @ + {usuario.username} + + + {usuario.displayName} + {usuario.postsCount} + {usuario.createdAt.replace('Z', ' ').replace('T', ' | ')} + + + + + + +

Recuperar Contraseña

+
+
+ + + + + +

Modificar Usuario

+
+
+ + + + + + {#if usuario.isAdmin} + No se pueden eliminar usuarios Admin + {:else} + Eliminar Usuario + {/if} + + +
+
+ {/each} + {/if}
diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte index 6499722..a8296ae 100644 --- a/src/lib/components/ui/button/button.svelte +++ b/src/lib/components/ui/button/button.svelte @@ -7,12 +7,12 @@ base: "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", variants: { variant: { - default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + default: "bg-primary text-primary-foreground hover:bg-primary/90 shadow-xs", destructive: - "bg-destructive shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white", + "bg-destructive hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white shadow-xs", outline: - "bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border", - secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + "bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-xs", ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", link: "text-primary underline-offset-4 hover:underline", }, From adb4f7a4c15368b02343908c98ff005bf717fbd9 Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 30 Dec 2025 15:55:20 -0300 Subject: [PATCH 07/14] Actualizado el boton de like --- src/lib/components/PostCard.svelte | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/lib/components/PostCard.svelte b/src/lib/components/PostCard.svelte index 8ee383f..2462ca9 100644 --- a/src/lib/components/PostCard.svelte +++ b/src/lib/components/PostCard.svelte @@ -77,7 +77,11 @@ async function likeHandler() { cargandoLike = true; - let { message, ok } = await likePost(post); + //para que se vea el spinner + let [{ message, ok }] = await Promise.all([ + likePost(post), + new Promise((resolve) => setTimeout(resolve, 300)) + ]); if (ok) { if (post.isLiked) { post.likesCount--; @@ -159,14 +163,18 @@
+
@@ -198,3 +200,4 @@ + \ No newline at end of file diff --git a/src/lib/components/admin/AgregarUsuario.svelte b/src/lib/components/admin/AgregarUsuario.svelte new file mode 100644 index 0000000..f8a5e62 --- /dev/null +++ b/src/lib/components/admin/AgregarUsuario.svelte @@ -0,0 +1,111 @@ + + +
+ { + open = !open; + }} + > + + + Agregar Usuario + + +
+
+ + + Usuario + + + + + Email + + + + + Nombre visible + + + + + Contraseña + + +
+ +
+ + + +
+
+ +
+
+
+ +
+ (error = '')}> + {error} + +
diff --git a/src/lib/stores/url.ts b/src/lib/stores/url.ts index 7a0bd63..a195b83 100644 --- a/src/lib/stores/url.ts +++ b/src/lib/stores/url.ts @@ -2,5 +2,5 @@ import { dev } from '$app/environment'; import { readable } from 'svelte/store'; export const apiBase = readable( - dev ? 'http://localhost:5000' : 'https://minix-back-dsuk.onrender.com' + dev ? 'http://localhost:5159' : 'https://minix-back-dsuk.onrender.com' ); From 129668ff230263a3a6cdd52954cdfd8e3db4f0c3 Mon Sep 17 00:00:00 2001 From: fede Date: Tue, 30 Dec 2025 19:33:41 -0300 Subject: [PATCH 09/14] el input de busqueda de usuarios --- bun.lock | 10 +- package.json | 6 +- .../ui/command/command-dialog.svelte | 40 +++++++ .../ui/command/command-empty.svelte | 17 +++ .../ui/command/command-group.svelte | 32 +++++ .../ui/command/command-input.svelte | 26 ++++ .../components/ui/command/command-item.svelte | 20 ++++ .../ui/command/command-link-item.svelte | 20 ++++ .../components/ui/command/command-list.svelte | 17 +++ .../ui/command/command-loading.svelte | 7 ++ .../ui/command/command-separator.svelte | 17 +++ .../ui/command/command-shortcut.svelte | 20 ++++ src/lib/components/ui/command/command.svelte | 28 +++++ src/lib/components/ui/command/index.ts | 37 ++++++ .../ui/dialog/dialog-content.svelte | 12 +- .../components/ui/dialog/dialog-portal.svelte | 7 ++ .../components/ui/dialog/dialog-title.svelte | 2 +- src/lib/components/ui/dialog/dialog.svelte | 7 ++ src/lib/components/ui/dialog/index.ts | 7 +- src/lib/head/Busqueda.svelte | 112 ++++++++++++++++++ src/lib/head/Header.svelte | 4 +- src/routes/(privado)/admin/+page.ts | 2 +- 22 files changed, 429 insertions(+), 21 deletions(-) create mode 100644 src/lib/components/ui/command/command-dialog.svelte create mode 100644 src/lib/components/ui/command/command-empty.svelte create mode 100644 src/lib/components/ui/command/command-group.svelte create mode 100644 src/lib/components/ui/command/command-input.svelte create mode 100644 src/lib/components/ui/command/command-item.svelte create mode 100644 src/lib/components/ui/command/command-link-item.svelte create mode 100644 src/lib/components/ui/command/command-list.svelte create mode 100644 src/lib/components/ui/command/command-loading.svelte create mode 100644 src/lib/components/ui/command/command-separator.svelte create mode 100644 src/lib/components/ui/command/command-shortcut.svelte create mode 100644 src/lib/components/ui/command/command.svelte create mode 100644 src/lib/components/ui/command/index.ts create mode 100644 src/lib/components/ui/dialog/dialog-portal.svelte create mode 100644 src/lib/components/ui/dialog/dialog.svelte create mode 100644 src/lib/head/Busqueda.svelte diff --git a/bun.lock b/bun.lock index 5e3d2d5..840e278 100644 --- a/bun.lock +++ b/bun.lock @@ -8,13 +8,13 @@ "mode-watcher": "^1.1.0", }, "devDependencies": { - "@internationalized/date": "^3.8.1", - "@lucide/svelte": "^0.544.0", + "@internationalized/date": "^3.10.0", + "@lucide/svelte": "^0.561.0", "@sveltejs/adapter-vercel": "^6.0.0", "@sveltejs/kit": "^2.47.1", "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tailwindcss/vite": "^4.1.14", - "bits-ui": "^2.11.0", + "bits-ui": "^2.14.4", "clsx": "^2.1.1", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.0", @@ -105,7 +105,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@lucide/svelte": ["@lucide/svelte@0.544.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-9f9O6uxng2pLB01sxNySHduJN3HTl5p0HDu4H26VR51vhZfiMzyOMe9Mhof3XAk4l813eTtl+/DYRvGyoRR+yw=="], + "@lucide/svelte": ["@lucide/svelte@0.561.0", "", { "peerDependencies": { "svelte": "^5" } }, "sha512-vofKV2UFVrKE6I4ewKJ3dfCXSV6iP6nWVmiM83MLjsU91EeJcEg7LoWUABLp/aOTxj1HQNbJD1f3g3L0JQgH9A=="], "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg=="], @@ -231,7 +231,7 @@ "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - "bits-ui": ["bits-ui@2.14.3", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-Dkpenu6F5WUfdDJn5D8ALkTaAM+7sUCszKjzav5TWAzsq1fj2tcqKYJcUm82OS+JlgcolI7LOkrqIXzKnt56RA=="], + "bits-ui": ["bits-ui@2.14.4", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-W6kenhnbd/YVvur+DKkaVJ6GldE53eLewur5AhUCqslYQ0vjZr8eWlOfwZnMiPB+PF5HMVqf61vXBvmyrAmPWg=="], "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], diff --git a/package.json b/package.json index 4d3b826..1aa0375 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,13 @@ "lint": "prettier --check ." }, "devDependencies": { - "@internationalized/date": "^3.8.1", - "@lucide/svelte": "^0.544.0", + "@internationalized/date": "^3.10.0", + "@lucide/svelte": "^0.561.0", "@sveltejs/adapter-vercel": "^6.0.0", "@sveltejs/kit": "^2.47.1", "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tailwindcss/vite": "^4.1.14", - "bits-ui": "^2.11.0", + "bits-ui": "^2.14.4", "clsx": "^2.1.1", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.0", diff --git a/src/lib/components/ui/command/command-dialog.svelte b/src/lib/components/ui/command/command-dialog.svelte new file mode 100644 index 0000000..4bdb740 --- /dev/null +++ b/src/lib/components/ui/command/command-dialog.svelte @@ -0,0 +1,40 @@ + + + + + {title} + {description} + + + + + diff --git a/src/lib/components/ui/command/command-empty.svelte b/src/lib/components/ui/command/command-empty.svelte new file mode 100644 index 0000000..6726cd8 --- /dev/null +++ b/src/lib/components/ui/command/command-empty.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/command/command-group.svelte b/src/lib/components/ui/command/command-group.svelte new file mode 100644 index 0000000..104f817 --- /dev/null +++ b/src/lib/components/ui/command/command-group.svelte @@ -0,0 +1,32 @@ + + + + {#if heading} + + {heading} + + {/if} + + diff --git a/src/lib/components/ui/command/command-input.svelte b/src/lib/components/ui/command/command-input.svelte new file mode 100644 index 0000000..28d3dcf --- /dev/null +++ b/src/lib/components/ui/command/command-input.svelte @@ -0,0 +1,26 @@ + + +
+ + +
diff --git a/src/lib/components/ui/command/command-item.svelte b/src/lib/components/ui/command/command-item.svelte new file mode 100644 index 0000000..5833416 --- /dev/null +++ b/src/lib/components/ui/command/command-item.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/command/command-link-item.svelte b/src/lib/components/ui/command/command-link-item.svelte new file mode 100644 index 0000000..ada6d2c --- /dev/null +++ b/src/lib/components/ui/command/command-link-item.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/command/command-list.svelte b/src/lib/components/ui/command/command-list.svelte new file mode 100644 index 0000000..2d3a01a --- /dev/null +++ b/src/lib/components/ui/command/command-list.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/command/command-loading.svelte b/src/lib/components/ui/command/command-loading.svelte new file mode 100644 index 0000000..19dd298 --- /dev/null +++ b/src/lib/components/ui/command/command-loading.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/command/command-separator.svelte b/src/lib/components/ui/command/command-separator.svelte new file mode 100644 index 0000000..35c4c95 --- /dev/null +++ b/src/lib/components/ui/command/command-separator.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/lib/components/ui/command/command-shortcut.svelte b/src/lib/components/ui/command/command-shortcut.svelte new file mode 100644 index 0000000..f3d6928 --- /dev/null +++ b/src/lib/components/ui/command/command-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/command/command.svelte b/src/lib/components/ui/command/command.svelte new file mode 100644 index 0000000..a1581f1 --- /dev/null +++ b/src/lib/components/ui/command/command.svelte @@ -0,0 +1,28 @@ + + + diff --git a/src/lib/components/ui/command/index.ts b/src/lib/components/ui/command/index.ts new file mode 100644 index 0000000..5435fbe --- /dev/null +++ b/src/lib/components/ui/command/index.ts @@ -0,0 +1,37 @@ +import Root from "./command.svelte"; +import Loading from "./command-loading.svelte"; +import Dialog from "./command-dialog.svelte"; +import Empty from "./command-empty.svelte"; +import Group from "./command-group.svelte"; +import Item from "./command-item.svelte"; +import Input from "./command-input.svelte"; +import List from "./command-list.svelte"; +import Separator from "./command-separator.svelte"; +import Shortcut from "./command-shortcut.svelte"; +import LinkItem from "./command-link-item.svelte"; + +export { + Root, + Dialog, + Empty, + Group, + Item, + LinkItem, + Input, + List, + Separator, + Shortcut, + Loading, + // + Root as Command, + Dialog as CommandDialog, + Empty as CommandEmpty, + Group as CommandGroup, + Item as CommandItem, + LinkItem as CommandLinkItem, + Input as CommandInput, + List as CommandList, + Separator as CommandSeparator, + Shortcut as CommandShortcut, + Loading as CommandLoading, +}; diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte index 9d7c7f5..5c6ee6d 100644 --- a/src/lib/components/ui/dialog/dialog-content.svelte +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -1,9 +1,11 @@ - + Close {/if} - + diff --git a/src/lib/components/ui/dialog/dialog-portal.svelte b/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 0000000..ccfa79c --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte index 067e55e..e4d4b34 100644 --- a/src/lib/components/ui/dialog/dialog-title.svelte +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -12,6 +12,6 @@ diff --git a/src/lib/components/ui/dialog/dialog.svelte b/src/lib/components/ui/dialog/dialog.svelte new file mode 100644 index 0000000..211672c --- /dev/null +++ b/src/lib/components/ui/dialog/dialog.svelte @@ -0,0 +1,7 @@ + + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts index dce1d9d..076cef5 100644 --- a/src/lib/components/ui/dialog/index.ts +++ b/src/lib/components/ui/dialog/index.ts @@ -1,5 +1,5 @@ -import { Dialog as DialogPrimitive } from "bits-ui"; - +import Root from "./dialog.svelte"; +import Portal from "./dialog-portal.svelte"; import Title from "./dialog-title.svelte"; import Footer from "./dialog-footer.svelte"; import Header from "./dialog-header.svelte"; @@ -9,9 +9,6 @@ import Description from "./dialog-description.svelte"; import Trigger from "./dialog-trigger.svelte"; import Close from "./dialog-close.svelte"; -const Root = DialogPrimitive.Root; -const Portal = DialogPrimitive.Portal; - export { Root, Title, diff --git a/src/lib/head/Busqueda.svelte b/src/lib/head/Busqueda.svelte new file mode 100644 index 0000000..f966680 --- /dev/null +++ b/src/lib/head/Busqueda.svelte @@ -0,0 +1,112 @@ + + + + + + + (open = true)} + /> + + Ctrl+K + + + + + {#if search} + + {/if} + diff --git a/src/lib/head/Header.svelte b/src/lib/head/Header.svelte index 145f2fb..1e26e02 100644 --- a/src/lib/head/Header.svelte +++ b/src/lib/head/Header.svelte @@ -9,6 +9,7 @@ import { apiBase } from '@/stores/url'; import { goto } from '$app/navigation'; import AvatarButton from './AvatarButton.svelte'; + import Busqueda from './Busqueda.svelte'; let menuOpen = $state(false); const toggleMenu = () => (menuOpen = !menuOpen); @@ -56,7 +57,8 @@ -
+
+ {#if showCerrarSesion} {#if $sesionStore !== null} diff --git a/src/routes/(privado)/admin/+page.ts b/src/routes/(privado)/admin/+page.ts index 7b54d62..4808e7b 100644 --- a/src/routes/(privado)/admin/+page.ts +++ b/src/routes/(privado)/admin/+page.ts @@ -6,7 +6,7 @@ import type { UserResponseDto } from '../../../types.js'; export const ssr = false; -export async function load({ depends }) { +export async function load({ depends, fetch }) { depends('admin:load'); const response = await fetch(get(apiBase) + '/api/admin/users', { method: 'GET', From cf4a5db66298912312652fb657de8676c7d387fa Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 1 Jan 2026 21:17:18 -0300 Subject: [PATCH 10/14] bug pagina de hashtags --- src/routes/htag/[htag]/+page.svelte | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte index bc7cacc..8c4d41c 100644 --- a/src/routes/htag/[htag]/+page.svelte +++ b/src/routes/htag/[htag]/+page.svelte @@ -23,11 +23,10 @@ let { data }: props = $props(); - let posts = $state(data.posts.response); let postAModificar: Post | null = $state(null); let postsfiltro = $derived( - posts.filter((x) => { + data.posts.response.filter((x) => { const regex = new RegExp(`#${data.htag}\\b`, 'gm'); return regex.test(x.content); }) @@ -68,9 +67,11 @@
- {#each postsfiltro as post} - - {/each} + {#key data.posts.response} + {#each postsfiltro as post} + + {/each} + {/key}
From 51da74e9718780dde3f8af3fae339245ae6c61bd Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 1 Jan 2026 21:23:27 -0300 Subject: [PATCH 11/14] fran deja de modificar esto --- src/lib/stores/url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/stores/url.ts b/src/lib/stores/url.ts index a195b83..7a0bd63 100644 --- a/src/lib/stores/url.ts +++ b/src/lib/stores/url.ts @@ -2,5 +2,5 @@ import { dev } from '$app/environment'; import { readable } from 'svelte/store'; export const apiBase = readable( - dev ? 'http://localhost:5159' : 'https://minix-back-dsuk.onrender.com' + dev ? 'http://localhost:5000' : 'https://minix-back-dsuk.onrender.com' ); From 7de6125eb859615a440181e19de5ed9cd2ded365 Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 1 Jan 2026 21:36:40 -0300 Subject: [PATCH 12/14] Arreglado que no se podia dar like --- src/lib/components/PostCard.svelte | 3 +++ src/routes/htag/[htag]/+page.svelte | 18 +++++++++++------- src/routes/htag/[htag]/+page.ts | 1 - 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/lib/components/PostCard.svelte b/src/lib/components/PostCard.svelte index 2462ca9..bf7cb96 100644 --- a/src/lib/components/PostCard.svelte +++ b/src/lib/components/PostCard.svelte @@ -82,6 +82,7 @@ likePost(post), new Promise((resolve) => setTimeout(resolve, 300)) ]); + console.log(1); if (ok) { if (post.isLiked) { post.likesCount--; @@ -93,7 +94,9 @@ errorLike = true; mensajeError = message; } + console.log(1); updatePostStore(post.id, post); + console.log(1); cargandoLike = false; } diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte index 8c4d41c..e58b96a 100644 --- a/src/routes/htag/[htag]/+page.svelte +++ b/src/routes/htag/[htag]/+page.svelte @@ -5,11 +5,12 @@ import Card from '@/components/ui/card/card.svelte'; import type { Post } from '../../../types.js'; import ModalEditar from '../../[perfil]/modalEditar.svelte'; - import { fade } from 'svelte/transition'; - import { updatePostStore } from '@/stores/posts'; + import { fade, slide } from 'svelte/transition'; + import { posts, setPosts, updatePostStore } from '@/stores/posts'; import { updatePost } from '@/hooks/updatePost'; import Separator from '@/components/ui/separator/separator.svelte'; import { page } from '$app/state'; + import { onMount } from 'svelte'; interface props { data: { @@ -23,10 +24,13 @@ let { data }: props = $props(); + //seteo los posts en el store + $effect(() => setPosts(data.posts.response)); + let postAModificar: Post | null = $state(null); let postsfiltro = $derived( - data.posts.response.filter((x) => { + $posts?.filter((x) => { const regex = new RegExp(`#${data.htag}\\b`, 'gm'); return regex.test(x.content); }) @@ -67,11 +71,11 @@
- {#key data.posts.response} - {#each postsfiltro as post} + {#each postsfiltro as post (post.id)} +
- {/each} - {/key} +
+ {/each}
diff --git a/src/routes/htag/[htag]/+page.ts b/src/routes/htag/[htag]/+page.ts index 1d92ae1..78cce78 100644 --- a/src/routes/htag/[htag]/+page.ts +++ b/src/routes/htag/[htag]/+page.ts @@ -1,5 +1,4 @@ import { obtenerCantidadDeUsosdeHtag } from '@/hooks/obtenerCantidadDeUsosdeHtag.js'; -import { error } from '@sveltejs/kit'; export async function load({ params, fetch }) { let { htag } = params; From c815f0b291c6ed08db4fb1fa3e788b6e8a37dd39 Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 1 Jan 2026 21:38:32 -0300 Subject: [PATCH 13/14] feat+refactor: Funcionalidad de busqueda de hashtags --- src/lib/head/Busqueda.svelte | 74 ++++++++++++++++++------------- src/lib/hooks/busquedaHashtags.ts | 18 ++++++++ 2 files changed, 62 insertions(+), 30 deletions(-) create mode 100644 src/lib/hooks/busquedaHashtags.ts diff --git a/src/lib/head/Busqueda.svelte b/src/lib/head/Busqueda.svelte index f966680..3a6134d 100644 --- a/src/lib/head/Busqueda.svelte +++ b/src/lib/head/Busqueda.svelte @@ -18,12 +18,12 @@ import AvatarImage from '@/components/ui/avatar/avatar-image.svelte'; import Label from '@/components/ui/label/label.svelte'; import { resolve } from '$app/paths'; + import { busquedaHashtags } from '@/hooks/busquedaHashtags'; let search: string = $state(''); let open = $state(false); - let usuarios: UserResponseDto[] = $state([]); - let loading = $state(false); + let usuarios: Promise | undefined = $state(); let hashtags: Promise | undefined = $state(); @@ -33,18 +33,17 @@ open = !open; } } - $inspect(usuarios, loading); + // $inspect(usuarios, loading); let timeoutId: number | undefined; function buscar() { - loading = true; if (timeoutId) { clearTimeout(timeoutId); } timeoutId = setTimeout(async () => { - usuarios = await busquedaUsuarios(search); - loading = false; + usuarios = busquedaUsuarios(search); + hashtags = busquedaHashtags(search); }, 200); return () => { @@ -55,13 +54,14 @@ - + (open = true)} + class="max-w-0 transition-[max-width] duration-1000 ease-out group-hover:max-w-xs focus:max-w-xs" /> Ctrl+K @@ -75,36 +75,50 @@ oninput={buscar} /> {#if search} -
    + diff --git a/src/lib/hooks/busquedaHashtags.ts b/src/lib/hooks/busquedaHashtags.ts new file mode 100644 index 0000000..e45413e --- /dev/null +++ b/src/lib/hooks/busquedaHashtags.ts @@ -0,0 +1,18 @@ +import { apiBase } from '@/stores/url'; +import { get } from 'svelte/store'; + +export async function busquedaHashtags(htag: string) { + if (!htag) return null; + try { + const req = await fetch(`${get(apiBase)}/api/htag?q=${htag}`, { + method: 'GET' + }); + if (req.ok) { + let data = await req.json(); + return data; + } + return []; + } catch { + return null; + } +} From f0701cdf9b081ac688648be7ecb3dc9169c72712 Mon Sep 17 00:00:00 2001 From: fede Date: Thu, 1 Jan 2026 21:51:29 -0300 Subject: [PATCH 14/14] =?UTF-8?q?a=C3=B1adido=20logo=20de=20la=20pagina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/head/Header.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib/head/Header.svelte b/src/lib/head/Header.svelte index 1e26e02..838fbd1 100644 --- a/src/lib/head/Header.svelte +++ b/src/lib/head/Header.svelte @@ -10,6 +10,8 @@ import { goto } from '$app/navigation'; import AvatarButton from './AvatarButton.svelte'; import Busqueda from './Busqueda.svelte'; + import Avatar from '@/components/ui/avatar/avatar.svelte'; + import AvatarImage from '@/components/ui/avatar/avatar-image.svelte'; let menuOpen = $state(false); const toggleMenu = () => (menuOpen = !menuOpen); @@ -49,7 +51,11 @@