From d9e6aa0523f11fda814b3752445adf7285a92ffc Mon Sep 17 00:00:00 2001 From: Zeu Capua Date: Sat, 4 Jan 2025 23:23:56 -0800 Subject: [PATCH 1/4] implement settings dropdown & delete confirm dialog --- src/lib/components/PostItem.svelte | 67 ++++++++++++++++++-- src/lib/server/client.ts | 2 +- src/routes/+page.server.ts | 3 + src/routes/p/[handle]/[record]/+page@.svelte | 2 +- 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/lib/components/PostItem.svelte b/src/lib/components/PostItem.svelte index 1859dff..7eef505 100644 --- a/src/lib/components/PostItem.svelte +++ b/src/lib/components/PostItem.svelte @@ -1,17 +1,18 @@ + + + + + + Delete this post? + + + If you remove this post, you won't be able to recover it. + + + + + Cancel + + + Delete + + + + + +
@@ -120,10 +154,10 @@
- {#if !user} + {:else} + + + + + + + {#if data.post.author.did === user.did} + isDeleteDialogOpen = true} + class="text-red-400 cursor-pointer flex items-center px-2 py-1 gap-2 hover:bg-white/5 transition-all duration-150 rounded" + > + +

Delete post

+
+ {/if} +
+
{ + }, "saveDraft": async ({ url, request, locals }) => { const formData = await request.formData(); diff --git a/src/routes/p/[handle]/[record]/+page@.svelte b/src/routes/p/[handle]/[record]/+page@.svelte index 131cf6e..74b1948 100644 --- a/src/routes/p/[handle]/[record]/+page@.svelte +++ b/src/routes/p/[handle]/[record]/+page@.svelte @@ -22,7 +22,7 @@ } let { data }: Props = $props(); let author = data.author; - const user = page.data.user; + const user = page.data.user as ProfileViewDetailed | undefined; const bookmarks = page.data.bookmarks as Set; let isBookmarked = $state(bookmarks.has(data.recordUri) ?? false); From 5e693fdb60189d157a78555517dff3dbb3181aff Mon Sep 17 00:00:00 2001 From: Zeu Capua Date: Mon, 6 Jan 2025 00:34:13 -0800 Subject: [PATCH 2/4] working deletePost form action on confirm --- src/lib/components/PostItem.svelte | 9 ++++++--- src/routes/+page.server.ts | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/lib/components/PostItem.svelte b/src/lib/components/PostItem.svelte index 7eef505..54568c5 100644 --- a/src/lib/components/PostItem.svelte +++ b/src/lib/components/PostItem.svelte @@ -50,9 +50,12 @@ Cancel - - Delete - + + + + Delete + +
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 915eb34..3aa98f3 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -6,6 +6,7 @@ import { Agent, RichText } from "@atproto/api"; import { isValidHandle } from "@atproto/syntax"; import { renderTextToMarkdownToHTML } from "$lib/utils"; import { error, fail, redirect, type Actions } from "@sveltejs/kit"; +import { useQueryClient } from "@tanstack/svelte-query"; export const actions: Actions = { "login": async ({ cookies, request }) => { @@ -91,7 +92,24 @@ export const actions: Actions = { } }, "deletePost": async ({ request, locals }) => { + const formData = await request.formData(); + const post_uri = formData.get("post_uri") as string | undefined; + + try { + if (!(locals.agent instanceof Agent)) { + throw Error("Not logged in"); + } + + if (!post_uri) { + throw Error("Post URI not given"); + } + await locals.agent.deletePost(post_uri); + return { message: "deleted post", post_uri } + } + catch (e) { + return fail(500); + } }, "saveDraft": async ({ url, request, locals }) => { const formData = await request.formData(); From 417f7c101121a4d283ca3c4c58c587ef7fba0434 Mon Sep 17 00:00:00 2001 From: Zeu Capua Date: Mon, 13 Jan 2025 04:17:04 -0800 Subject: [PATCH 3/4] make delete form progressively enhance --- src/lib/components/PostItem.svelte | 428 +++++++++++++++-------------- 1 file changed, 224 insertions(+), 204 deletions(-) diff --git a/src/lib/components/PostItem.svelte b/src/lib/components/PostItem.svelte index 54568c5..6373f77 100644 --- a/src/lib/components/PostItem.svelte +++ b/src/lib/components/PostItem.svelte @@ -25,6 +25,7 @@ const record_id = data.post.uri.split("/").at(data.post.uri.split("/").length - 1); let isDeleteDialogOpen = $state(false); + let isDeleted = $state(false); @@ -50,7 +51,20 @@ Cancel -
+ { + return async ({ result }) => { + // @ts-ignore + if (result.data.uri === data.post.uri) { + isDeleted = true; + } + await applyAction(result); + } + }} + method="POST" + action="/?/deletePost" + class="basis-1/2" + > Delete @@ -61,230 +75,236 @@ -
-
-
- - {#if data.post.author.avatar} - {`${data.post.author.handle} - {:else} - - {/if} - -
+{#if isDeleted} +
+

This post has been deleted

+
+{:else} +
-
- {#if data.reason} - - - - - {`${data.reason.by!.handle - - - -
- -
-
+ {#if data.reason} + + + + + {`${data.reason.by!.handle + + + -

{data.reason.by!.displayName || "unknown"}

-

@{data.reason.by!.handle || "unknown"}

-
-
-
- {/if} -
-
- - {#if data.reply} - - {/if} +
+ +
+
+

{data.reason.by!.displayName || "unknown"}

+

@{data.reason.by!.handle || "unknown"}

+
+ + + {/if} +
+
+ + {#if data.reply} + + {/if} -

- {@html - // @ts-ignore - data.html - } -

+

+ {@html + // @ts-ignore + data.html + } +

- {#if data.post.embed} - - {/if} + {#if data.post.embed} + + {/if} + + +
+ {#if !user} + + + {:else} + + + + + + + {#if data.post.author.did === user.did} + isDeleteDialogOpen = true} + class="text-red-400 cursor-pointer flex items-center px-2 py-1 gap-2 hover:bg-white/5 transition-all duration-150 rounded" + > + +

Delete post

+
+ {/if} +
+
+ { + return async ({ result }) => { + // @ts-ignore + if (result.data.uri === data.post.uri) { + // @ts-ignore + isBookmarked = result.data.message === "bookmarked"; + } + await applyAction(result); + } + }} + > + + + + + {/if} +
- -
{#if !user} - - {:else} - - - - - - - {#if data.post.author.did === user.did} - isDeleteDialogOpen = true} - class="text-red-400 cursor-pointer flex items-center px-2 py-1 gap-2 hover:bg-white/5 transition-all duration-150 rounded" - > - -

Delete post

-
- {/if} -
-
-
+ + {data.post.replyCount} + + { - return async ({ result }) => { - // @ts-ignore - if (result.data.uri === data.post.uri) { + return async ({ result }) => { // @ts-ignore - isBookmarked = result.data.message === "bookmarked"; + if (result.data.uri === data.post.uri) { + // @ts-ignore + repostUri = result.data.repostUri; + if (repostUri) { reposts++; } + else { reposts--; } + } + await applyAction(result); } - await applyAction(result); - } - }} + }} > + - - - {/if} -
- - {#if !user} - - - {data.post.replyCount} - - - - {:else} - - - {data.post.replyCount} - -
{ - return async ({ result }) => { - // @ts-ignore - if (result.data.uri === data.post.uri) { - // @ts-ignore - repostUri = result.data.repostUri; - if (repostUri) { reposts++; } - else { reposts--; } - } - await applyAction(result); - } - }} - > - - - - -
-
{ - return async ({ result }) => { - // @ts-ignore - if (result.data.uri === data.post.uri) { + { + return async ({ result }) => { // @ts-ignore - likeUri = result.data.likeUri; - if (likeUri) { likes++; } - else { likes--; } + if (result.data.uri === data.post.uri) { + // @ts-ignore + likeUri = result.data.likeUri; + if (likeUri) { likes++; } + else { likes--; } + } + await applyAction(result); } - await applyAction(result); - } - }} - > - - - - -
- {/if} -
-
+ }} + > + + + + + + {/if} + + +{/if} From e59ea333096a72f03f0609d9e72c40f5c551b3cf Mon Sep 17 00:00:00 2001 From: Zeu Capua Date: Mon, 13 Jan 2025 08:44:56 -0800 Subject: [PATCH 4/4] update enhance checking --- src/lib/components/PostItem.svelte | 2 +- src/lib/server/client.ts | 2 +- src/routes/+page.server.ts | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/components/PostItem.svelte b/src/lib/components/PostItem.svelte index 6373f77..293183c 100644 --- a/src/lib/components/PostItem.svelte +++ b/src/lib/components/PostItem.svelte @@ -55,7 +55,7 @@ use:enhance={() => { return async ({ result }) => { // @ts-ignore - if (result.data.uri === data.post.uri) { + if (result.data.post_uri === data.post.uri) { isDeleted = true; } await applyAction(result); diff --git a/src/lib/server/client.ts b/src/lib/server/client.ts index 1b758df..ca93853 100644 --- a/src/lib/server/client.ts +++ b/src/lib/server/client.ts @@ -4,7 +4,7 @@ import { SessionStore, StateStore } from "./storage"; import { dev } from "$app/environment"; const publicUrl = "https://myb.zeu.dev"; -const url = dev ? "http://127.0.0.1:5173" : publicUrl; // since I'm using ipv6, use ::1 instead 127.0.0.1 +const url = dev ? "http://[::1]:5173" : publicUrl; // since I'm using ipv6, use [::1] instead 127.0.0.1 const enc = encodeURIComponent; export const atclient = new NodeOAuthClient({ diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 3aa98f3..1d88c31 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -6,7 +6,6 @@ import { Agent, RichText } from "@atproto/api"; import { isValidHandle } from "@atproto/syntax"; import { renderTextToMarkdownToHTML } from "$lib/utils"; import { error, fail, redirect, type Actions } from "@sveltejs/kit"; -import { useQueryClient } from "@tanstack/svelte-query"; export const actions: Actions = { "login": async ({ cookies, request }) => {