From 6b478885141061011b116d8ee66c926ebd0ae0de Mon Sep 17 00:00:00 2001 From: fucksophie Date: Wed, 7 Jan 2026 02:35:09 +0200 Subject: [PATCH] add ability to remove friends --- src/lib/components/app-sidebar.svelte | 66 +++++++++++++++++++++++++-- src/routes/app/+page.server.ts | 43 +++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/lib/components/app-sidebar.svelte b/src/lib/components/app-sidebar.svelte index 25599ec..7be235d 100644 --- a/src/lib/components/app-sidebar.svelte +++ b/src/lib/components/app-sidebar.svelte @@ -75,6 +75,7 @@ Outgoing Incoming + Manage Friends @@ -126,6 +127,28 @@ {/each} {/if} + + {#if data.friends.length === 0} +

You have no friends added.

+ {:else} + {#each data.friends as friend (friend.id)} + + + {friend.username} + Currently your friend + + +
+ + +
+
+
+ {/each} + {/if} +
@@ -145,10 +168,45 @@ {#each data.friends as friend (friend.id)} - + + + { + e.preventDefault(); + currentPage = friend.id; + }} + user={friend} + > + + + + + + + + + + Remove Friend + + Are you sure you want to remove {friend.username} from your friends? + + + + + + Cancel + + +
+ + +
+
+
+
+
{/each} diff --git a/src/routes/app/+page.server.ts b/src/routes/app/+page.server.ts index 336af27..2d70873 100644 --- a/src/routes/app/+page.server.ts +++ b/src/routes/app/+page.server.ts @@ -113,6 +113,49 @@ export const actions = { return { success: true }; }, + removeFriend: async ({ request, locals }) => { + const data = await request.formData(); + const userId = data.get('userId'); + + if (typeof userId !== 'string') { + return fail(400, { error: 'Invalid user ID' }); + } + + // verify we are actually friends + if (!locals.user?.friends.find((z) => z.id === userId)) { + return fail(400, { error: 'Not in friends list' }); + } + + // fetch the target user + const user = await db.select().from(table.user).where(eq(table.user.id, userId)).limit(1); + + if (!user?.length) { + return fail(404, { error: 'User not found' }); + } + + const target = user[0]; + + // remove each other from friends lists + await db.transaction(async (tx) => { + // update current user – filter out removed friend + await tx + .update(table.user) + .set({ + friends: locals.user!.friends.map((z) => z.id).filter((id) => id !== userId) + }) + .where(eq(table.user.id, locals.user!.id)); + + // update target user – filter out us + await tx + .update(table.user) + .set({ + friends: (target.friends as string[]).filter((id) => id !== locals.user!.id) + }) + .where(eq(table.user.id, target.id)); + }); + + return { success: true }; + }, cancelFriendRequest: async ({ request, locals }) => { const data = await request.formData(); const requestId = data.get('requestId');