From 9cc5831cfc6a8d7ec1d6189a7f7a7eb0fcccbdae Mon Sep 17 00:00:00 2001
From: fede
Date: Mon, 8 Dec 2025 13:37:23 -0300
Subject: [PATCH 01/22] separada la logica de publicar el post a la del manejo
del front
---
src/lib/components/crear-post.svelte | 38 +++++++---------------------
src/lib/hooks/publicarPost.ts | 27 ++++++++++++++++++++
2 files changed, 36 insertions(+), 29 deletions(-)
create mode 100644 src/lib/hooks/publicarPost.ts
diff --git a/src/lib/components/crear-post.svelte b/src/lib/components/crear-post.svelte
index 62c0748..7aa3710 100644
--- a/src/lib/components/crear-post.svelte
+++ b/src/lib/components/crear-post.svelte
@@ -14,6 +14,7 @@
import { Tooltip } from './ui/tooltip';
import TooltipContent from './ui/tooltip/tooltip-content.svelte';
import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte';
+ import { publicarPost } from '@/hooks/publicarPost';
let mensaje = $state('');
@@ -22,35 +23,14 @@
async function handlePost(e: Event) {
e.preventDefault();
- try {
- const formData = new FormData();
- formData.append('content', mensaje);
- // formData.append('imageUrl', '');
- // formData.append('parentPostId', '');
-
- const req = fetch($apiBase + '/api/posts', {
- method: 'POST',
- //credentials: 'include',
- headers: {
- Authorization: `Bearer ${$sesionStore?.accessToken}`
- },
- body: formData
- });
- cargando = true;
-
- const res = await req;
- if (res.ok) {
- mensaje = '';
- const post = await res.json();
- addPost(post);
- return;
- }
- mostrarError = 'No se pudo crear el post.';
- } catch {
- mostrarError = 'Fallo al alcanzar el servidor';
- } finally {
- cargando = false;
- }
+ cargando = true;
+ const formData = new FormData();
+ formData.append('content', mensaje);
+ // formData.append('imageUrl', '');
+ // formData.append('parentPostId', '');
+ mostrarError = await publicarPost(formData);
+ if (mostrarError == '') mensaje = '';
+ cargando = false;
}
function handleKeydown(e: KeyboardEvent) {
diff --git a/src/lib/hooks/publicarPost.ts b/src/lib/hooks/publicarPost.ts
new file mode 100644
index 0000000..8ddb6f0
--- /dev/null
+++ b/src/lib/hooks/publicarPost.ts
@@ -0,0 +1,27 @@
+import { addPost } from "@/stores/posts";
+import { apiBase } from "@/stores/url";
+import { sesionStore } from "@/stores/usuario";
+import { get } from "svelte/store";
+
+export async function publicarPost(formData: FormData){
+ try{
+ const req = fetch(get(apiBase) + '/api/posts', {
+ method: 'POST',
+ //credentials: 'include',
+ headers: {
+ Authorization: `Bearer ${get(sesionStore)?.accessToken}`
+ },
+ body: formData
+ });
+
+ const res = await req;
+ if (res.ok) {
+ const post = await res.json();
+ addPost(post);
+ return '';
+ }
+ return 'No se pudo crear el post.';
+ } catch {
+ return 'Fallo al alcanzar el servidor';
+ }
+}
From 28a22563fe961f0a5d3d0531cf0f868b24177519 Mon Sep 17 00:00:00 2001
From: fede
Date: Mon, 8 Dec 2025 13:52:57 -0300
Subject: [PATCH 02/22] cambiada interfaz mobile del header
---
src/lib/head/Header.svelte | 55 +-------------------------------------
1 file changed, 1 insertion(+), 54 deletions(-)
diff --git a/src/lib/head/Header.svelte b/src/lib/head/Header.svelte
index 1791b52..145f2fb 100644
--- a/src/lib/head/Header.svelte
+++ b/src/lib/head/Header.svelte
@@ -53,15 +53,10 @@
-
- {#if $sesionStore !== null}
-
- {/if}
-
-
+
{#if showCerrarSesion}
{#if $sesionStore !== null}
@@ -83,53 +78,5 @@
{/if}
-
-
-
-
-
- {#if menuOpen}
-
-
-
-
-
-
-
-
- {/if}
From 27eae9cb62f188e49bc893e1a2d68a30a3a4be0d Mon Sep 17 00:00:00 2001
From: fede
Date: Mon, 8 Dec 2025 13:53:44 -0300
Subject: [PATCH 03/22] =?UTF-8?q?a=C3=B1adido=20un=20skeleton=20de=20la=20?=
=?UTF-8?q?ui=20para=20el=20adjuntar=20imagenes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/lib/components/crear-post.svelte | 52 ++++++++++++++++------------
1 file changed, 30 insertions(+), 22 deletions(-)
diff --git a/src/lib/components/crear-post.svelte b/src/lib/components/crear-post.svelte
index 7aa3710..0078df4 100644
--- a/src/lib/components/crear-post.svelte
+++ b/src/lib/components/crear-post.svelte
@@ -4,6 +4,7 @@
import InputGroupTextarea from './ui/input-group/input-group-textarea.svelte';
import InputGroup from './ui/input-group/input-group.svelte';
import ArrowUpIcon from '@lucide/svelte/icons/arrow-up';
+ import Paperclip from '@lucide/svelte/icons/paperclip';
import Loader2Icon from '@lucide/svelte/icons/loader-2';
import Kbd from './ui/kbd/kbd.svelte';
@@ -15,6 +16,8 @@
import TooltipContent from './ui/tooltip/tooltip-content.svelte';
import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte';
import { publicarPost } from '@/hooks/publicarPost';
+ import Button from './ui/button/button.svelte';
+ import InputGroupInput from './ui/input-group/input-group-input.svelte';
let mensaje = $state('');
@@ -57,28 +60,33 @@
/ 280
-
-
-
- {#if cargando}
-
- Publicando...
- {:else}
- Publicar
-
- {/if}
-
-
-
- Ctrl+Enter
-
-
+
+
+
+
+
+
+
+ {#if cargando}
+
+ Publicando...
+ {:else}
+ Publicar
+
+ {/if}
+
+
+
+ Ctrl+Enter
+
+
+
From d08d2521b61e9d98c1b26db1eadb986e4ad33d2f Mon Sep 17 00:00:00 2001
From: fede
Date: Mon, 8 Dec 2025 14:29:51 -0300
Subject: [PATCH 04/22] =?UTF-8?q?a=C3=B1adido=20boton=20para=20desseleccio?=
=?UTF-8?q?nar=20imagen=20+=20un=20preview=20de=20la=20imagen=20selecciona?=
=?UTF-8?q?da?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/lib/components/crear-post.svelte | 56 +++++++++++++++++++++++-----
src/lib/utils.ts | 11 ++++++
2 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/src/lib/components/crear-post.svelte b/src/lib/components/crear-post.svelte
index 0078df4..fd2aaed 100644
--- a/src/lib/components/crear-post.svelte
+++ b/src/lib/components/crear-post.svelte
@@ -5,21 +5,17 @@
import InputGroup from './ui/input-group/input-group.svelte';
import ArrowUpIcon from '@lucide/svelte/icons/arrow-up';
import Paperclip from '@lucide/svelte/icons/paperclip';
+ import Trash from '@lucide/svelte/icons/trash-2';
import Loader2Icon from '@lucide/svelte/icons/loader-2';
import Kbd from './ui/kbd/kbd.svelte';
-
- import { apiBase } from '@/stores/url';
- import { sesionStore } from '@/stores/usuario';
- import type { CreatePostDto } from '../../types';
- import { addPost } from '@/stores/posts';
import { Tooltip } from './ui/tooltip';
import TooltipContent from './ui/tooltip/tooltip-content.svelte';
import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte';
import { publicarPost } from '@/hooks/publicarPost';
- import Button from './ui/button/button.svelte';
- import InputGroupInput from './ui/input-group/input-group-input.svelte';
+ import { filtrarImagen } from '@/utils';
let mensaje = $state('');
+ let imagen: File | null = $state(null);
let cargando = $state(false);
let mostrarError = $state('');
@@ -29,7 +25,7 @@
cargando = true;
const formData = new FormData();
formData.append('content', mensaje);
- // formData.append('imageUrl', '');
+ formData.append('imagen', imagen);
// formData.append('parentPostId', '');
mostrarError = await publicarPost(formData);
if (mostrarError == '') mensaje = '';
@@ -41,12 +37,29 @@
handlePost(e);
}
}
+
+ function handleDrop(e: Event) {
+ const target = e.target as HTMLInputElement;
+ const file = target?.files?.[0];
+ imagen = filtrarImagen(file);
+ }
+ function seleccionarImagen() {
+ const input = document.createElement('input');
+ input.type = 'file';
+ input.accept = '.png,.jpg,.jpeg,.gif,.webp';
+ input.onchange = () => {
+ const file = input.files?.[0];
+ imagen = filtrarImagen(file);
+ };
+ input.click();
+ }