@@ -3,22 +3,16 @@ import {
33 useState ,
44 useEffect ,
55 useContext ,
6- useCallback ,
76} from "react"
87import {
98 twJoin ,
109} from "tailwind-merge"
1110import {
1211 useNavigate ,
1312} from "react-router-dom"
14- import {
15- Button ,
16- } from "src/component/Button.jsx"
1713import {
1814 base ,
1915 StompContext ,
20- tfetch ,
21- doTry ,
2216 stopPropagation ,
2317} from "src/util.js"
2418import {
@@ -33,23 +27,18 @@ import {
3327import {
3428 Requests ,
3529} from "./Requests.jsx"
30+ import {
31+ NewGameDialog ,
32+ } from "./NewGameDialog.jsx"
3633import {
3734 useAuthStore ,
3835} from "src/store.js"
3936import {
4037 getZindex ,
4138 setNewGameOpen ,
42- setOpenGameId ,
4339 handleLobbyClick ,
44- closeLobbyPopup ,
4540 initialState ,
4641} from "./lobbyState.js"
47- import {
48- CgClose ,
49- } from "react-icons/cg"
50- import {
51- IconContext ,
52- } from "react-icons"
5342
5443const detailData = [
5544 [ "open" , "Open Games" ] ,
@@ -81,28 +70,15 @@ export function Lobby() {
8170 sub . unsubscribe ( )
8271 }
8372 } , [ auth , initialized , stompClient , navigate ] )
84- let onStartEdit = useCallback ( ( d ) => doTry ( async ( ) => {
85- let response = await tfetch ( "/api/start_edit" , {
86- method : "POST" ,
87- headers : {
88- "Authorization" : "Bearer " + auth . token ,
89- "Content-Type" : "application/json" ,
90- } ,
91- body : JSON . stringify ( d ) ,
92- } )
93- navigate ( base + "/game/" + response . id )
94- } ) , [ auth , navigate ] )
9573 return (
9674 < div onClick = { ( event ) => setLobbyState ( handleLobbyClick ( lobbyState , event ) ) } className = "h-full" >
9775 < div className = { twJoin (
9876 "mt-2 py-2 pr-4" ,
9977 ) } >
10078 < NewGameDialog
101- zNewGame = { zNewGame }
10279 lobbyState = { lobbyState }
10380 setLobbyState = { setLobbyState }
104- newGameRef = { newGameRef }
105- onStartEdit = { onStartEdit } />
81+ newGameRef = { newGameRef } />
10682 < button disabled = { zNewGame !== 0 } className = { twJoin (
10783 "ml-2 border-2 border-transparent px-4 py-2 rounded-lg" ,
10884 zNewGame && "bg-gray-400" ,
@@ -132,98 +108,6 @@ export function Lobby() {
132108 )
133109}
134110
135- function NewGameDialog ( { zNewGame, lobbyState, setLobbyState, onStartEdit, newGameRef} ) {
136- let dimRef = useRef ( 9 )
137- let timeRef = useRef ( 10 )
138- let [ edit , setEdit ] = useState ( false )
139- let auth = useAuthStore ( state => state . auth )
140- let onNewGame = useCallback ( ( d ) => doTry ( async ( ) => {
141- let response = await tfetch ( "/api/create" , {
142- method : "POST" ,
143- headers : {
144- "Authorization" : "Bearer " + auth . token ,
145- "Content-Type" : "application/json" ,
146- } ,
147- body : JSON . stringify ( d ) ,
148- } )
149- let newState = closeLobbyPopup ( lobbyState )
150- setLobbyState ( setOpenGameId ( newState , response . id ) )
151- } ) , [ auth . token , lobbyState , setLobbyState ] )
152- return (
153- < form onSubmit = { ( e ) => {
154- e . preventDefault ( )
155- let game = { dim : dimRef . current , timesetting : timeRef . current }
156- if ( edit ) {
157- onStartEdit ( game )
158- } else {
159- onNewGame ( game )
160- }
161- } } >
162- < div ref = { newGameRef }
163- style = { {
164- zIndex : zNewGame ,
165- } }
166- className = { twJoin (
167- ! zNewGame && "hidden" ,
168- "absolute ml-40 bg-slate-800 border-2 border-slate-600 rounded-lg px-3 py-2" ,
169- ) } >
170- < div className = "absolute top-1 right-1" >
171- < button onClick = { ( ) => setLobbyState ( closeLobbyPopup ( lobbyState ) ) } className = "text-stone-100 hover:text-stone-300" >
172- < IconContext . Provider value = { { size : "1.25em" } } >
173- < CgClose />
174- </ IconContext . Provider >
175- </ button >
176- </ div >
177- < div className = "mt-1" >
178- < span className = "italic text-gray-400" > Board Dimension:</ span >
179- </ div >
180- < div className = "flex flex-row gap-x-4" >
181- < div >
182- < input id = "dim-9" type = "radio" name = "dim" value = "9" defaultChecked = { true } onClick = { ( ) => dimRef . current = 9 } />
183- < label htmlFor = "dim-9" className = "pt-[0.625rem]" > 9x9</ label >
184- </ div >
185- < div >
186- < input id = "dim-13" type = "radio" name = "dim" value = "13" onClick = { ( ) => dimRef . current = 13 } />
187- < label htmlFor = "dim-13" className = "pt-[0.625rem]" > 13x13</ label >
188- </ div >
189- < div >
190- < input id = "dim-19" type = "radio" name = "dim" value = "19" onClick = { ( ) => dimRef . current = 19 } />
191- < label htmlFor = "dim-19" className = "pt-[0.625rem]" > 19x19</ label >
192- </ div >
193- </ div >
194- < div className = "mt-3" >
195- < span className = "italic text-gray-400" > Time Setting:</ span >
196- </ div >
197- < div className = "flex flex-row gap-x-3" >
198- < div >
199- < input id = "time-0" type = "radio" name = "time" value = "0" onClick = { ( ) => timeRef . current = 0 } />
200- < label htmlFor = "time-0" className = "pt-[0.625rem]" > No time limit</ label >
201- </ div >
202- < div >
203- < input id = "time-10" type = "radio" name = "time" value = "10" defaultChecked = { true } onClick = { ( ) => timeRef . current = 10 } />
204- < label htmlFor = "time-10" className = "pt-[0.625rem]" > 10s</ label >
205- </ div >
206- < div >
207- < input id = "time-30" type = "radio" name = "time" value = "30" onClick = { ( ) => timeRef . current = 30 } />
208- < label htmlFor = "time-30" className = "pt-[0.625rem]" > 30s</ label >
209- </ div >
210- </ div >
211- < div className = "flex flex-row w-full mt-3" >
212- < div className = "self-end" >
213- < input id = "cb-edit" type = "checkbox" name = "edit" checked = { edit } onChange = { ( ) => setEdit ( ! edit ) } />
214- < label htmlFor = "cb-edit" className = { twJoin (
215- ! edit && "text-gray-400" ,
216- "pt-[0.625rem] ml-1" ,
217- ) } > Edit Mode</ label >
218- </ div >
219- < div className = "grow" />
220- < Button type = "submit" > OK</ Button >
221- </ div >
222- </ div >
223- </ form >
224- )
225- }
226-
227111function DetailNavigation ( { detail, setDetail} ) {
228112 return (
229113 < div className = { twJoin (
0 commit comments