diff --git a/src/lib/components/PostCard.svelte b/src/lib/components/PostCard.svelte index bf7cb96..4cacc46 100644 --- a/src/lib/components/PostCard.svelte +++ b/src/lib/components/PostCard.svelte @@ -30,13 +30,16 @@ import DialogDescription from './ui/dialog/dialog-description.svelte'; import { sesionStore } from '@/stores/usuario'; import { likePost } from '@/hooks/likePost'; + import { goto } from '$app/navigation'; + import { resolve } from '$app/paths'; interface postProp { post: Post; postAModificar: Post | null; + update?: Function; } - let { post, postAModificar = $bindable() }: postProp = $props(); + let { post, postAModificar = $bindable(), update }: postProp = $props(); let cargandoBorrar = $state(false); let mensajeError = $state(''); @@ -82,7 +85,7 @@ likePost(post), new Promise((resolve) => setTimeout(resolve, 300)) ]); - console.log(1); + // console.log(1); if (ok) { if (post.isLiked) { post.likesCount--; @@ -94,9 +97,10 @@ errorLike = true; mensajeError = message; } - console.log(1); - updatePostStore(post.id, post); - console.log(1); + // console.log(2); + if (update) update(); + else updatePostStore(post.id, post); + // console.log(3); cargandoLike = false; } @@ -179,7 +183,12 @@ {/if} - + + goto(resolve('/post/[idpost]', { idpost: post.id }))} + > {post.repliesCount} diff --git a/src/lib/components/crear-post.svelte b/src/lib/components/crear-post.svelte index 86b6ed8..7c21591 100644 --- a/src/lib/components/crear-post.svelte +++ b/src/lib/components/crear-post.svelte @@ -13,6 +13,9 @@ import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte'; import { publicarPost } from '@/hooks/publicarPost'; import { filtrarImagen } from '@/utils'; + import { invalidate } from '$app/navigation'; + + let { placeholder, parentPostId }: { placeholder?: string; parentPostId?: string } = $props(); let mensaje = $state(''); let imagen: File | null = $state(null); @@ -29,13 +32,14 @@ if (imagen) { formData.append('image', imagen); } - // formData.append('parentPostId', ''); + if (parentPostId) formData.append('parentPostId', parentPostId); mostrarError = await publicarPost(formData); if (mostrarError == '') { mensaje = ''; imagen = null; } cargando = false; + if (parentPostId) invalidate('post:respuestas'); } function handleKeydown(e: KeyboardEvent) { @@ -73,7 +77,7 @@ }} ondrop={handleDrop} maxlength={280} - placeholder="Alguna novedad?" + placeholder={placeholder ? placeholder : 'Alguna novedad?'} onkeydown={handleKeydown} > diff --git a/src/lib/hooks/obtenerPostPorId.ts b/src/lib/hooks/obtenerPostPorId.ts new file mode 100644 index 0000000..8271b65 --- /dev/null +++ b/src/lib/hooks/obtenerPostPorId.ts @@ -0,0 +1,30 @@ +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { get } from 'svelte/store'; +import type { Post } from '../../types'; + +export async function obtenerPostPorId( + idpost: string, + fetch2?: Function, + depends?: Function +): Promise { + if (idpost == '') return null; + if (depends) depends('post:post'); + const fetchFn = fetch2 ? fetch2 : fetch; + + try { + const req = await fetchFn(`${get(apiBase)}/api/posts/${idpost}`, { + method: 'GET', + headers: { + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + let data = await req.json(); + if (req.ok) { + return data; + } + return data.message; + } catch { + return 'No se pudo alcanzar el servidor.'; + } +} diff --git a/src/lib/hooks/obtenerRespuestasPorId.ts b/src/lib/hooks/obtenerRespuestasPorId.ts new file mode 100644 index 0000000..27124c7 --- /dev/null +++ b/src/lib/hooks/obtenerRespuestasPorId.ts @@ -0,0 +1,28 @@ +import { apiBase } from '@/stores/url'; +import { sesionStore } from '@/stores/usuario'; +import { get } from 'svelte/store'; +import type { Post } from '../../types'; + +export async function obtenerRespuestasPorId( + id: string, + fetch2?: Function, + depends?: Function +): Promise { + if (depends) depends('post:respuestas'); + const fetchFn = fetch2 ? fetch2 : fetch; + try { + const req = await fetchFn(`${get(apiBase)}/api/posts/${id}/replies`, { + method: 'GET', + headers: { + Authorization: `Bearer ${get(sesionStore)?.accessToken}` + } + }); + if (req.ok) { + const data = await req.json(); + return data; + } + return null; + } catch { + return 'No se pudo obtener del dato del servidor'; + } +} diff --git a/src/routes/post/[idpost]/+page.svelte b/src/routes/post/[idpost]/+page.svelte new file mode 100644 index 0000000..922ed6c --- /dev/null +++ b/src/routes/post/[idpost]/+page.svelte @@ -0,0 +1,79 @@ + + + + @{data.post.authorName} - {data.post?.content.substring(0, 7) ?? 'Post'}{data.post?.content + .length > 7 + ? '...' + : ''} + + + + + + + + {#if data.post} + + invalidate('post:post')} /> + + {:else} + + + + Cargando post… + + + {/if} + + + + + + + + + + + {#each data.respuestas as respuesta} + invalidate('post:post')} /> + {/each} + + + +{#if postAModificar} + + + +{/if} + +{#snippet Respuesta()}{/snippet} diff --git a/src/routes/post/[idpost]/+page.ts b/src/routes/post/[idpost]/+page.ts new file mode 100644 index 0000000..44ec681 --- /dev/null +++ b/src/routes/post/[idpost]/+page.ts @@ -0,0 +1,18 @@ +import { obtenerPostPorId } from '@/hooks/obtenerPostPorId.js'; +import { obtenerRespuestasPorId } from '@/hooks/obtenerRespuestasPorId'; +import { error } from '@sveltejs/kit'; + +export async function load({ params, fetch, depends }) { + let ret = await obtenerPostPorId(params.idpost, fetch, depends); + if (ret == null) return error(404, 'no existe un post con ese id.'); + if (typeof ret == 'string') return error(500, ret); + + let respuestas = await obtenerRespuestasPorId(params.idpost, fetch, depends); + if (respuestas == null) return error(404, 'no existe un post con ese id.'); + if (typeof respuestas == 'string') return error(500, respuestas); + + return { + post: ret, + respuestas: respuestas + }; +}
{post.repliesCount}