@@ -24,7 +24,7 @@ Yome.initialState = () => {
2424 return { sides : [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] . map ( ( ) => new Object ( ) ) }
2525}
2626
27- Yome . state = Yome . state || Yome . initialState ( ) ;
27+ // Yome.state = Yome.state || Yome.initialState();
2828//l(Yome.state)
2929
3030Yome . sideCount = ( st ) => st . sides . length
@@ -33,7 +33,6 @@ Yome.sideCount = (st) => st.sides.length
3333Yome . sliceTheta = ( st ) => 2 * Math . PI / Yome . sideCount ( st )
3434//l(Yome.sliceTheta(Yome.state))
3535
36-
3736Yome . rotate = ( theta , point ) => {
3837 const sint = Math . sin ( theta ) , cost = Math . cos ( theta ) ;
3938 return { x : ( point . x * cost ) - ( point . y * sint ) ,
@@ -183,14 +182,16 @@ Yome.drawYome = (st) =>
183182//Yome.clearPlayArea()
184183
185184//side effecting
186- Yome . eventHandler = ( f ) =>
187- ( e => { e . preventDefault ( ) ; f ( e . target . value ) ; Yome . render ( ) } )
185+ Yome . prevent = ( f ) =>
186+ ( e => { e . preventDefault ( ) ; f ( e . target . value ) ; } )
188187
189188//side effecting
190- Yome . changeSideCount = ( new_count ) => {
189+ Yome . changeSideCount = ( state ) =>
190+ ( new_count ) => {
191191 let nArray = Array . apply ( null , Array ( parseInt ( new_count ) ) ) ;
192- Yome . state . sides = nArray . map ( ( _ , i ) => Yome . state . sides [ i ] || { } ) ;
193- }
192+ state . changeState ( ( st ) => st . sides = nArray . map ( ( _ , i ) => st . sides [ i ] || { } ) )
193+ }
194+
194195//Yome.changeSideCount(6)
195196//Yome.changeSideCount(7)
196197//Yome.changeSideCount(8)
@@ -202,7 +203,7 @@ Yome.sideOptions = () =>
202203Yome . sideCountInput = st =>
203204 < div className = "top-control" >
204205 < span > Size of Yome </ span >
205- < select onChange = { Yome . eventHandler ( Yome . changeSideCount ) }
206+ < select onChange = { Yome . prevent ( Yome . changeSideCount ( st ) ) }
206207 value = { Yome . sideCount ( st ) } >
207208 { Yome . sideOptions ( ) }
208209 </ select >
@@ -213,10 +214,13 @@ Yome.sideCountInput = st =>
213214
214215Yome . worldPosition = ( point ) => ( { x : point . x + 250 , y : point . y + 250 } )
215216
216- Yome . addRemoveWindow = ( i ) =>
217+ Yome . addRemoveWindow = ( state , i ) =>
217218 ( _ ) => {
218- const side = Yome . state . sides [ i ] ;
219- side . face = ( ! side . face ? "window" : null ) ;
219+ state . changeState (
220+ ( st ) => {
221+ const side = st . sides [ i ] ;
222+ side . face = ( ! side . face ? "window" : null ) ;
223+ } )
220224 }
221225
222226Yome . windowControl = ( st , side , i ) => {
@@ -227,7 +231,7 @@ Yome.windowControl = (st, side, i) => {
227231 left : pos . x } } >
228232 < a className = { "window-control-offset " +
229233 ( add ? "add" : "remove" ) }
230- onClick = { Yome . eventHandler ( Yome . addRemoveWindow ( i ) ) }
234+ onClick = { Yome . prevent ( Yome . addRemoveWindow ( st , i ) ) }
231235 href = "#" >
232236 { add ? "+ window" : "- window" }
233237 </ a >
@@ -240,35 +244,51 @@ Yome.windowControls = (st) =>
240244// --- Corner Controls
241245
242246// SIDE EFFECT
243- Yome . addRemoveCornerItem = ( type , side ) =>
244- ( _ ) => side . corner = ( side . corner ? null : type )
247+ Yome . addRemoveCornerItem = ( state , type , i ) =>
248+ ( _ ) =>
249+ state . changeState ( st => {
250+ st . sides [ i ] . corner = ( st . sides [ i ] . corner ? null : type )
251+ } )
245252
246253Yome . cornerControlStateClass = ( type , corner_type ) =>
247254 ( ( ! corner_type ) && "add" ) || ( ( corner_type == type ) && "remove" ) || "hidden"
248255
249- Yome . cornerControlLink = ( type , side ) =>
250- < a className = { Yome . cornerControlStateClass ( type , side . corner ) }
256+ Yome . cornerControlLink = ( state , type , i ) => {
257+ const side = state . sides [ i ] ;
258+ return < a className = { Yome . cornerControlStateClass ( type , side . corner ) }
251259 key = { type } href = "#"
252- onClick = { Yome . eventHandler ( Yome . addRemoveCornerItem ( type , side ) ) } >
260+ onClick = { Yome . prevent ( Yome . addRemoveCornerItem ( state , type , i ) ) } >
253261 { ( side . corner ? "- " : "+ " ) + type }
254262 </ a >
263+ }
255264
256- Yome . cornerControlLinks = ( side , i ) =>
265+ Yome . cornerControlLinks = ( state , i ) =>
257266 [ "stove-vent" , "zip-door" , "door-frame" ] . map (
258- ( t ) => Yome . cornerControlLink ( t , side ) )
267+ ( t ) => Yome . cornerControlLink ( state , t , i ) )
259268
260- Yome . cornerControl = ( st , side , i ) => {
261- let theta = Yome . sliceTheta ( st ) * ( i + 0.5 ) ,
269+ Yome . cornerControl = ( st , i ) => {
270+ let side = st . sides [ i ] ,
271+ theta = Yome . sliceTheta ( st ) * ( i + 0.5 ) ,
262272 pos = Yome . worldPosition ( Yome . radialPoint ( 221 , theta ) ) ;
263273 return < div className = "control-holder" style = { { top : pos . y , left : pos . x } } >
264274 < div className = "corner-control-offset" >
265- { Yome . cornerControlLinks ( side , i ) }
275+ { Yome . cornerControlLinks ( st , i ) }
266276 </ div >
267277 </ div >
268278}
269279
280+ Yome . StateHolder = function ( sides , renderFunc ) {
281+ this . sides = sides ;
282+ this . __render = renderFunc ;
283+ }
284+
285+ Yome . StateHolder . prototype . changeState = function ( f ) {
286+ f ( this ) ;
287+ this . __render ( )
288+ }
289+
270290Yome . cornerControls = ( st ) =>
271- st . sides . map ( ( side , i ) => Yome . cornerControl ( st , side , i ) )
291+ st . sides . map ( ( _ , i ) => Yome . cornerControl ( st , i ) )
272292
273293// --- Add new code above this line ---
274294
@@ -282,7 +302,8 @@ Yome.widget = (st) =>
282302 </ div >
283303 </ div >
284304
285- Yome . render = ( ) =>
286- React . render ( Yome . widget ( Yome . state ) , document . getElementById ( 'app' ) )
305+ Yome . state = Yome . state ||
306+ new Yome . StateHolder ( Yome . initialState ( ) . sides ,
307+ ( ) => { React . render ( Yome . widget ( Yome . state ) , document . getElementById ( 'app' ) ) } ) ;
287308
288- Yome . render ( ) ;
309+ Yome . state . __render ( )
0 commit comments