@@ -10,9 +10,11 @@ import {
10
10
Row ,
11
11
Col ,
12
12
ButtonGroup ,
13
- Button
13
+ Button ,
14
+ Dropdown ,
15
+ DropdownButton
14
16
} from 'react-bootstrap' ;
15
- import { useCallback , useEffect , useMemo , useState } from 'react' ;
17
+ import { Fragment , useCallback , useEffect , useMemo , useState } from 'react' ;
16
18
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
17
19
import {
18
20
faRecycle ,
@@ -22,7 +24,7 @@ import {
22
24
} from '@fortawesome/free-solid-svg-icons' ;
23
25
24
26
import SudokuCell from 'components/sudokuCell' ;
25
- import { checkSolution , getInvalids } from 'utils/sudoku' ;
27
+ import { checkSolution , getInvalids , difficulties } from 'utils/sudoku' ;
26
28
import useRainbow from 'hooks/useRainbow' ;
27
29
28
30
export default function SudokuBoard ( ) {
@@ -65,7 +67,10 @@ export default function SudokuBoard() {
65
67
} ) ,
66
68
[ ]
67
69
) ;
68
- const handleNew = useCallback ( ( ) => setPuzzle ( getSudoku ( 'easy' ) ) , [ ] ) ;
70
+ const handleNew = useCallback (
71
+ ( difficulty ) => setPuzzle ( getSudoku ( difficulty ) ) ,
72
+ [ ]
73
+ ) ;
69
74
const handleSave = useCallback (
70
75
( ) =>
71
76
setSavedState ( {
@@ -107,9 +112,23 @@ export default function SudokuBoard() {
107
112
< Row className = "mb-2" >
108
113
< Col className = "d-flex justify-content-center g-0" >
109
114
< ButtonGroup className = "w-100" >
110
- < Button onClick = { handleNew } >
111
- < FontAwesomeIcon icon = { faRecycle } /> New
112
- </ Button >
115
+ < DropdownButton
116
+ as = { ButtonGroup }
117
+ title = {
118
+ < Fragment >
119
+ < FontAwesomeIcon icon = { faRecycle } /> New
120
+ </ Fragment >
121
+ }
122
+ >
123
+ { difficulties . map ( ( difficulty ) => (
124
+ < Dropdown . Item
125
+ key = { difficulty }
126
+ onClick = { ( ) => handleNew ( difficulty . toLowerCase ( ) ) }
127
+ >
128
+ { difficulty }
129
+ </ Dropdown . Item >
130
+ ) ) }
131
+ </ DropdownButton >
113
132
< Button onClick = { handleSave } >
114
133
< FontAwesomeIcon icon = { faFloppyDisk } /> Save
115
134
</ Button >
@@ -134,9 +153,10 @@ export default function SudokuBoard() {
134
153
{ cells . map ( ( row , rowIdx ) => (
135
154
< Row key = { rowIdx } className = "d-flex justify-content-center" >
136
155
{ row . map ( ( value , colIdx ) => {
137
- const cellColor = hsl ( solved ? animationColor : '#ffffff' ) ;
156
+ let cellColor = null ;
138
157
139
158
if ( solved ) {
159
+ cellColor = hsl ( animationColor ) ;
140
160
cellColor . h += ( rowIdx * 9 + colIdx ) * 5 ;
141
161
}
142
162
@@ -151,7 +171,7 @@ export default function SudokuBoard() {
151
171
valid = { invalids [ rowIdx ] [ colIdx ] }
152
172
onClick = { handleClick }
153
173
onChange = { handleChange }
154
- bg = { cellColor . formatHex ( ) }
174
+ bg = { cellColor ? .formatHex ?. ( ) }
155
175
/>
156
176
) ;
157
177
} ) }
0 commit comments