diff --git a/bun.lock b/bun.lock index c2d60a1..efde82b 100644 --- a/bun.lock +++ b/bun.lock @@ -7,7 +7,7 @@ "dependencies": { "@firebase/auth": "^1.12.0", "@resvg/resvg-js": "^2.6.2", - "firebase": "^12.8.0", + "firebase": "^12.9.0", "mode-watcher": "^1.1.0", "satori": "^0.18.3", }, @@ -87,7 +87,7 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@firebase/ai": ["@firebase/ai@2.7.0", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x", "@firebase/app-types": "0.x" } }, "sha512-PwpCz+TtAMWICM7uQNO0mkSPpUKwrMV4NSwHkbVKDvPKoaQmSlO96vIz+Suw2Ao1EaUUsxYb5LGImHWt/fSnRQ=="], + "@firebase/ai": ["@firebase/ai@2.8.0", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x", "@firebase/app-types": "0.x" } }, "sha512-grWYGFPsSo+pt+6CYeKR0kWnUfoLLS3xgWPvNrhAS5EPxl6xWq7+HjDZqX24yLneETyl45AVgDsTbVgxeWeRfg=="], "@firebase/analytics": ["@firebase/analytics@0.10.19", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg=="], @@ -105,7 +105,7 @@ "@firebase/app-check-types": ["@firebase/app-check-types@0.5.3", "", {}, "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng=="], - "@firebase/app-compat": ["@firebase/app-compat@0.5.7", "", { "dependencies": { "@firebase/app": "0.14.7", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" } }, "sha512-MO+jfap8IBZQ+K8L2QCiHObyMgpYHrxo4Hc7iJgfb9hjGRW/z1y6LWVdT9wBBK+VJ7cRP2DjAiWQP+thu53hHA=="], + "@firebase/app-compat": ["@firebase/app-compat@0.5.8", "", { "dependencies": { "@firebase/app": "0.14.8", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" } }, "sha512-4De6SUZ36zozl9kh5rZSxKWULpgty27rMzZ6x+xkoo7+NWyhWyFdsdvhFsWhTw/9GGj0wXIcbTjwHYCUIUuHyg=="], "@firebase/app-types": ["@firebase/app-types@0.9.3", "", {}, "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw=="], @@ -127,9 +127,9 @@ "@firebase/database-types": ["@firebase/database-types@1.0.16", "", { "dependencies": { "@firebase/app-types": "0.9.3", "@firebase/util": "1.13.0" } }, "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw=="], - "@firebase/firestore": ["@firebase/firestore@4.10.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "@firebase/webchannel-wrapper": "1.0.5", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-fgF6EbpoagGWh5Vwfu/7/jYgBFwUCwTlPNVF/aSjHcoEDRXpRsIqVfAFTp1LD+dWAUcAKEK3h+osk8spMJXtxA=="], + "@firebase/firestore": ["@firebase/firestore@4.11.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "@firebase/webchannel-wrapper": "1.0.5", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-Zb88s8rssBd0J2Tt+NUXMPt2sf+Dq7meatKiJf5t9oto1kZ8w9gK59Koe1uPVbaKfdgBp++N/z0I4G/HamyEhg=="], - "@firebase/firestore-compat": ["@firebase/firestore-compat@0.4.4", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/firestore": "4.10.0", "@firebase/firestore-types": "3.0.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-JvxxIgi+D5v9BecjLA1YomdyF7LA6CXhJuVK10b4GtRrB3m2O2hT1jJWbKYZYHUAjTaajkvnos+4U5VNxqkI2w=="], + "@firebase/firestore-compat": ["@firebase/firestore-compat@0.4.5", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/firestore": "4.11.0", "@firebase/firestore-types": "3.0.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-yVX1CkVvqBI4qbA56uZo42xFA4TNU0ICQ+9AFDvYq9U9Xu6iAx9lFDAk/tN+NGereQQXXCSnpISwc/oxsQqPLA=="], "@firebase/firestore-types": ["@firebase/firestore-types@3.0.3", "", { "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q=="], @@ -451,7 +451,7 @@ "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], - "firebase": ["firebase@12.8.0", "", { "dependencies": { "@firebase/ai": "2.7.0", "@firebase/analytics": "0.10.19", "@firebase/analytics-compat": "0.2.25", "@firebase/app": "0.14.7", "@firebase/app-check": "0.11.0", "@firebase/app-check-compat": "0.4.0", "@firebase/app-compat": "0.5.7", "@firebase/app-types": "0.9.3", "@firebase/auth": "1.12.0", "@firebase/auth-compat": "0.6.2", "@firebase/data-connect": "0.3.12", "@firebase/database": "1.1.0", "@firebase/database-compat": "2.1.0", "@firebase/firestore": "4.10.0", "@firebase/firestore-compat": "0.4.4", "@firebase/functions": "0.13.1", "@firebase/functions-compat": "0.4.1", "@firebase/installations": "0.6.19", "@firebase/installations-compat": "0.2.19", "@firebase/messaging": "0.12.23", "@firebase/messaging-compat": "0.2.23", "@firebase/performance": "0.7.9", "@firebase/performance-compat": "0.2.22", "@firebase/remote-config": "0.8.0", "@firebase/remote-config-compat": "0.2.21", "@firebase/storage": "0.14.0", "@firebase/storage-compat": "0.4.0", "@firebase/util": "1.13.0" } }, "sha512-S1tCIR3ENecee0tY2cfTHfMkXqkitHfbsvqpCtvsT0Zi9vDB7A4CodAjHfHCjVvu/XtGy1LHLjOasVcF10rCVw=="], + "firebase": ["firebase@12.9.0", "", { "dependencies": { "@firebase/ai": "2.8.0", "@firebase/analytics": "0.10.19", "@firebase/analytics-compat": "0.2.25", "@firebase/app": "0.14.8", "@firebase/app-check": "0.11.0", "@firebase/app-check-compat": "0.4.0", "@firebase/app-compat": "0.5.8", "@firebase/app-types": "0.9.3", "@firebase/auth": "1.12.0", "@firebase/auth-compat": "0.6.2", "@firebase/data-connect": "0.3.12", "@firebase/database": "1.1.0", "@firebase/database-compat": "2.1.0", "@firebase/firestore": "4.11.0", "@firebase/firestore-compat": "0.4.5", "@firebase/functions": "0.13.1", "@firebase/functions-compat": "0.4.1", "@firebase/installations": "0.6.19", "@firebase/installations-compat": "0.2.19", "@firebase/messaging": "0.12.23", "@firebase/messaging-compat": "0.2.23", "@firebase/performance": "0.7.9", "@firebase/performance-compat": "0.2.22", "@firebase/remote-config": "0.8.0", "@firebase/remote-config-compat": "0.2.21", "@firebase/storage": "0.14.0", "@firebase/storage-compat": "0.4.0", "@firebase/util": "1.13.0" } }, "sha512-CwwTYoqZg6KxygPOaaJqIc4aoLvo0RCRrXoln9GoxLE8QyAwTydBaSLGVlR4WPcuOgN3OEL0tJLT1H4IU/dv7w=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], @@ -681,6 +681,8 @@ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], + "@firebase/app-compat/@firebase/app": ["@firebase/app@0.14.8", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "idb": "7.1.1", "tslib": "^2.1.0" } }, "sha512-WiE9uCGRLUnShdjb9iP20sA3ToWrBbNXr14/N5mow7Nls9dmKgfGaGX5cynLvrltxq2OrDLh1VDNaUgsnS/k/g=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.7.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw=="], @@ -699,6 +701,8 @@ "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "firebase/@firebase/app": ["@firebase/app@0.14.8", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "idb": "7.1.1", "tslib": "^2.1.0" } }, "sha512-WiE9uCGRLUnShdjb9iP20sA3ToWrBbNXr14/N5mow7Nls9dmKgfGaGX5cynLvrltxq2OrDLh1VDNaUgsnS/k/g=="], + "mode-watcher/runed": ["runed@0.25.0", "", { "dependencies": { "esm-env": "^1.0.0" }, "peerDependencies": { "svelte": "^5.7.0" } }, "sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg=="], "mode-watcher/svelte-toolbelt": ["svelte-toolbelt@0.7.1", "", { "dependencies": { "clsx": "^2.1.1", "runed": "^0.23.2", "style-to-object": "^1.0.8" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ=="], diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000..cae2f66 Binary files /dev/null and b/bun.lockb differ diff --git a/package.json b/package.json index cca7d3f..2566a83 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "@firebase/auth": "^1.12.0", "@resvg/resvg-js": "^2.6.2", - "firebase": "^12.8.0", + "firebase": "^12.9.0", "mode-watcher": "^1.1.0", "satori": "^0.18.3" } diff --git a/src/lib/components/CardPerfil.svelte b/src/lib/components/CardPerfil.svelte index d365baf..5f73e3b 100644 --- a/src/lib/components/CardPerfil.svelte +++ b/src/lib/components/CardPerfil.svelte @@ -29,6 +29,7 @@ let usu = $state({ displayName: data.displayName, bio: data.bio }); let contenido = $derived(() => { + if (data.bio == '') return ''; let t = data.bio .replaceAll('&', '') .replaceAll('<', '') @@ -134,7 +135,7 @@ {#if data.bio}

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

{/if} {/if} diff --git a/src/lib/components/MostrarVolver.svelte.ts b/src/lib/components/MostrarVolver.svelte.ts new file mode 100644 index 0000000..0eca109 --- /dev/null +++ b/src/lib/components/MostrarVolver.svelte.ts @@ -0,0 +1,16 @@ +export class MostrarVolver { + scrollY = $state(0); + value = $derived(this.scrollY > 500); + + constructor() { + if (typeof window !== 'undefined') { + $effect(() => { + const handleScroll = () => { + this.scrollY = window.scrollY; + }; + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }); + } + } +} diff --git a/src/lib/components/TablaUsuarios.svelte b/src/lib/components/TablaUsuarios.svelte index 9d81d50..fb67d66 100644 --- a/src/lib/components/TablaUsuarios.svelte +++ b/src/lib/components/TablaUsuarios.svelte @@ -33,10 +33,12 @@ interface Props { usuarios: UserResponseDto[]; + hayMas: boolean; } - let { usuarios = $bindable() }: Props = $props(); + let { usuarios = $bindable(), hayMas }: Props = $props(); + let hayMass = $state(hayMas); let open = $state(false); let openModificarUsuario = $state(false); let openDarAdmin = $state(false); @@ -82,6 +84,7 @@ const sb = b[key].toString().toLowerCase(); return sortDirection === 'asc' ? sa.localeCompare(sb) : sb.localeCompare(sa); }); + paginaActual = 1; } function getSortIcon(campo: SortKey) { @@ -111,7 +114,6 @@ // $inspect(usuarios); let timeoutId: ReturnType | number | undefined; - function buscarUsuarios() { if (timeoutId) { clearTimeout(timeoutId); @@ -119,16 +121,24 @@ timeoutId = setTimeout(async () => { if (search === '') { - usuariosFiltrados = usuarios; - return; + search = ''; } - usuariosFiltrados = await busquedaAdminUsuarios(search); + let ret = await busquedaAdminUsuarios(search, ITEMS_POR_PAGINA, paginaActual); + usuariosFiltrados = ret.usuarios; + hayMass = ret.hayMas; }, 200); return () => { if (timeoutId) clearTimeout(timeoutId); }; } + const ITEMS_POR_PAGINA = 5; + + let paginaActual = $state(1); + + // const usuariosPaginados = $derived( + // usuariosFiltrados.slice((paginaActual - 1) * ITEMS_POR_PAGINA, paginaActual * ITEMS_POR_PAGINA) + // );
@@ -241,6 +251,27 @@ {/if} +
+ + + +
diff --git a/src/lib/components/VolverArriba.svelte b/src/lib/components/VolverArriba.svelte new file mode 100644 index 0000000..83d80db --- /dev/null +++ b/src/lib/components/VolverArriba.svelte @@ -0,0 +1,27 @@ + + +{#if mostrarVolver.value} +
+
+ +
+
+{/if} diff --git a/src/lib/head/Header.svelte b/src/lib/head/Header.svelte index b2cc441..cce83a4 100644 --- a/src/lib/head/Header.svelte +++ b/src/lib/head/Header.svelte @@ -50,13 +50,13 @@
- + diff --git a/src/lib/hooks/UsuariosAdmin.ts b/src/lib/hooks/UsuariosAdmin.ts new file mode 100644 index 0000000..94e5ed3 --- /dev/null +++ b/src/lib/hooks/UsuariosAdmin.ts @@ -0,0 +1,25 @@ +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { redirect } from '@sveltejs/kit'; +import { get } from 'svelte/store'; +import type { UserResponseDto } from '../../types'; + +export async function fetchUsuariosAdmin(page: number, limit: number) { + let response = await fetch(get(apiBase) + `/api/admin/users?page=${page}&pageSize=${limit}`, { + 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 ret: { usuarios: UserResponseDto[]; hayMas: boolean } = await response.json(); + return { ret, error: false }; +} diff --git a/src/lib/hooks/busquedaAdminUsuarios.ts b/src/lib/hooks/busquedaAdminUsuarios.ts index ce1b2d1..0234190 100644 --- a/src/lib/hooks/busquedaAdminUsuarios.ts +++ b/src/lib/hooks/busquedaAdminUsuarios.ts @@ -2,15 +2,19 @@ import { apiBase } from '@/stores/url'; import { sesionStore } from '@/stores/usuario'; import { get } from 'svelte/store'; -export async function busquedaAdminUsuarios(q: string) { +export async function busquedaAdminUsuarios(q: string, limit = 5, page = 1) { try { - const response = await fetch(get(apiBase) + '/api/admin/users?q=' + q, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${get(sesionStore)?.accessToken}` + const response = await fetch( + get(apiBase) + + `/api/admin/users${q ? `?q=${q}` : ''}${q ? '&' : '?'}page=${page}&pageSize=${limit}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } } - }); + ); if (response.ok) { return await response.json(); } diff --git a/src/lib/hooks/loadMorePosts.ts b/src/lib/hooks/loadMorePosts.ts index 8a89428..e7bd55f 100644 --- a/src/lib/hooks/loadMorePosts.ts +++ b/src/lib/hooks/loadMorePosts.ts @@ -1,5 +1,5 @@ import { get } from 'svelte/store'; -import { page, loadingPosts, PAGE_SIZE } from '@/stores/posts'; +import { page, loadingPosts, PAGE_SIZE, resetPosts } from '@/stores/posts'; import { appendPosts } from '@/stores/posts'; import { getPosts } from './getPosts'; diff --git a/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts index 9f7e2fb..97384c7 100644 --- a/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts +++ b/src/lib/hooks/obtenerCantidadDeUsosdeHtag.ts @@ -2,14 +2,18 @@ import { apiBase } from '@/stores/url'; import { sesionStore } from '@/stores/usuario'; import { get } from 'svelte/store'; -export async function obtenerCantidadDeUsosdeHtag(htag: string, fetch2?: Function) { +export async function obtenerCantidadDeUsosdeHtag( + htag: string, + fetch2?: Function, + page: number = 1, + limit: number = 20,) { if (!htag) return null; const fetchFn = fetch2 || fetch; try { - const req = await fetchFn(`${get(apiBase)}/api/posts/hashtag/${htag}`, { + const req = await fetchFn(`${get(apiBase)}/api/posts/hashtag/${htag}?page=${page}&pageSize=${limit}`, { method: 'GET', headers: { - Authorization: `Bearer ${get(sesionStore)?.accessToken}` + Authorization: `Bearer ${get(sesionStore)?.accessToken || ''}` } }); if (req.ok) { diff --git a/src/lib/hooks/obtenerPostPorId.ts b/src/lib/hooks/obtenerPostPorId.ts index 8271b65..20ddb6a 100644 --- a/src/lib/hooks/obtenerPostPorId.ts +++ b/src/lib/hooks/obtenerPostPorId.ts @@ -16,7 +16,7 @@ export async function obtenerPostPorId( const req = await fetchFn(`${get(apiBase)}/api/posts/${idpost}`, { method: 'GET', headers: { - Authorization: `Bearer ${get(sesionStore)?.accessToken}` + Authorization: `Bearer ${get(sesionStore)?.accessToken || ''}` } }); let data = await req.json(); diff --git a/src/lib/hooks/obtenerRespuestasPorId.ts b/src/lib/hooks/obtenerRespuestasPorId.ts index bf3264f..3877a52 100644 --- a/src/lib/hooks/obtenerRespuestasPorId.ts +++ b/src/lib/hooks/obtenerRespuestasPorId.ts @@ -15,7 +15,7 @@ export async function obtenerRespuestasPorId( const req = await fetchFn(`${get(apiBase)}/api/posts/${id}/replies?page=${page}`, { method: 'GET', headers: { - Authorization: `Bearer ${get(sesionStore)?.accessToken}` + Authorization: `Bearer ${get(sesionStore)?.accessToken || ''}` } }); if (req.ok) { diff --git a/src/lib/stores/firebase.ts b/src/lib/stores/firebase.ts index d032b93..df9204b 100644 --- a/src/lib/stores/firebase.ts +++ b/src/lib/stores/firebase.ts @@ -34,4 +34,4 @@ export function getFirebaseAuth(): Auth { auth = getAuth(getFirebaseApp()); } return auth; -} +} \ No newline at end of file diff --git a/src/lib/stores/posts.ts b/src/lib/stores/posts.ts index cb19b9b..545f67b 100644 --- a/src/lib/stores/posts.ts +++ b/src/lib/stores/posts.ts @@ -1,7 +1,7 @@ import { writable } from 'svelte/store'; import type { Post } from '../../types'; -export const posts = writable([]); +export const posts = writable(null); export const loadingPosts = writable(false); export const page = writable(1); diff --git a/src/lib/stores/usuario.ts b/src/lib/stores/usuario.ts index 0436f16..c875be6 100644 --- a/src/lib/stores/usuario.ts +++ b/src/lib/stores/usuario.ts @@ -61,7 +61,7 @@ if (browser) { const user = auth.currentUser; if (user) { - const token = await user.getIdToken(true); + const token = await user.getIdToken(); currentSesion.update((s) => { if (s) { return { ...s, accessToken: token }; @@ -72,6 +72,7 @@ if (browser) { } } catch (error) { console.error('Error obteniendo token de Firebase:', error); + sesionStore.reset(); return false; } } @@ -81,8 +82,14 @@ if (browser) { const expirationTime = decoded.exp * 1000; const currentTime = Date.now(); - const timeUntilExpiration = expirationTime - currentTime; + // Si el token ya expiró, hacer reset + if (expirationTime < currentTime) { + sesionStore.reset(); + return false; + } + + const timeUntilExpiration = expirationTime - currentTime; return timeUntilExpiration <= 60 * 1000; // 1 minuto }; @@ -117,7 +124,7 @@ if (browser) { } } catch (error) { console.error('Error refrescando token:', error); - currentSesion.set(null); + sesionStore.reset(); } }; diff --git a/src/routes/(privado)/admin/+page.svelte b/src/routes/(privado)/admin/+page.svelte index ea7a515..4a69be7 100644 --- a/src/routes/(privado)/admin/+page.svelte +++ b/src/routes/(privado)/admin/+page.svelte @@ -10,6 +10,7 @@ interface Prop { data: { usuarios?: UserResponseDto[]; + hayMas: boolean; error: boolean; }; } @@ -31,7 +32,7 @@ {#if data.usuarios?.length === 0} No hay usuarios que mostar {:else} - + {/if} diff --git a/src/routes/(privado)/admin/+page.ts b/src/routes/(privado)/admin/+page.ts index 4808e7b..17ad0f9 100644 --- a/src/routes/(privado)/admin/+page.ts +++ b/src/routes/(privado)/admin/+page.ts @@ -1,28 +1,19 @@ -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'; +import type { PageLoad } from './$types.js'; +import { fetchUsuariosAdmin } from '@/hooks/UsuariosAdmin.js'; export const ssr = false; -export async function load({ depends, fetch }) { +export const load: PageLoad = async ({ depends }) => { depends('admin: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) { + const result = await fetchUsuariosAdmin(1, 5); + + if (result.error) { return { error: true }; } - const usuarios: UserResponseDto[] = await response.json(); - - return { usuarios, error: false }; -} + return { + usuarios: result.ret?.usuarios, + hayMas: result.ret?.hayMas, + error: false + }; +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 6492f55..e303bf5 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -20,6 +20,8 @@ let mensajeError = $state(''); let sentinel: HTMLDivElement; + // $inspect($posts); + resetPosts(); $effect(() => { loadMorePosts(); @@ -78,19 +80,13 @@ {/if}
- {#if $posts.length === 0 && $loadingPosts} + {#if $posts === null || $posts.length === 0}

Cargando

- {:else if $posts.length === 0} - - -

No hay Posts que mostrar

-
-
{:else} {#each $posts as post (post.id)}
@@ -101,7 +97,7 @@
- {#if $loadingPosts && $posts.length > 0} + {#if $loadingPosts && $posts!.length > 0}
diff --git a/src/routes/[perfil]/+page.svelte b/src/routes/[perfil]/+page.svelte index 50dd647..a79e792 100644 --- a/src/routes/[perfil]/+page.svelte +++ b/src/routes/[perfil]/+page.svelte @@ -54,7 +54,7 @@ `${$apiBase}/api/posts/user/${params.perfil}?page=${pageNumber}&pageSize=20`, { headers: { - Authorization: `Bearer ${$sesionStore?.accessToken}` + Authorization: `Bearer ${$sesionStore?.accessToken || ''}` } } ); diff --git a/src/routes/htag/[htag]/+page.svelte b/src/routes/htag/[htag]/+page.svelte index 90b028b..b31e641 100644 --- a/src/routes/htag/[htag]/+page.svelte +++ b/src/routes/htag/[htag]/+page.svelte @@ -10,6 +10,26 @@ import { updatePost } from '@/hooks/updatePost'; import Separator from '@/components/ui/separator/separator.svelte'; import { page } from '$app/state'; + import { obtenerCantidadDeUsosdeHtag } from '@/hooks/obtenerCantidadDeUsosdeHtag'; + + let currentPage = $state(1); + let loading = $state(false); + + async function cargarPagina(pageNumber: number) { + loading = true; + const res = await obtenerCantidadDeUsosdeHtag( + data.htag, + fetch, + pageNumber, + 20 + ); + + if (res) { + setPosts(res.response); + currentPage = pageNumber; + } + loading = false; + } interface props { data: { @@ -78,6 +98,27 @@
+
+ + + + Página {currentPage} + + + +
{#if postAModificar}
diff --git a/src/routes/post/[idpost]/+page.svelte b/src/routes/post/[idpost]/+page.svelte index 4e01809..aea05d0 100644 --- a/src/routes/post/[idpost]/+page.svelte +++ b/src/routes/post/[idpost]/+page.svelte @@ -16,7 +16,6 @@ import { sesionStore } from '@/stores/usuario'; import { likePost } from '@/hooks/likePost'; import ThumbsUp from '@lucide/svelte/icons/thumbs-up'; - import { TamañoPantalla } from './TamañoPantalla.svelte'; import BotonSeguir from '@/components/BotonSeguir.svelte'; import Pen from '@lucide/svelte/icons/pen'; import Trash_2 from '@lucide/svelte/icons/trash-2'; @@ -26,6 +25,7 @@ import { deletePost } from '@/hooks/deletePost'; import { flip } from 'svelte/animate'; import { obtenerRespuestasPorId } from '@/hooks/obtenerRespuestasPorId'; + import VolverArriba from '@/components/VolverArriba.svelte'; interface Prop { data: { @@ -34,8 +34,6 @@ }; } - let tamaño = new TamañoPantalla(); - let { data }: Prop = $props(); let respuestasPaginadas: Post[] = $state([]); @@ -94,7 +92,7 @@
{#if data.post} -
+
invalidate('post:post')} />
{:else} @@ -105,10 +103,12 @@ {/if} -
- -
- + {#if $sesionStore} +
+ +
+ + {/if}
@@ -154,6 +154,8 @@
{/if} + + {#snippet Respuesta(post: Post)}
@@ -211,8 +213,8 @@ Borrar + {/if} -

diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index 618bcf3..794cd53 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -6,8 +6,12 @@ import FireBaseButton from '@/components/FireBaseButton.svelte'; import Card from '@/components/ui/card/card.svelte'; import CardContent from '@/components/ui/card/card-content.svelte'; + import Dialog from '@/components/ui/dialog/dialog.svelte'; + import DialogContent from '@/components/ui/dialog/dialog-content.svelte'; + import Spinner from '@/components/ui/spinner/spinner.svelte'; let showAlert: boolean = $state(false); + let openload = $state(false); $effect(() => { resetAlert(); @@ -26,7 +30,7 @@ - + (openload = true)}> @@ -42,6 +46,14 @@

+{#if openload} + + + + + +{/if} +