From 2d5013d9ae89c44b2dea775b1f812363f6f49dcc Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Thu, 16 Jul 2015 16:55:37 -0700 Subject: [PATCH] fetch/set current hike shouldn't need to pass around state --- .../app/routes/Hikes/components/Lecture.jsx | 11 +++-- .../app/routes/Hikes/components/Question.jsx | 17 +++---- common/app/routes/Hikes/flux/Actions.js | 44 +++++++++---------- common/app/routes/Hikes/flux/Store.js | 2 +- 4 files changed, 33 insertions(+), 41 deletions(-) diff --git a/common/app/routes/Hikes/components/Lecture.jsx b/common/app/routes/Hikes/components/Lecture.jsx index e18a0eaeb8..c7c75b9f13 100644 --- a/common/app/routes/Hikes/components/Lecture.jsx +++ b/common/app/routes/Hikes/components/Lecture.jsx @@ -11,18 +11,16 @@ const debug = debugFactory('freecc:hikes'); export default contain( { store: 'hikesStore', - fetchAction: 'hikesActions.getHike', - getPayload({ currentHike, hikes, params: { dashedName } }) { + fetchAction: 'hikesActions.fetchCurrentHike', + getPayload({ currentHike, params: { dashedName } }) { const filterRegex = new RegExp(dashedName, 'i'); if (currentHike && filterRegex.test(currentHike.dashedName)) { return { - hikes: [], isPrimed: true, dashedName }; } return { - hikes, isPrimed: false, dashedName: dashedName }; @@ -32,8 +30,9 @@ export default contain( displayName: 'Lecture', propTypes: { - params: PropTypes.object, - currentHike: PropTypes.object + currentHike: PropTypes.object, + dashedName: PropTypes.string, + params: PropTypes.object }, handleError: debug, diff --git a/common/app/routes/Hikes/components/Question.jsx b/common/app/routes/Hikes/components/Question.jsx index 30c04a281f..6621db6364 100644 --- a/common/app/routes/Hikes/components/Question.jsx +++ b/common/app/routes/Hikes/components/Question.jsx @@ -16,26 +16,21 @@ const debug = debugFactory('freecc:hikes'); export default contain( { store: 'hikesStore', - map({ hikes, currentHike }) { + map({ currentHike }) { const { tests = [] } = currentHike; - return { - hikes, - currentHike, - tests - }; + + return { currentHike, tests }; }, - fetchAction: 'hikesActions.getHike', - getPayload({ currentHike, hikes, params: { dashedName } }) { + fetchAction: 'hikesActions.fetchCurrentHike', + getPayload({ currentHike, params: { dashedName } }) { const filterRegex = new RegExp(dashedName, 'i'); if (currentHike && filterRegex.test(currentHike.dashedName)) { return { - hikes: [], isPrimed: true, dashedName }; } return { - hikes, isPrimed: false, dashedName: dashedName }; @@ -46,9 +41,9 @@ export default contain( displayName: 'Question', propTypes: { - params: PropTypes.object, currentHike: PropTypes.object, dashedName: PropTypes.string, + params: PropTypes.object, tests: PropTypes.array }, diff --git a/common/app/routes/Hikes/flux/Actions.js b/common/app/routes/Hikes/flux/Actions.js index 1d22c91744..e748bf903b 100644 --- a/common/app/routes/Hikes/flux/Actions.js +++ b/common/app/routes/Hikes/flux/Actions.js @@ -1,5 +1,6 @@ import { helpers } from 'rx'; import { Actions } from 'thundercats'; +import assign from 'object.assign'; import debugFactory from 'debug'; import Fetchr from 'fetchr'; @@ -20,15 +21,13 @@ export default Actions({ }; }, - getHike: null, reEmit() { return helpers.identity; }, - setCurrentHike(currentHike) { - return { currentHike }; - } + fetchCurrentHike: null, + setCurrentHike: null }) .refs({ displayName: 'HikesActions' }) .init(({ instance }) => { @@ -36,10 +35,8 @@ export default Actions({ instance.fetchHikes.subscribe( ({ isPrimed }) => { if (isPrimed) { - debug('already primed'); return instance.reEmit(); } - debug('fetching'); service.read('hikes', null, null, (err, hikes) => { if (err) { debug('an error occurred fetching hikes', err); @@ -49,30 +46,31 @@ export default Actions({ } ); - instance.getHike.subscribe(({ isPrimed, hikes, dashedName }) => { + instance.fetchCurrentHike.subscribe(({ isPrimed, dashedName }) => { if (isPrimed) { - return instance.reEmit(); - } - if (hikes && hikes.length) { - const filterRegex = new RegExp(dashedName, 'i'); - const potentialHike = hikes - .filter((hike) => { - return filterRegex.test(hike.dashedName); - }) - .reduce((sum, hike) => { - return hike; - }); + return instance.setCurrentHike({ + transformer: (oldState) => { + const { hikes } = oldState; + const filterRegex = new RegExp(dashedName, 'i'); + const potentialHike = hikes + .filter(({ dashedName }) => { + return filterRegex.test(dashedName); + }) + .reduce((throwAway, hike) => { + return hike; + }); - if (potentialHike) { - return instance.setCurrentHike(potentialHike); - } + // TODO(berks): do something when potential hike does not exist + return assign({}, oldState, { currentHike: potentialHike }); + } + }); } service.read('hikes', { dashedName }, null, (err, hikes) => { if (err) { debug('error occurred fetching hike', err); } - const [hike] = hikes; - return instance.setCurrentHike(hike); + const [currentHike] = hikes; + return instance.setCurrentHike({ set: { currentHike } }); }); }); }); diff --git a/common/app/routes/Hikes/flux/Store.js b/common/app/routes/Hikes/flux/Store.js index 9f63cf37b7..387e3ff0e4 100644 --- a/common/app/routes/Hikes/flux/Store.js +++ b/common/app/routes/Hikes/flux/Store.js @@ -19,7 +19,7 @@ export default Store(initialValue) instance.register( fromMany( setter(setHikes), - setter(setCurrentHike), + setCurrentHike, transformer(reEmit) ) );