From 2be61910c3d91b28cb9740bb6c040d78d5cd96a4 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Wed, 24 Sep 2025 20:09:18 +0200 Subject: [PATCH] Working frontend --- src/app/server/[id]/page.tsx | 85 +++++++++++++++++++++++++++++------ src/components/MessageBox.tsx | 22 +++++---- src/test/auth.js | 21 +++++---- src/types/message.ts | 10 ++--- 4 files changed, 102 insertions(+), 36 deletions(-) diff --git a/src/app/server/[id]/page.tsx b/src/app/server/[id]/page.tsx index 7a9af9e..b935e0b 100644 --- a/src/app/server/[id]/page.tsx +++ b/src/app/server/[id]/page.tsx @@ -1,10 +1,65 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import { useParams } from "next/navigation"; import MessageBox from "@/components/MessageBox"; import AppSidebar from "@/components/Sidebar"; +import { getUser } from '@/test/user'; +import { auth } from '@/test/auth'; +import Message from "@/types/message"; -export default async function Server(params: { - params: Promise<{ id: string }>; -}) { - const { id } = await params.params; +export default function Server() { + const { id } = useParams<{ id: string }>(); + const wsRef = useRef(null); + const [messages, setMessages] = useState([]); + + useEffect(() => { + if (!id) return; + + getUser().then(session_token => { + auth(session_token, id === 'localhost' ? '127.0.0.1' : id).then(server_auth => { + // Open the WebSocket connection + const ws = new WebSocket(`ws://${id}:7080`); + wsRef.current = ws; + + ws.onopen = () => { + console.log("Connected to WebSocket:", id); + ws.send(JSON.stringify({ + version: '0.0.1', + auth_token: server_auth, + last_message: 0 + })) + }; + + ws.onmessage = (m) => { + const data = JSON.parse(m.data); + console.log("Message received:", data); + + switch (data.type) { + case 'authenticated': + setMessages(data.params.messages); + + case 'message_create': + // setMessages([...messages, data.params]); + setMessages((prev) => [...prev, data.params]); + } + }; + + ws.onerror = (err) => { + console.error("WebSocket error:", err); + }; + + ws.onclose = () => { + console.log("WebSocket closed:", id); + }; + + // Cleanup on unmount or id change + return () => { + ws.close(); + }; + }); + }) + }, [id]); return ( m.channel_id === 'general').toReversed()} + sendMessage={(message) => { + wsRef.current?.send(JSON.stringify( + { + type: 'send_message', + params: { + channel_id: 'general', + contents: message + } + } + )); + }} /> ); diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index b634907..0f277fa 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -23,19 +23,19 @@ function MessageContainer({ message }: { message: Message }) {
- {message.authorId} + {message.from}

- {isToday(message.timestamp) - ? format(message.timestamp, "p") - : isYesterday(message.timestamp) - ? "Yesterday, " + format(message.timestamp, "p") - : format(message.timestamp, "PP, p")} + {isToday(message.timestamp * 1000) + ? format(message.timestamp * 1000, "p") + : isYesterday(message.timestamp * 1000) + ? "Yesterday, " + format(message.timestamp * 1000, "p") + : format(message.timestamp * 1000, "PP, p")}

- {message.content.split("\n\n").map((line, index) => ( + {message.contents.split("\n\n").map((line, index) => (
{index > 0 &&
} void }) { const [text, setText] = useState(""); return ( @@ -102,6 +102,12 @@ export default function MessageBox({ messages }: { messages: Message[] }) { placeholder="Type a message..." value={text} onChange={(e) => setText(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + sendMessage(text); + setText(''); + } + }} /> diff --git a/src/test/auth.js b/src/test/auth.js index dac9e4e..b5539bc 100644 --- a/src/test/auth.js +++ b/src/test/auth.js @@ -1,16 +1,19 @@ import axios from "axios"; import { getUser } from "./user.js"; -const session_token = await getUser(); +export async function auth(session_token, server_ip) { + const res = (await axios.post('http://localhost:3000/api/auth', { + server_ip, + session_token, + })).data; -const res = (await axios.post('http://localhost:3000/api/auth', { - intents: 'server', - server_ip: '127.0.0.1', - session_token, -})).data; + return res.token; +} -const token = res.token; +// const session_token = await getUser(); -const output = (await axios.get('http://localhost:3000/api/auth?intents=server&token='+token)).data; +// const token = await auth(session_token); -console.log(output); \ No newline at end of file +// const output = (await axios.get('http://localhost:3000/api/auth?intents=server&token='+token)).data; + +// console.log(output); \ No newline at end of file diff --git a/src/types/message.ts b/src/types/message.ts index 1c96b50..101e388 100644 --- a/src/types/message.ts +++ b/src/types/message.ts @@ -1,7 +1,7 @@ export default interface Message { - id: string; - content: string; - authorId: string; - channelId: string; - timestamp: Date; + id: number; + channel_id: string; + from: number; + contents: string; + timestamp: number; }