Skip to content

Commit 9547f5e

Browse files
author
Bruce Hauman
committed
simple modularity
1 parent 1960a13 commit 9547f5e

File tree

1 file changed

+47
-26
lines changed

1 file changed

+47
-26
lines changed

src/yome.js

+47-26
Original file line numberDiff line numberDiff line change
@@ -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

3030
Yome.sideCount = (st) => st.sides.length
@@ -33,7 +33,6 @@ Yome.sideCount = (st) => st.sides.length
3333
Yome.sliceTheta = (st) => 2 * Math.PI / Yome.sideCount(st)
3434
//l(Yome.sliceTheta(Yome.state))
3535

36-
3736
Yome.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 = () =>
202203
Yome.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

214215
Yome.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

222226
Yome.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

246253
Yome.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+
270290
Yome.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

Comments
 (0)