diff --git a/src/lib/clientWebsocket.svelte.ts b/src/lib/clientWebsocket.svelte.ts new file mode 100644 index 0000000..805ec9b --- /dev/null +++ b/src/lib/clientWebsocket.svelte.ts @@ -0,0 +1,46 @@ +import type { TypeMessage, TypeFullMessage } from '$lib'; +import type { Socket } from 'socket.io-client'; + +class Websocket { + private socket: Socket; + public messages: TypeMessage[] = $state([]); + private channel: string = ''; + + constructor(socket: Socket) { + this.socket = socket; + } + + connect() { + this.socket.on('message', (data: TypeFullMessage) => { + console.log('[ws] message received', data); + if (data.channel == this.channel) { + this.loadMessage(data); + } + }); + } + + // Change the current channel + updateChannel(newChannel: string) { + this.channel = newChannel; + this.messages = []; + } + + // Add message to local messages array + loadMessage(newMsg: TypeMessage) { + this.messages = [ + { + message: newMsg.message, + imageSrc: newMsg.imageSrc, + user: newMsg.user, + }, + ...this.messages, + ]; + } + + // Send a message + sendMessage(user: string, msg: string) { + if (this.socket) this.socket.emit('message', { id: user, content: msg, channel: this.channel }); + } +} + +export default Websocket; diff --git a/src/routes/channel/[channel]/+page.svelte b/src/routes/channel/[channel]/+page.svelte index 3e39edf..c740ddd 100644 --- a/src/routes/channel/[channel]/+page.svelte +++ b/src/routes/channel/[channel]/+page.svelte @@ -9,52 +9,24 @@ import Send from 'lucide-svelte/icons/send'; import Message from '$lib/components/message.svelte'; import { page } from '$app/state'; + import Websocket from '$lib/clientWebsocket.svelte'; - let { data }: { data: PageData } = $props(); - let user: string | undefined; - let socket: ReturnType | null = null; - let log: TypeMessage[] = $state([]); + const { data }: { data: PageData } = $props(); + + let user: string = uuidv4(); + let socket: Websocket | undefined = $state(); let msg: string = $state(''); const channel = $derived(page.params.channel); - function logEvent(newMsg: TypeMessage) { - log = [ - { - message: newMsg.message, - imageSrc: newMsg.imageSrc, - user: newMsg.user, - }, - ...log, - ]; - } - - function establishSocketIOConnection() { - if (socket) return; - socket = io(); - - socket.on('message', (data: TypeFullMessage) => { - console.log('[ws] message received', data); - if (data.channel == channel) { - logEvent(data); - } - }); - } - - function sendMessage() { - if (!socket) return; - socket.emit('message', { id: user, content: msg, channel: channel }); - msg = ''; - } - - // Clear the log whenever the channel changes - $effect(() => { - console.info(`Channel changed to ${channel}`); - log = []; + // Connect on page load + onMount(() => { + socket = new Websocket(io()); + socket.connect(); }); - onMount(() => { - establishSocketIOConnection(); - user = uuidv4(); + // Update channel on page refresh + $effect(() => { + if (socket) socket.updateChannel(channel); }); @@ -65,10 +37,15 @@ {/snippet}
- {@render message(log)} + {@render message(socket?.messages!)} {@render message(data.messages)}
-
+ { + socket?.sendMessage(user!, msg); + msg = ''; + }}>