@@ -30,6 +30,7 @@ import {
30
30
} from "./ActiveGames.jsx"
31
31
import {
32
32
useAuthStore ,
33
+ useLobbyStore ,
33
34
} from "src/store.js"
34
35
import {
35
36
CgClose ,
@@ -44,25 +45,15 @@ const detailData = [
44
45
]
45
46
46
47
export function Lobby ( ) {
47
- let [ isNewGameOpen , setNewGameOpen ] = useState ( false )
48
+ let isNewGameOpen = useLobbyStore ( state => state . isNewGameOpen ( ) )
49
+ let setNewGameOpen = useLobbyStore ( state => state . setNewGameOpen )
50
+ let handleLobbyClick = useLobbyStore ( state => state . handleLobbyClick )
51
+ let closeLobbyPopup = useLobbyStore ( state => state . closeLobbyPopup )
48
52
let [ detail , setDetail ] = useState ( "open" )
49
53
let stompClient = useContext ( StompContext )
50
54
let navigate = useNavigate ( )
51
55
let auth = useAuthStore ( state => state . auth )
52
56
let newGameRef = useRef ( )
53
- let onClickOutside = useCallback ( ( event ) => {
54
- if ( ! isNewGameOpen ) {
55
- return
56
- }
57
- let el = newGameRef . current
58
- if ( ! el ) {
59
- return
60
- }
61
- let rect = el . getBoundingClientRect ( )
62
- if ( event . clientX > rect . right || event . clientX < rect . left || event . clientY > rect . bottom || event . clientY < rect . top ) {
63
- setNewGameOpen ( false )
64
- }
65
- } , [ isNewGameOpen ] )
66
57
let onNewGame = useCallback ( ( d ) => doTry ( async ( ) => {
67
58
let response = await tfetch ( "/api/create" , {
68
59
method : "POST" ,
@@ -77,7 +68,7 @@ export function Lobby() {
77
68
navigate ( base + "/game/" + game . id )
78
69
sub . unsubscribe ( )
79
70
} )
80
- setNewGameOpen ( false )
71
+ closeLobbyPopup ( )
81
72
} ) , [ auth . token , navigate , stompClient ] )
82
73
let onStartEdit = useCallback ( ( d ) => doTry ( async ( ) => {
83
74
let response = await tfetch ( "/api/start_edit" , {
@@ -91,27 +82,29 @@ export function Lobby() {
91
82
navigate ( base + "/game/" + response . id )
92
83
} ) , [ auth , navigate ] )
93
84
return (
94
- < div onClick = { onClickOutside } className = "h-full" >
85
+ < div onClick = { handleLobbyClick } className = "h-full" >
95
86
< div className = { twJoin (
96
87
"mt-2 py-2 pr-4 gap-x-1" ,
97
88
isNewGameOpen && "" ,
98
89
! isNewGameOpen && "border-transparent" ,
99
90
) } >
100
- { isNewGameOpen ? (
101
- < NewGameDialog
102
- newGameRef = { newGameRef }
103
- onNewGame = { onNewGame }
104
- onStartEdit = { onStartEdit }
105
- setNewGameOpen = { setNewGameOpen } />
106
- ) : "" }
107
- < button disabled = { isNewGameOpen } className = { ! isNewGameOpen ? twJoin (
91
+ < NewGameDialog
92
+ newGameRef = { newGameRef }
93
+ onNewGame = { onNewGame }
94
+ onStartEdit = { onStartEdit } />
95
+ < button disabled = { isNewGameOpen } className = { isNewGameOpen ? twJoin (
96
+ "ml-2 border-2 bg-gray-400 border-transparent px-4 py-2 rounded-lg" ,
97
+ ) : twJoin (
108
98
"ml-2 border-2 border-transparent px-4 py-2 rounded-lg" ,
109
99
"hover:border-sky-700" ,
110
- ) : twJoin (
111
- "ml-2 border-2 bg-gray-400 border-transparent px-4 py-2 rounded-lg" ,
112
100
) }
113
- onClick = { ( ) => {
114
- setNewGameOpen ( true )
101
+ onClick = { ( event ) => {
102
+ setNewGameOpen ( newGameRef . current )
103
+ if ( event . stopPropagation ) {
104
+ event . stopPropagation ( )
105
+ } else {
106
+ event . cancelBubble = true
107
+ }
115
108
} } >
116
109
New Game
117
110
</ button >
@@ -131,12 +124,14 @@ export function Lobby() {
131
124
)
132
125
}
133
126
134
- function NewGameDialog ( { onNewGame, onStartEdit, setNewGameOpen , newGameRef} ) {
127
+ function NewGameDialog ( { onNewGame, onStartEdit, newGameRef} ) {
135
128
let dimRef = useRef ( 9 )
136
129
let timeRef = useRef ( 10 )
137
130
let [ edit , setEdit ] = useState ( false )
131
+ let closeLobbyPopup = useLobbyStore ( state => state . closeLobbyPopup )
132
+ let isNewGameOpen = useLobbyStore ( state => state . isNewGameOpen ( ) )
138
133
return (
139
- < form className = "contents" onSubmit = { ( e ) => {
134
+ < form onSubmit = { ( e ) => {
140
135
e . preventDefault ( )
141
136
let game = { dim : dimRef . current , timesetting : timeRef . current }
142
137
if ( edit ) {
@@ -145,9 +140,13 @@ function NewGameDialog({onNewGame, onStartEdit, setNewGameOpen, newGameRef}) {
145
140
onNewGame ( game )
146
141
}
147
142
} } >
148
- < div ref = { newGameRef } className = "absolute ml-40 bg-slate-800 border-2 border-slate-600 rounded-lg z-10 px-3 py-2" >
143
+ < div ref = { newGameRef }
144
+ className = { twJoin (
145
+ ! isNewGameOpen && "hidden" ,
146
+ "absolute ml-40 bg-slate-800 border-2 border-slate-600 rounded-lg z-10 px-3 py-2" ,
147
+ ) } >
149
148
< div className = "absolute top-1 right-1" >
150
- < button onClick = { ( ) => setNewGameOpen ( false ) } className = "text-stone-100 hover:text-stone-300" >
149
+ < button onClick = { closeLobbyPopup } className = "text-stone-100 hover:text-stone-300" >
151
150
< IconContext . Provider value = { { size : "1.25em" } } >
152
151
< CgClose />
153
152
</ IconContext . Provider >
0 commit comments