Skip to content

Commit 55b4de4

Browse files
connect frontend to server with REST and WebSocket
1 parent 5fc6130 commit 55b4de4

1 file changed

Lines changed: 37 additions & 27 deletions

File tree

chat-app/client/src/App.tsx

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,52 @@
1-
import { useState, useEffect } from "react";
2-
import MessageList from "./components/MessageList";
3-
import MessageForm from "./components/MessageForm";
4-
import type { Message } from "./types";
1+
import { useState, useEffect } from "react";
2+
import MessageList from "./components/MessageList";
3+
import MessageForm from "./components/MessageForm";
4+
import type { Message } from "./types";
55
import "./App.css";
66

7-
const MESSAGES_KEY = "chatMessagesKey";
8-
const NAME_KEY = "chatNameKey";
7+
const SERVER_URL = "https://server-beeko-chat.hosting.codeyourfuture.io";
8+
const WS_URL = "wss://server-beeko-chat.hosting.codeyourfuture.io";
99

1010
function App() {
11-
12-
const [messages, setMessages] = useState<Message[]>(() => {
13-
const stored = localStorage.getItem(MESSAGES_KEY);
14-
return stored ? JSON.parse(stored) : [];
15-
});
16-
11+
const [messages, setMessages] = useState<Message[]>([]);
1712
const [name, setName] = useState<string>(() => {
18-
return localStorage.getItem(NAME_KEY) ?? "";
13+
return localStorage.getItem("chatNameKey") ?? "";
1914
});
2015

2116
useEffect(() => {
22-
localStorage.setItem(MESSAGES_KEY, JSON.stringify(messages));
23-
}, [messages]);
17+
fetch(`${SERVER_URL}/messages`)
18+
.then((res) => res.json())
19+
.then((data) => setMessages(data))
20+
.catch((err) => console.error("failed to fetch messages", err));
21+
}, []);
2422

2523
useEffect(() => {
26-
localStorage.setItem(NAME_KEY, name);
27-
}, [name]);
24+
const ws = new WebSocket(WS_URL);
2825

29-
const handleSend = (text: string) => {
30-
const newMessage: Message = {
31-
id: crypto.randomUUID(),
32-
name,
33-
text,
34-
timestamp: new Date().toLocaleTimeString([], {
35-
hour: "2-digit",
36-
minute: "2-digit",
37-
}),
26+
ws.onmessage = (event) => {
27+
const newMessage: Message = JSON.parse(event.data);
28+
setMessages((prev) => [...prev, newMessage]);
3829
};
39-
setMessages((prev) => [...prev, newMessage]);
30+
31+
ws.onerror = (err) => console.error("websocket error", err);
32+
33+
return () => ws.close();
34+
}, []);
35+
36+
useEffect(() => {
37+
localStorage.setItem("chatNameKey", name);
38+
}, [name]);
39+
40+
const handleSend = async (text: string) => {
41+
try {
42+
await fetch(`${SERVER_URL}/messages`, {
43+
method: "POST",
44+
headers: { "Content-Type": "application/json" },
45+
body: JSON.stringify({ name, text }),
46+
});
47+
} catch (err) {
48+
console.error("failed to send message", err);
49+
}
4050
};
4151

4252
return (

0 commit comments

Comments
 (0)