@@ -11,7 +11,6 @@ import {
11
11
ButtonProps ,
12
12
Modal ,
13
13
Form ,
14
- TextAreaProps ,
15
14
Sidebar ,
16
15
Segment ,
17
16
Message ,
@@ -29,7 +28,21 @@ import { aStarDesc, bfsDesc, dfsDesc, djikstrasDesc } from "../Maze/algorithms";
29
28
30
29
import "./Menu.scss" ;
31
30
32
- export interface MenuProps extends MenuState {
31
+ const SpaceSchema = yup . object ( {
32
+ type : yup
33
+ . mixed ( )
34
+ . oneOf ( [
35
+ SpaceTypes . wall ,
36
+ SpaceTypes . empty ,
37
+ SpaceTypes . start ,
38
+ SpaceTypes . end ,
39
+ ] )
40
+ . required ( ) ,
41
+ visited : yup . bool ( ) . required ( ) ,
42
+ path : yup . bool ( ) . required ( ) ,
43
+ } ) ;
44
+
45
+ export interface Props extends MenuState {
33
46
canMoveStart : boolean ;
34
47
canMoveEnd : boolean ;
35
48
maze : Maze ;
@@ -70,36 +83,20 @@ export interface MenuProps extends MenuState {
70
83
randomizeWalls : ( ) => void ;
71
84
}
72
85
73
- export interface _MenuState {
86
+ export interface State {
74
87
pastedMaze : string | number | undefined ;
75
- showModal : boolean ;
76
- hasError : boolean ;
77
- errorMessage : string ;
88
+ errorMessage : string | null ;
89
+ loadModalOpen : boolean ;
78
90
sidebarOpen : boolean ;
79
91
mazeCols : number ;
80
92
mazeRows : number ;
81
93
}
82
94
83
- export const yupSpaceSchema = yup . object ( {
84
- type : yup
85
- . mixed ( )
86
- . oneOf ( [
87
- SpaceTypes . wall ,
88
- SpaceTypes . empty ,
89
- SpaceTypes . start ,
90
- SpaceTypes . end ,
91
- ] )
92
- . required ( ) ,
93
- visited : yup . bool ( ) . required ( ) ,
94
- path : yup . bool ( ) . required ( ) ,
95
- } ) ;
96
-
97
- class MenuBar extends React . Component < MenuProps , _MenuState > {
95
+ class MenuBar extends React . Component < Props , State > {
98
96
state = {
99
97
pastedMaze : "" ,
100
- showModal : false ,
101
- hasError : false ,
102
- errorMessage : "" ,
98
+ errorMessage : null ,
99
+ loadModalOpen : false ,
103
100
sidebarOpen : false ,
104
101
mazeCols : getMazeSize ( this . props . maze . mazeInfo ) . x ,
105
102
mazeRows : getMazeSize ( this . props . maze . mazeInfo ) . y ,
@@ -121,8 +118,7 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
121
118
if ( ! isArray ) return false ;
122
119
if ( obj [ i ] . length === 0 ) return false ;
123
120
for ( let j = 0 ; j < obj [ i ] . length ; j ++ ) {
124
- console . log ( obj [ keys [ i ] ] [ j ] ) ;
125
- const spaceIsValid = yupSpaceSchema . isValidSync ( obj [ keys [ i ] ] [ j ] ) ;
121
+ const spaceIsValid = SpaceSchema . isValidSync ( obj [ keys [ i ] ] [ j ] ) ;
126
122
if ( ! spaceIsValid ) {
127
123
return false ;
128
124
}
@@ -134,23 +130,16 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
134
130
checkStartEndPoints = ( maze : MazeInfo ) : boolean => {
135
131
let numStart : number = 0 ;
136
132
let numEnd : number = 0 ;
137
- // eslint-disable-next-line array-callback-return
138
- Object . keys ( maze ) . map ( ( key : string ) => {
139
- // eslint-disable-next-line array-callback-return
140
- maze [ + key ] . map ( ( value : Space ) => {
133
+ Object . keys ( maze ) . forEach ( ( key : string ) => {
134
+ maze [ + key ] . forEach ( ( value : Space ) => {
141
135
numStart += value . type === SpaceTypes . start ? 1 : 0 ;
142
136
numEnd += value . type === SpaceTypes . end ? 1 : 0 ;
143
137
} ) ;
144
138
} ) ;
145
139
return numStart <= 1 && numEnd <= 1 ;
146
140
} ;
147
141
148
- //event: React.FormEvent<HTMLTextAreaElement>, data: TextAreaProps) => void
149
142
isValidMaze = ( mazeInfo : MazeInfo ) : boolean => {
150
- console . log ( "validate" ) ;
151
- // try {
152
- // const maze: MazeInfo = JSON.parse(data.value as string);
153
- // console.log(maze);
154
143
const keys = Object . keys ( mazeInfo ) ;
155
144
156
145
if ( keys . length === 0 ) {
@@ -184,43 +173,30 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
184
173
} ) ;
185
174
return false ;
186
175
}
187
- // else {
188
- // this.setState({
189
- // hasError: false,
190
- // pastedMaze: data.value as string,
191
- // });
192
- // }
193
176
}
194
177
}
195
178
}
196
- // } catch (e) {
197
- // this.setState({
198
- // ...this.state,
199
- // hasError: true,
200
- // errorMessage: "Maze data must be in JSON format!",
201
- // });
202
- // }
203
179
return true ;
204
180
} ;
205
181
206
182
loadMaze = ( ) => {
207
- // TODO: move validation here
208
183
const { pastedMaze } = this . state ;
209
- console . log ( "Submit" , pastedMaze ) ;
210
184
211
185
try {
212
186
const mazeInfo : MazeInfo = JSON . parse ( pastedMaze ) ;
213
187
214
188
if ( this . isValidMaze ( mazeInfo ) ) {
215
- // Maze is valid
216
- console . log ( "valid" ) ;
217
- // this.props.loadMaze(mazeInfo);
218
- // this.setState({ pastedMaze: "", showModal: false });
219
- } else {
220
- console . log ( "invalid" ) ;
189
+ this . props . loadMaze ( mazeInfo ) ;
190
+ this . setState ( {
191
+ pastedMaze : "" ,
192
+ errorMessage : null ,
193
+ loadModalOpen : false ,
194
+ } ) ;
221
195
}
222
196
} catch ( err ) {
223
- console . error ( err ) ;
197
+ this . setState ( {
198
+ errorMessage : "Unable to parse JSON" ,
199
+ } ) ;
224
200
}
225
201
} ;
226
202
@@ -265,7 +241,14 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
265
241
startTime,
266
242
endTime,
267
243
} = this . props ;
268
- const { mazeCols, mazeRows, pastedMaze, sidebarOpen } = this . state ;
244
+ const {
245
+ mazeCols,
246
+ mazeRows,
247
+ pastedMaze,
248
+ loadModalOpen,
249
+ sidebarOpen,
250
+ errorMessage,
251
+ } = this . state ;
269
252
270
253
return (
271
254
< div >
@@ -398,8 +381,21 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
398
381
{ /* Essentially just a fancy space */ }
399
382
< Modal
400
383
centered = { false }
384
+ open = { loadModalOpen }
385
+ onClose = { ( ) =>
386
+ this . setState ( {
387
+ pastedMaze : "" ,
388
+ errorMessage : null ,
389
+ loadModalOpen : false ,
390
+ } )
391
+ }
401
392
trigger = {
402
- < Button color = "blue" circular disabled = { isPlaying } >
393
+ < Button
394
+ color = "blue"
395
+ circular
396
+ disabled = { isPlaying }
397
+ onClick = { ( ) => this . setState ( { loadModalOpen : true } ) }
398
+ >
403
399
< Icon
404
400
name = "upload"
405
401
style = { { marginRight : "0.5rem" } }
@@ -412,20 +408,18 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
412
408
< Modal . Header > Paste your maze in the text box</ Modal . Header >
413
409
< Modal . Content >
414
410
< Modal . Description >
415
- { /* Trying to hook up this textarea to capture maze info
416
- inspration, https://react.semantic-ui.com/collections/form/#usage-capture-values */ }
417
411
< Form onSubmit = { this . loadMaze } >
418
412
< Form . TextArea
419
413
style = { { minHeight : 500 , minWidth : 800 } }
420
414
placeholder = "Maze Text"
421
415
name = "name"
422
416
value = { pastedMaze }
423
- onChange = { ( e : TextAreaProps ) =>
424
- this . setState ( { pastedMaze : e . value } )
417
+ onChange = { ( e : any ) =>
418
+ this . setState ( { pastedMaze : e . target . value } )
425
419
}
426
420
/>
427
- < Message visible = { this . state . hasError } >
428
- Enter properly formatted json
421
+ < Message hidden = { errorMessage ? false : true } >
422
+ { errorMessage }
429
423
</ Message >
430
424
< Form . Button content = "Submit" />
431
425
</ Form >
@@ -443,7 +437,6 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
443
437
< Sidebar
444
438
as = { Menu }
445
439
animation = "push"
446
- overlay
447
440
icon = "labeled"
448
441
direction = "right"
449
442
onHide = { ( ) => this . setState ( { sidebarOpen : false } ) }
@@ -468,20 +461,23 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
468
461
< div >
469
462
< Label image >
470
463
< img
471
- src = { process . env . PUBLIC_URL + "./startpoint. png" }
464
+ src = { ` ${ process . env . PUBLIC_URL } / ${ SpaceTypes . start } . png` }
472
465
alt = "startpoint tag"
473
466
/>
474
467
Start Point
475
468
</ Label >
476
469
< Label image >
477
470
< img
478
- src = { process . env . PUBLIC_URL + "./endpoint. png" }
471
+ src = { ` ${ process . env . PUBLIC_URL } / ${ SpaceTypes . end } . png` }
479
472
alt = "endpoint tag"
480
473
/>
481
474
End Point
482
475
</ Label >
483
476
< Label image >
484
- < img src = { process . env . PUBLIC_URL + "./wall.png" } alt = "wall tag" />
477
+ < img
478
+ src = { `${ process . env . PUBLIC_URL } /${ SpaceTypes . wall } .png` }
479
+ alt = "wall tag"
480
+ />
485
481
Wall
486
482
</ Label >
487
483
< Label image >
@@ -496,7 +492,7 @@ class MenuBar extends React.Component<MenuProps, _MenuState> {
496
492
Path
497
493
</ Label >
498
494
</ div >
499
- < div className = "row1" style = { { marginLeft : "auto" } } >
495
+ < div style = { { marginLeft : "auto" } } >
500
496
< Button
501
497
color = "purple"
502
498
circular
0 commit comments