Skip to content

Commit ed14ee9

Browse files
author
Christopher Strauss
committed
Gamechat im panel
1 parent bfa8d9b commit ed14ee9

File tree

5 files changed

+107
-12
lines changed

5 files changed

+107
-12
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import {
2+
useState,
3+
useEffect,
4+
useCallback,
5+
useContext,
6+
} from "react"
7+
import {
8+
Message,
9+
} from "./Message.jsx"
10+
import {
11+
useParams,
12+
} from "react-router-dom"
13+
import {
14+
useAuthStore,
15+
} from "./../store.js"
16+
import {
17+
StompContext,
18+
tfetch,
19+
doTry,
20+
} from "./../util.js"
21+
22+
export const GameChat = () => {
23+
let [messages, setMessages] = useState([]);
24+
25+
let stompClient = useContext(StompContext)
26+
let { gameId } = useParams()
27+
let auth = useAuthStore(state => state.auth)
28+
29+
useEffect(() => {
30+
console.log("RENDER CHAT")
31+
32+
stompClient.subscribe("/topic/chat/" + gameId, (message) => {
33+
let newMessage = JSON.parse(message.body)
34+
setMessages(previous => [...previous, newMessage])
35+
})
36+
37+
doTry(async () => {
38+
console.log(gameId)
39+
let chat = await tfetch("/api/chat/" + gameId, {
40+
method: "GET",
41+
headers: {
42+
"Authorization": "Bearer " + auth.token,
43+
"Content-Type": "application/json",
44+
},
45+
})
46+
setMessages(chat.messages || [])
47+
})
48+
49+
}, [stompClient, auth, gameId])
50+
51+
let onSendMessage = useCallback((event) => doTry(async () => {
52+
event.preventDefault()
53+
let data = new FormData(event.target)
54+
55+
stompClient.publish({
56+
destination: "/app/chat/send/",
57+
body: JSON.stringify({
58+
message: data.get("message"),
59+
id: gameId,
60+
}),
61+
62+
})
63+
}), [ stompClient, gameId ])
64+
65+
return (
66+
67+
<div>
68+
<div>
69+
{messages.map(message => (
70+
<Message key={message.n} text={message.user + ": " + message.message} />
71+
))}
72+
</div>
73+
<form onSubmit={onSendMessage}>
74+
<input
75+
type="text"
76+
name="message"
77+
/>
78+
<button type="submit">Send</button>
79+
</form>
80+
</div>
81+
);
82+
}

src/main/client/src/feature/GamePanel.jsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ import {
3131
useAuthStore,
3232
useGameStore,
3333
} from "../store.js"
34+
import {
35+
GameChat,
36+
} from "./GameChat.jsx"
3437

3538
export const GamePanel = ({zoom, setZoom}) => {
3639
return (
@@ -171,6 +174,9 @@ function Panel({zoom, setZoom}) {
171174
</div>
172175
</div>
173176
)}
177+
<div>
178+
<GameChat />
179+
</div>
174180
</>
175181
)
176182
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export function Message({ text }) {
2+
return (
3+
<div>
4+
<p>{text}</p>
5+
</div>
6+
);
7+
}

src/main/java/com/bernd/ChatController.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
import com.bernd.model.Chat;
44
import com.bernd.model.ChatMessage;
55
import com.bernd.model.ChatRequest;
6+
import com.bernd.util.Auth;
7+
import java.security.Principal;
68
import java.util.ArrayList;
79
import java.util.List;
8-
import java.util.Objects;
910
import org.springframework.http.ResponseEntity;
1011
import org.springframework.messaging.core.MessageSendingOperations;
11-
import org.springframework.security.core.context.SecurityContextHolder;
12+
import org.springframework.messaging.handler.annotation.MessageMapping;
1213
import org.springframework.stereotype.Controller;
1314
import org.springframework.web.bind.annotation.GetMapping;
1415
import org.springframework.web.bind.annotation.PathVariable;
15-
import org.springframework.web.bind.annotation.PostMapping;
16-
import org.springframework.web.bind.annotation.RequestBody;
1716
import org.springframework.web.bind.annotation.ResponseBody;
1817

1918
@Controller
@@ -32,14 +31,14 @@ public class ChatController {
3231
@ResponseBody
3332
@GetMapping("/api/chat/{id}")
3433
public Chat getChat(@PathVariable String id) {
34+
System.out.println("GETCHAT " + id);
3535
return chats.get(id);
3636
}
3737

38-
@PostMapping("/api/send_chat")
39-
public ResponseEntity<?> sendChat(@RequestBody ChatRequest chatRequest) {
40-
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
41-
String user = Objects.toString(principal);
42-
ChatMessage message = new ChatMessage(chatRequest.message(), user);
38+
@MessageMapping("/chat/send/")
39+
public ResponseEntity<?> sendChat(ChatRequest chatRequest, Principal principal) {
40+
String user = Auth.getPrincipal(principal);
41+
ChatMessage message = new ChatMessage(chats.chats().size(), chatRequest.message(), user);
4342
Chat chat = chats.get(chatRequest.id());
4443
if (chat != null) {
4544
chat.messages().add(message);
@@ -49,7 +48,7 @@ public ResponseEntity<?> sendChat(@RequestBody ChatRequest chatRequest) {
4948
chat = new Chat(chatRequest.id(), messages);
5049
}
5150
chats.put(chat);
52-
operations.convertAndSend("/topic/chat/" + chat.id(), chat);
51+
operations.convertAndSend("/topic/chat/" + chat.id(), message);
5352
return ResponseEntity.ok().build();
5453
}
5554

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.bernd.model;
22

33
public record ChatMessage(
4-
String message,
5-
String user) {
4+
int n,
5+
String message,
6+
String user) {
67
}

0 commit comments

Comments
 (0)