get messages + client id from ws

This commit is contained in:
2025-06-07 13:36:08 +02:00
parent 988534ed01
commit 85a223d573
7 changed files with 75 additions and 30 deletions

View File

@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import type { IMessage } from '$lib/message'; import type { IMessage } from '$lib/message.svelte';
interface Props { interface Props {
message: IMessage; message: IMessage;

37
src/lib/message.svelte.ts Normal file
View File

@@ -0,0 +1,37 @@
import { getContext, setContext } from "svelte";
export interface IMessage {
senderId: number;
content: string;
};
export class MessageStore {
#clientId: number = $state(-1);
messages: IMessage[] = $state([]);
constructor(messages: IMessage[]) {
this.messages = messages;
}
setClientId(id: number) {
this.#clientId = id;
}
getClientId() {
return this.#clientId;
}
addMessage(message: IMessage) {
this.messages.push(message);
}
}
const MESSAGE_CONTEXT_SYMBOL = Symbol('MESSAGE_STORE');
export function setMessageStore(messages: IMessage[]): MessageStore {
return setContext(MESSAGE_CONTEXT_SYMBOL, new MessageStore(messages));
}
export function getMessageStore(): MessageStore {
return getContext(MESSAGE_CONTEXT_SYMBOL);
}

View File

@@ -1,4 +0,0 @@
export interface IMessage {
senderId: number;
content: string;
};

View File

@@ -1,8 +1,12 @@
import { MessageStore, type IMessage } from './message.svelte';
export class ChatSocket { export class ChatSocket {
#socket: WebSocket; #socket: WebSocket;
#store: MessageStore;
constructor(url: string) { constructor(url: string, store: MessageStore) {
this.#socket = new WebSocket(url); this.#socket = new WebSocket(url);
this.#store = store;
this.#socket.onopen = (e) => { this.#socket.onopen = (e) => {
this.#onOpen(e); this.#onOpen(e);
@@ -30,7 +34,15 @@ export class ChatSocket {
} }
#onMessage(e: MessageEvent) { #onMessage(e: MessageEvent) {
console.log('onMessage', e); const regex = /^\d+$/;
if (regex.test(e.data)) {
this.#store.setClientId(parseInt(e.data));
return;
}
const message: IMessage = JSON.parse(e.data);
this.#store.addMessage(message);
} }
#onClose(e: CloseEvent) { #onClose(e: CloseEvent) {

View File

@@ -4,14 +4,17 @@
import { ChatSocket } from '$lib/socket'; import { ChatSocket } from '$lib/socket';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import { setMessageStore } from '$lib/message.svelte';
let { children } = $props(); let { children } = $props();
let socket; let socket;
const store = setMessageStore([]);
onMount(() => { onMount(() => {
if (browser) { if (browser) {
socket = new ChatSocket('ws://localhost:3000/ws'); socket = new ChatSocket('ws://localhost:3000/ws', store);
} }
}); });
</script> </script>

View File

@@ -10,7 +10,5 @@ export const actions = {
method: 'POST', method: 'POST',
body: formData, body: formData,
}); });
console.log(response.status);
}, },
} satisfies Actions; } satisfies Actions;

View File

@@ -2,41 +2,40 @@
import { enhance } from '$app/forms'; import { enhance } from '$app/forms';
import { Button } from '$lib/components/ui/button'; import { Button } from '$lib/components/ui/button';
import { Input } from '$lib/components/ui/input'; import { Input } from '$lib/components/ui/input';
import { type IMessage } from '$lib/message'; import { getMessageStore } from '$lib/message.svelte';
import Message from '$lib/Message.svelte'; import Message from '$lib/Message.svelte';
import type { SubmitFunction } from '@sveltejs/kit'; import type { SubmitFunction } from '@sveltejs/kit';
const localId = 0; const messageStore = getMessageStore();
let messages: IMessage[] = [];
let messageContent: string = $state(''); let messageContent: string = $state('');
const sendMessage: SubmitFunction = async ({}) => { const sendMessage: SubmitFunction = async ({}) => {
return async ({update,result}) => { return async ({ update }) => {
await update({ await update({
invalidateAll: false, invalidateAll: false,
reset: true, reset: true
}); });
if (result.type === 'success') {
console.log('SUCCESS');
}
else {
console.log('SOMETHING WENT WRONG');
}
}; };
}; };
</script> </script>
<div class="flex flex-col border rounded-md h-full"> <div class="flex h-full flex-col rounded-md border">
<div class="flex flex-col gap-4 p-8 grow"> <div class="flex grow flex-col gap-4 p-8">
{#each messages as message} {#each messageStore.messages as message}
<Message {message} localSenderId={localId}/> <Message {message} localSenderId={messageStore.getClientId()} />
{/each} {/each}
</div> </div>
<form class="flex flex-row w-full" method="POST" action="?/send-message" use:enhance={sendMessage}> <form
<Input class="rounded-r-none" name="content" bind:value={messageContent}/> class="flex w-full flex-row"
<Button type="submit" class="rounded-l-none" disabled={messageContent.trim().length < 1}>Send</Button> method="POST"
action="?/send-message"
use:enhance={sendMessage}
>
<input type="hidden" name="client-id" value={messageStore.getClientId()} />
<Input class="rounded-r-none" name="content" bind:value={messageContent} autocomplete="off" />
<Button type="submit" class="rounded-l-none" disabled={messageContent.trim().length < 1}
>Send</Button
>
</form> </form>
</div> </div>