11"use client"
22import styles from "./page.module.css" ;
3- import Cell from "./cell" ;
4- import { useState , useMemo , useCallback , PropsWithChildren } from 'react' ;
3+ import { useState , useMemo , useCallback } from 'react' ;
54import { findMinCycle } from "./findMinCycle" ;
5+ import { RenderGrid } from "./RenderGrid" ;
6+ import { objectEquals } from "./objectEquals" ;
7+ import { swap } from "./swap" ;
68
79type puzzleItem = {
810 letter : string ,
@@ -12,80 +14,6 @@ type puzzleItem = {
1214
1315const gridCycleMapping = [ "A1" , "B1" , "C1" , "D1" , "E1" , "A2" , "C2" , "E2" , "A3" , "B3" , "C3" , "D3" , "E3" , "A4" , "C4" , "E4" , "A5" , "B5" , "C5" , "D5" , "E5" ]
1416
15- const objectEquals = < T extends object > ( obj1 : T , obj2 : T ) : boolean => {
16- if ( typeof obj1 !== 'object' || typeof obj2 !== 'object' ) return false ;
17-
18- const keys1 = Object . keys ( obj1 ) as ( keyof T ) [ ] ;
19- const keys2 = Object . keys ( obj2 ) as ( keyof T ) [ ] ;
20-
21- if ( keys1 . length !== keys2 . length ) return false ;
22-
23- for ( const key of keys1 ) {
24- const val1 = obj1 [ key ] ;
25- const val2 = obj2 [ key ] ;
26-
27- if ( typeof val1 === 'object' && typeof val2 === 'object' && val1 !== null && val2 !== null ) {
28- if ( ! objectEquals ( val1 , val2 ) ) return false ;
29- } else if ( val1 !== val2 ) {
30- return false ;
31- }
32- }
33-
34- return true ;
35- }
36- const RenderRows = ( { children } : PropsWithChildren ) => {
37- return < div className = { styles . boardRow } > { children } </ div > ;
38- }
39-
40- const splitArray = ( arr : puzzleItem [ ] ) => {
41- const result = [ ] ;
42- let index = 0 ;
43- const _arr = arr . length < 21 ? [ ...arr , ...Array ( 21 - arr . length ) . fill ( { letter : '' , index : 99 , swap : false } ) ] : arr . slice ( 0 , 21 ) ;
44-
45- while ( index < _arr . length ) {
46- if ( result . length % 2 === 0 ) {
47- result . push (
48- < RenderRows key = { `row-${ index } ` } >
49- { _arr . slice ( index , index + 5 )
50- . map (
51- ( item : puzzleItem , index : number ) =>
52- < Cell key = { `cell-${ index } ` } swapped = { item . swap } >
53- { item . letter }
54- </ Cell >
55- )
56- }
57- </ RenderRows >
58- ) ;
59- index += 5 ;
60- } else {
61- result . push (
62- < RenderRows key = { `row-${ index } ` } >
63- { _arr . slice ( index , index + 3 )
64- . map (
65- ( item : puzzleItem , index : number ) =>
66- < Cell key = { `cell-${ index } ` } swapped = { item . swap } >
67- { item . letter }
68- </ Cell >
69- )
70- }
71- </ RenderRows >
72- ) ;
73- index += 3 ;
74- }
75- }
76- return result ;
77- }
78-
79- const swap = ( puzzleState : puzzleItem [ ] , swapStep : number [ ] ) : puzzleItem [ ] => {
80- const _puzzleState = [ ...puzzleState ] ;
81- const temp = _puzzleState [ swapStep [ 0 ] ] ;
82- _puzzleState [ swapStep [ 0 ] ] = _puzzleState [ swapStep [ 1 ] ] ;
83- _puzzleState [ swapStep [ 1 ] ] = temp ;
84- _puzzleState [ swapStep [ 0 ] ] . swap = true ;
85- _puzzleState [ swapStep [ 1 ] ] . swap = true ;
86- return _puzzleState ;
87- }
88-
8917export default function Waffle ( ) {
9018 const [ puzzle , setPuzzle ] = useState < string > ( 'CACIPWTLMNSLERAILTUEE' ) ;
9119 const [ solution , setSolution ] = useState < string > ( 'CLUMPRNIAISLEWECLATTE' ) ;
@@ -212,7 +140,7 @@ export default function Waffle() {
212140 </ div >
213141
214142 < div className = { styles . boardGrid } >
215- { splitArray ( puzzleState ) }
143+ < RenderGrid arr = { puzzleState } > </ RenderGrid >
216144 </ div >
217145
218146 < div >
0 commit comments