diff --git a/src/routes/app/+page.server.ts b/src/routes/app/+page.server.ts index 496f589..c30602f 100644 --- a/src/routes/app/+page.server.ts +++ b/src/routes/app/+page.server.ts @@ -487,6 +487,8 @@ export const actions = { await tx.delete(table.group).where(eq(table.group.id, groupId)); }); _sendToUser(locals.user!.id, { type: 'group', status: 'removed-from-group' }); + + return { success: true }; }, createServer: async ({ request, locals }) => { @@ -507,7 +509,8 @@ export const actions = { .set({ servers: locals.user!.servers.map((z) => z.id).concat([serverId]) }) .where(eq(table.user.id, locals.user!.id)); - redirect(303, `/app`); + _sendToUser(locals.user!.id, { type: 'server', status: 'server-created' }); + return { success: true }; } } satisfies Actions; diff --git a/src/routes/app/+page.svelte b/src/routes/app/+page.svelte index 6506b27..dfac08e 100644 --- a/src/routes/app/+page.svelte +++ b/src/routes/app/+page.svelte @@ -40,6 +40,8 @@ let currentPage: OverviewUser | OverviewGroup | OverviewServer | undefined = $state(); let currentSubPage: Channel | null = $state(null); + let sse: EventSource | undefined; + let messagesElement: HTMLDivElement | undefined = $state(); let isMembersTabOpen = $state(true); let members: UserWithStatus[] = $state([]); @@ -188,7 +190,9 @@ }); onMount(() => { - const sse = new EventSource('/api/updates'); + if (!sse) { + sse = new EventSource('/api/updates'); + } sse.addEventListener('message', async (e) => { const json = JSON.parse(e.data) as @@ -196,13 +200,18 @@ | { type: 'message'; message: ReturnMessage } | { type: 'status'; id: string; status: 1 | 2 | 3 } | { type: 'friends'; status: string } - | { type: 'group'; status: string }; - + | { type: 'group'; status: string } + | { type: 'server'; status: string }; if (json.type == 'friends') { toast('Invalidation from friends updates, recieved ' + json.status); await invalidateAll(); await fill_overview_data(); } + if (json.type == 'server') { + toast('Invalidation from servers updates, recieved ' + json.status); + await invalidateAll(); + await fill_overview_data(); + } if (json.type == 'group') { toast('Invalidation from group updates, recieved ' + json.status); if (json.status == 'removed-from-group' && GroupID.is(currentPageID)) { @@ -229,6 +238,17 @@ } if (json.type == 'message') { + if (!messagesElement) return; + + if ( + messagesElement.scrollTop === + messagesElement.scrollHeight - messagesElement.offsetHeight + ) { + setTimeout(() => { + if (!messagesElement) return; + messagesElement.scrollTop = messagesElement.scrollHeight; + }, 66.75); // FPS + } messages.push(json.message); } }); @@ -312,7 +332,7 @@

add invite creation, role creation, moderation, et cetera to this page.

{/if} {#if currentPageID && currentPage && ((ServerID.is(currentPageID) && ChannelID.is(currentSubPageID)) || UserID.is(currentPageID) || GroupID.is(currentPageID))} -
+
{#each messages as message, i (message.id)} {#if i === 0 || messages[i - 1].authorId !== message.authorId}