From 6eb75594a40839694a9f14a71de25481f3d24a79 Mon Sep 17 00:00:00 2001 From: Noah Date: Thu, 22 Jan 2026 00:08:27 +0100 Subject: [PATCH] Use session name for chat alignment --- frontend/src/App.tsx | 32 ++++++++++++++++++++++++++++++-- frontend/src/ChatPanel.tsx | 28 ++++++++++++++++++---------- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index ae1f8d5..d3fbc25 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,6 +15,8 @@ export function App({ socket }: AppProps) { const [rooms, setRooms] = useState([]); const [joinedRooms, setJoinedRooms] = useState>(new Set()); const [messagesByRoom, setMessagesByRoom] = useState>({}); + const [userName] = useState(() => createGuestName()); + const [userToken] = useState(() => crypto.randomUUID()); const handleListRooms = useCallback((response: Response) => { if (response.type === "list_rooms") { @@ -28,9 +30,18 @@ export function App({ socket }: AppProps) { }, [listRoomsRequest]); const sendMessageRequest = useWsRequest(socket, undefined); + const connectRequest = useWsRequest(socket, undefined); + + useEffect(() => { + if (!socket) { + return; + } + + connectRequest({ type: "connect", token: userToken, name: userName }); + }, [connectRequest, socket, userName, userToken]); const onMessageSent = (content: string) => { - const chat: Chat = { content, user: { name: "You" } }; + const chat: Chat = { content, user: { name: userName } }; if (!roomID) { return; @@ -55,8 +66,25 @@ export function App({ socket }: AppProps) { return ( <> - {roomID ? : } + {roomID ? ( + + ) : ( + + )} ); } + +function createGuestName(): string { + const adjectives = ["Amber", "Brisk", "Golden", "Quiet", "Sandy", "Silver", "Sunny", "Velvet"]; + const nouns = ["Comet", "Dawn", "Drift", "Ember", "Harbor", "Horizon", "Lumen", "Spark"]; + const adjective = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + const suffix = Math.floor(100 + Math.random() * 900); + return `${adjective}${noun}${suffix}`; +} diff --git a/frontend/src/ChatPanel.tsx b/frontend/src/ChatPanel.tsx index 2477ed1..eac9750 100644 --- a/frontend/src/ChatPanel.tsx +++ b/frontend/src/ChatPanel.tsx @@ -2,11 +2,12 @@ import { useState } from "react"; import type { Chat } from "./api/types"; type ChatPanelProps = { + currentUserName: string; messages: Chat[]; onMessageSent: (message: string) => void; }; -export function ChatPanel({ messages, onMessageSent }: ChatPanelProps) { +export function ChatPanel({ currentUserName, messages, onMessageSent }: ChatPanelProps) { const [draft, setDraft] = useState(""); return ( @@ -14,16 +15,23 @@ export function ChatPanel({ messages, onMessageSent }: ChatPanelProps) {

Chat

- {messages.map((message, index) => ( -
-
- {message.user.name ?? "Anonymous"} - + {messages.map((message, index) => { + const isOwnMessage = message.user.name === currentUserName; + const chatAlignment = isOwnMessage ? "chat-end" : "chat-start"; + const bubbleTone = isOwnMessage ? "chat-bubble-primary" : "chat-bubble-secondary"; + const footerText = isOwnMessage ? "Sent" : "Delivered"; + + return ( +
+
+ {isOwnMessage ? "You" : (message.user.name ?? "Anonymous")} + +
+
{message.content}
+
{footerText}
-
{message.content}
-
{index % 2 === 0 ? "Seen" : "Delivered"}
-
- ))} + ); + })}