fix infnite sses being made, autoscroll messages

This commit is contained in:
Soph :3 2026-01-11 15:19:20 +02:00
parent 48f55ff164
commit 47eb2da5b3
2 changed files with 28 additions and 5 deletions

View file

@ -487,6 +487,8 @@ export const actions = {
await tx.delete(table.group).where(eq(table.group.id, groupId)); await tx.delete(table.group).where(eq(table.group.id, groupId));
}); });
_sendToUser(locals.user!.id, { type: 'group', status: 'removed-from-group' }); _sendToUser(locals.user!.id, { type: 'group', status: 'removed-from-group' });
return { success: true };
}, },
createServer: async ({ request, locals }) => { createServer: async ({ request, locals }) => {
@ -507,7 +509,8 @@ export const actions = {
.set({ servers: locals.user!.servers.map((z) => z.id).concat([serverId]) }) .set({ servers: locals.user!.servers.map((z) => z.id).concat([serverId]) })
.where(eq(table.user.id, locals.user!.id)); .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; } satisfies Actions;

View file

@ -40,6 +40,8 @@
let currentPage: OverviewUser | OverviewGroup | OverviewServer | undefined = $state(); let currentPage: OverviewUser | OverviewGroup | OverviewServer | undefined = $state();
let currentSubPage: Channel | null = $state(null); let currentSubPage: Channel | null = $state(null);
let sse: EventSource | undefined;
let messagesElement: HTMLDivElement | undefined = $state();
let isMembersTabOpen = $state(true); let isMembersTabOpen = $state(true);
let members: UserWithStatus[] = $state([]); let members: UserWithStatus[] = $state([]);
@ -188,7 +190,9 @@
}); });
onMount(() => { onMount(() => {
const sse = new EventSource('/api/updates'); if (!sse) {
sse = new EventSource('/api/updates');
}
sse.addEventListener('message', async (e) => { sse.addEventListener('message', async (e) => {
const json = JSON.parse(e.data) as const json = JSON.parse(e.data) as
@ -196,13 +200,18 @@
| { type: 'message'; message: ReturnMessage } | { type: 'message'; message: ReturnMessage }
| { type: 'status'; id: string; status: 1 | 2 | 3 } | { type: 'status'; id: string; status: 1 | 2 | 3 }
| { type: 'friends'; status: string } | { type: 'friends'; status: string }
| { type: 'group'; status: string }; | { type: 'group'; status: string }
| { type: 'server'; status: string };
if (json.type == 'friends') { if (json.type == 'friends') {
toast('Invalidation from friends updates, recieved ' + json.status); toast('Invalidation from friends updates, recieved ' + json.status);
await invalidateAll(); await invalidateAll();
await fill_overview_data(); 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') { if (json.type == 'group') {
toast('Invalidation from group updates, recieved ' + json.status); toast('Invalidation from group updates, recieved ' + json.status);
if (json.status == 'removed-from-group' && GroupID.is(currentPageID)) { if (json.status == 'removed-from-group' && GroupID.is(currentPageID)) {
@ -229,6 +238,17 @@
} }
if (json.type == 'message') { 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); messages.push(json.message);
} }
}); });
@ -312,7 +332,7 @@
<h1>add invite creation, role creation, moderation, et cetera to this page.</h1> <h1>add invite creation, role creation, moderation, et cetera to this page.</h1>
{/if} {/if}
{#if currentPageID && currentPage && ((ServerID.is(currentPageID) && ChannelID.is(currentSubPageID)) || UserID.is(currentPageID) || GroupID.is(currentPageID))} {#if currentPageID && currentPage && ((ServerID.is(currentPageID) && ChannelID.is(currentSubPageID)) || UserID.is(currentPageID) || GroupID.is(currentPageID))}
<div class="h-min shrink overflow-scroll"> <div class="h-min shrink overflow-y-scroll" bind:this={messagesElement}>
{#each messages as message, i (message.id)} {#each messages as message, i (message.id)}
{#if i === 0 || messages[i - 1].authorId !== message.authorId} {#if i === 0 || messages[i - 1].authorId !== message.authorId}
<div class="flex gap-2 px-4 py-2"> <div class="flex gap-2 px-4 py-2">