Skip to content

Commit 686a52c

Browse files
committed
chat: fix vertical overflow
1 parent a939776 commit 686a52c

File tree

8 files changed

+67
-78
lines changed

8 files changed

+67
-78
lines changed

src/main/client/src/Game.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ export const Game = () => {
212212
})
213213
setGameState(game)
214214
}, () => navigate(base + "/lobby"))
215-
}, [setGameState, queueStatus, auth, gameId])
215+
}, [setGameState, queueStatus, auth, gameId, navigate])
216216

217217
useEffect(() => {
218218
if (initialized.current) {

src/main/client/src/component/Input.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ export const Input = ({
1111
type,
1212
...rest
1313
}) => {
14-
let { register } = useFormContext()
14+
let {register} = useFormContext()
1515
let classes = twJoin(
16+
"border border-white rounded-lg p-2 bg-stone-800 text-stone-100",
1617
className,
1718
)
1819
return (

src/main/client/src/feature/GameChat.jsx

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,22 @@ import {
1818
} from "./../util.js"
1919

2020
export const GameChat = () => {
21-
let [messages, setMessages] = useState([]);
22-
let divRef = useRef(null)
21+
let [messages, setMessages] = useState([])
22+
let divRef = useRef()
2323

2424
let stompClient = useContext(StompContext)
25-
let { gameId } = useParams()
25+
let {gameId} = useParams()
2626
let auth = useAuthStore(state => state.auth)
2727

2828
useEffect(() => {
29-
stompClient.subscribe("/topic/chat/" + gameId, (message) => {
30-
let newMessage = JSON.parse(message.body)
31-
setMessages(previous => [...previous, newMessage])
29+
stompClient.subscribe("/topic/chat/" + gameId, (m) => {
30+
let message = JSON.parse(m.body)
31+
setMessages(previous => {
32+
if (previous.length && previous[previous.length - 1].n === message.n) {
33+
return previous
34+
}
35+
return [...previous, message]
36+
})
3237
})
3338

3439
doTry(async () => {
@@ -44,39 +49,36 @@ export const GameChat = () => {
4449
}, [stompClient, auth, gameId])
4550

4651
useEffect(() => {
47-
divRef.current?.scrollIntoView({behavior: 'smooth'});
48-
}, [messages]);
52+
divRef.current?.scrollIntoView({behavior: "smooth"})
53+
}, [messages])
4954

5055
let onSendMessage = useCallback((event) => doTry(async () => {
5156
event.preventDefault()
5257
let data = new FormData(event.target)
53-
document.getElementById("sending").reset();
58+
event.target.reset()
5459
stompClient.publish({
5560
destination: "/app/chat/send/",
5661
body: JSON.stringify({
5762
message: data.get("message"),
5863
id: gameId,
5964
}),
6065
})
61-
}), [ stompClient, gameId ])
62-
63-
return (
66+
}), [stompClient, gameId])
6467

65-
<div className="border border-gray-500 bg-gray-900 rounded-lg shadow relative my-1 mr-1">
66-
<div>
67-
<div className="max-h-80 h-80 px-2 py-1 overflow-auto">
68-
{messages.map(message => (
69-
<p>{message.user + ": " + message.message}</p>
70-
))}
71-
<div ref={divRef} />
72-
</div>
73-
</div>
74-
<form className="px-2 py-1" id="sending" onSubmit={onSendMessage}>
75-
<input
76-
type="text"
77-
name="message"
78-
/>
79-
</form>
68+
return <>
69+
<div
70+
className="grow border border-gray-500 bg-gray-900 rounded-lg p-1 overflow-y-scroll">
71+
{messages.map(message => (
72+
<p key={message.n}>{message.user + ": " + message.message}</p>
73+
))}
74+
<div ref={divRef} />
8075
</div>
81-
);
76+
<form className="flex-0 mb-2" onSubmit={onSendMessage}>
77+
<input
78+
className="w-full rounded-lg p-2 border border-gray-500 bg-stone-800 text-stone-100"
79+
type="text"
80+
name="message"
81+
/>
82+
</form>
83+
</>
8284
}

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

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ import {
3737

3838
export const GamePanel = ({zoom, setZoom}) => {
3939
return (
40-
<div className="fixed top-0 right-0 h-full bg-slate-800 border-l-2 border-slate-700">
41-
<div className="w-64 pr-3 pt-4 pl-4">
40+
<div className="fixed top-0 right-0 z-1 h-full bg-slate-800 border-l-2 border-slate-700">
41+
<div className="w-80 pr-3 pt-4 pl-2 h-full flex flex-col gap-y-1">
4242
<Panel zoom={zoom} setZoom={setZoom} />
4343
</div>
4444
</div>
@@ -93,7 +93,7 @@ function Panel({zoom, setZoom}) {
9393
let result = gameHasEnded ? getScore(board) : undefined
9494
return (
9595
<>
96-
<div className="inline-flex gap-x-2">
96+
<div className="flex-none grid w-full grid-cols-[min-content_min-content_min-content_auto] gap-x-2">
9797
<button
9898
onClick={() => setZoom(zoom - 1)}>
9999
<IconContext.Provider value={{
@@ -109,7 +109,9 @@ function Panel({zoom, setZoom}) {
109109
} else {
110110
setZoom(0)
111111
}
112-
}}>Zoom: {zoom + 0}</button>
112+
}}>
113+
<span>Zoom:&nbsp;{zoom + 0}</span>
114+
</button>
113115
<button
114116
onClick={() => setZoom(zoom + 1)}>
115117
<IconContext.Provider value={{
@@ -119,23 +121,25 @@ function Panel({zoom, setZoom}) {
119121
<FaAngleRight />
120122
</IconContext.Provider>
121123
</button>
124+
<button title="Leave the game" onClick={onExit}
125+
className="justify-self-end">
126+
<IconContext.Provider value={{
127+
size: "1.5em",
128+
className: "pr-[4px]",
129+
}}>
130+
<IoMdExit />
131+
</IconContext.Provider>
132+
</button>
122133
</div>
123-
<button title="Leave the game" onClick={onExit}
124-
className="float-right">
125-
<IconContext.Provider value={{
126-
size: "1.5em",
127-
className: "pr-[4px]",
128-
}}>
129-
<IoMdExit />
130-
</IconContext.Provider>
131-
</button>
132-
<div className="flex gap-x-1">
134+
<div className="flex-none flex gap-x-1">
133135
<div>{white}</div>
134136
<div>vs</div>
135137
<div>{black}</div>
136138
</div>
137-
<div>Move {queueLength}</div>
138-
<div className="mt-2">
139+
<div className="flex-none">
140+
Move {queueLength}
141+
</div>
142+
<div className="flex-none">
139143
<Button
140144
onClick={onPass}
141145
className="py-1 px-4"
@@ -144,15 +148,15 @@ function Panel({zoom, setZoom}) {
144148
</Button>
145149
</div>
146150
{counting && <>
147-
<div className="mt-2">
151+
<div className="flex-none">
148152
<Button
149153
className="py-1 px-4"
150154
disabled={gameHasEnded}
151155
onClick={onResetCounting}>
152156
Reset Counting
153157
</Button>
154158
</div>
155-
<div className="mt-2">
159+
<div className="flex-none">
156160
<Button
157161
disabled={gameHasEnded || !countingComplete()}
158162
className="py-1 px-4"
@@ -162,7 +166,7 @@ function Panel({zoom, setZoom}) {
162166
</div>
163167
</>}
164168
{result && (
165-
<div className="mt-4">
169+
<div className="flex-none">
166170
<div>
167171
{"w:" + result.w}
168172
</div>
@@ -174,11 +178,7 @@ function Panel({zoom, setZoom}) {
174178
</div>
175179
</div>
176180
)}
177-
{/*
178-
<div className="absolute bottom-10 pr-2">
179-
<GameChat />
180-
</div>
181-
*/}
181+
<GameChat />
182182
</>
183183
)
184184
}

src/main/client/src/index.css

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,9 @@
33
@tailwind utilities;
44

55
@layer base {
6-
body, input {
6+
body {
77
@apply bg-stone-800;
88
@apply font-sans;
99
@apply text-stone-100;
1010
}
11-
12-
input {
13-
@apply border;
14-
@apply border-white;
15-
@apply rounded-lg;
16-
@apply p-2;
17-
}
1811
}

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.bernd.util.Auth;
77
import java.security.Principal;
88
import java.util.ArrayList;
9-
import java.util.List;
9+
import java.util.concurrent.atomic.AtomicInteger;
1010
import org.springframework.http.ResponseEntity;
1111
import org.springframework.messaging.core.MessageSendingOperations;
1212
import org.springframework.messaging.handler.annotation.MessageMapping;
@@ -31,25 +31,17 @@ public class ChatController {
3131
@ResponseBody
3232
@GetMapping("/api/chat/{id}")
3333
public Chat getChat(@PathVariable String id) {
34-
System.out.println("GETCHAT " + id);
3534
return chats.get(id);
3635
}
3736

3837
@MessageMapping("/chat/send/")
3938
public ResponseEntity<?> sendChat(ChatRequest chatRequest, Principal principal) {
4039
String user = Auth.getPrincipal(principal);
41-
ChatMessage message = new ChatMessage(chats.chats().size(), chatRequest.message(), user);
42-
Chat chat = chats.get(chatRequest.id());
43-
if (chat != null) {
44-
chat.messages().add(message);
45-
} else {
46-
List<ChatMessage> messages = new ArrayList<>();
47-
messages.add(message);
48-
chat = new Chat(chatRequest.id(), messages);
49-
}
50-
chats.put(chat);
40+
Chat chat = chats.map().computeIfAbsent(chatRequest.id(),
41+
id -> new Chat(id, new AtomicInteger(0), new ArrayList<>()));
42+
ChatMessage message = new ChatMessage(chat.counter().getAndIncrement(), chatRequest.message(), user);
43+
chat.messages().add(message);
5144
operations.convertAndSend("/topic/chat/" + chat.id(), message);
5245
return ResponseEntity.ok().build();
5346
}
54-
5547
}

src/main/java/com/bernd/Chats.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.bernd.model.Chat;
44
import java.util.LinkedHashMap;
5-
import java.util.List;
65
import java.util.Map;
76
import org.springframework.stereotype.Component;
87

@@ -19,7 +18,7 @@ Chat put(Chat chat) {
1918
return chat;
2019
}
2120

22-
List<Chat> chats() {
23-
return List.copyOf(map.values());
21+
Map<String, Chat> map() {
22+
return map;
2423
}
2524
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.bernd.model;
22

33
import java.util.List;
4+
import java.util.concurrent.atomic.AtomicInteger;
45

56
public record Chat(
67
String id,
8+
AtomicInteger counter,
79
List<ChatMessage> messages) {
810
}

0 commit comments

Comments
 (0)