Skip to content

Commit 23024d9

Browse files
committed
Refactor page components
1 parent 4576e91 commit 23024d9

File tree

4 files changed

+91
-64
lines changed

4 files changed

+91
-64
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export default function Message({ text }: { text: String }) {
2+
return (
3+
<div className="flex flex-row">
4+
<div className="flex flex-col">
5+
<div>{text}</div>
6+
</div>
7+
</div>
8+
);
9+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"use client";
2+
3+
import { useState } from "react";
4+
import { Socket } from "socket.io-client";
5+
6+
export default function MessageComposer() {
7+
const [socket, setSocket] = useState<Socket | undefined>(undefined);
8+
const [message, setMessage] = useState<string>("");
9+
10+
function handleSend() {
11+
if (socket) {
12+
socket.emit("message", message);
13+
setMessage("");
14+
}
15+
}
16+
return (
17+
<div className="flex flex-row gap-4 mt-auto">
18+
{/* These two can even be broken down further into smaller components, i.e. MessageInput and MessageSendButton */}
19+
<input
20+
value={message}
21+
onChange={(e) => setMessage(e.target.value)}
22+
className="flex-1 p-2 border border-black rounded"
23+
/>
24+
<button
25+
className="px-4 py-1 border border-black rounded-md"
26+
onClick={handleSend}
27+
>
28+
send
29+
</button>
30+
</div>
31+
);
32+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"use client";
2+
3+
import { useEffect, useState } from "react";
4+
import Message from "./Message";
5+
import { io, Socket } from "socket.io-client";
6+
7+
export default function Messages() {
8+
const [socket, setSocket] = useState<Socket | undefined>(undefined);
9+
const [isConnected, setIsConnected] = useState(false);
10+
const [transport, setTransport] = useState("N/A");
11+
12+
const [messages, setMessages] = useState<string[]>(["hello", "world"]);
13+
14+
useEffect(() => {
15+
const newSocket = io("http://localhost:3000");
16+
17+
newSocket.on("connect", () => {
18+
setIsConnected(true);
19+
setTransport(newSocket.io.engine.transport.name); // You can set transport type here
20+
});
21+
22+
newSocket.on("message", (message: string) => {
23+
setMessages((prevMessages) => [...prevMessages, message]);
24+
});
25+
26+
newSocket.on("disconnect", () => {
27+
setIsConnected(false);
28+
});
29+
30+
setSocket(newSocket);
31+
32+
// Cleanup function to disconnect the socket when the component unmounts
33+
return () => {
34+
newSocket.disconnect();
35+
};
36+
}, []); // Only run on mount/unmount
37+
38+
return (
39+
<div className="flex flex-col">
40+
{messages.map((message, index) => (
41+
<Message key={index} text={message} />
42+
))}
43+
</div>
44+
);
45+
}

frontend/src/app/socket/page.tsx

Lines changed: 5 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,11 @@
1-
"use client";
2-
3-
import { useEffect, useState } from "react";
4-
import { io, Socket } from "socket.io-client";
1+
import Messages from "./_components/Messages";
2+
import MessageComposer from "./_components/MessageComposer";
53

64
export default function Page() {
7-
const [socket, setSocket] = useState<Socket | undefined>(undefined);
8-
const [message, setMessage] = useState<string>("");
9-
const [messages, setMessages] = useState<string[]>(["hello", "world"]);
10-
const [isConnected, setIsConnected] = useState(false);
11-
const [transport, setTransport] = useState("N/A");
12-
13-
function handleSend() {
14-
if (socket) {
15-
socket.emit("message", message);
16-
setMessage("");
17-
}
18-
}
19-
20-
useEffect(() => {
21-
const newSocket = io("http://localhost:3000");
22-
23-
newSocket.on("connect", () => {
24-
setIsConnected(true);
25-
setTransport(newSocket.io.engine.transport.name); // You can set transport type here
26-
});
27-
28-
newSocket.on("message", (message: string) => {
29-
setMessages((prevMessages) => [...prevMessages, message]);
30-
});
31-
32-
newSocket.on("disconnect", () => {
33-
setIsConnected(false);
34-
});
35-
36-
setSocket(newSocket);
37-
38-
// Cleanup function to disconnect the socket when the component unmounts
39-
return () => {
40-
newSocket.disconnect();
41-
};
42-
}, []); // Only run on mount/unmount
43-
445
return (
45-
<div className="flex flex-col w-full h-full p-24 bg-white text-black">
46-
<div className="flex flex-col">
47-
{messages.map((message, index) => (
48-
<div key={index} className="flex flex-row">
49-
<div className="flex flex-col">
50-
<div>{message}</div>
51-
</div>
52-
</div>
53-
))}
54-
</div>
55-
<div className="flex flex-row mt-auto gap-4">
56-
<input
57-
value={message}
58-
onChange={(e) => setMessage(e.target.value)}
59-
className="flex-1 p-2 border border-black rounded"
60-
/>
61-
<button
62-
className="border border-black rounded-md px-4 py-1"
63-
onClick={handleSend}
64-
>
65-
send
66-
</button>
67-
</div>
6+
<div className="flex flex-col w-full h-full p-24 text-black bg-white">
7+
<Messages />
8+
<MessageComposer />
689
</div>
6910
);
7011
}

0 commit comments

Comments
 (0)