Move to localize non ui data

pull/7430/head
Berkeley Martinez 2016-03-10 17:21:46 -08:00
parent c7af14bcf7
commit f29545ef6c
16 changed files with 61 additions and 50 deletions

View File

@ -2,6 +2,7 @@ import { combineReducers } from 'redux';
import { reducer as formReducer } from 'redux-form'; import { reducer as formReducer } from 'redux-form';
import { reducer as app } from './redux'; import { reducer as app } from './redux';
import entitieReducer from './redux/entities-reducer';
import { reducer as hikesApp } from './routes/Hikes/redux'; import { reducer as hikesApp } from './routes/Hikes/redux';
import { reducer as challengesApp } from './routes/challenges/redux'; import { reducer as challengesApp } from './routes/challenges/redux';
import { import {
@ -12,6 +13,7 @@ import {
export default function createReducer(sideReducers = {}) { export default function createReducer(sideReducers = {}) {
return combineReducers({ return combineReducers({
...sideReducers, ...sideReducers,
entities: entitieReducer,
app, app,
hikesApp, hikesApp,
jobsApp, jobsApp,

View File

@ -33,3 +33,9 @@ export const hardGoTo = createAction(types.hardGoTo);
export const updateWindowHeight = createAction(types.updateWindowHeight); export const updateWindowHeight = createAction(types.updateWindowHeight);
export const updateNavHeight = createAction(types.updateNavHeight); export const updateNavHeight = createAction(types.updateNavHeight);
// data
export const updateChallengesData = createAction(types.updateChallengesData);
export const updateJobsData = createAction(types.updateJobsData);
export const updateHikesData = createAction(types.updateHikesData);

View File

@ -0,0 +1,15 @@
const initialState = {
hike: {},
challenge: {},
job: {}
};
export default function dataReducer(state = initialState, action) {
if (action.meta && action.meta.entities) {
return {
...state,
...action.meta.entities
};
}
return state;
}

View File

@ -13,5 +13,10 @@ export default createTypes([
'hardGoTo', 'hardGoTo',
'updateWindowHeight', 'updateWindowHeight',
'updateNavHeight' 'updateNavHeight',
// data handling
'updateChallengesData',
'updateJobsData',
'updateHikesData'
], 'app'); ], 'app');

View File

@ -13,9 +13,9 @@ import contain from '../../../utils/professor-x';
// const log = debug('fcc:hikes'); // const log = debug('fcc:hikes');
const mapStateToProps = createSelector( const mapStateToProps = createSelector(
state => state.hikesApp.hikes.entities, state => state.entities.hike,
state => state.hikesApp.hikes.results, state => state.hikesApp.hikes,
(hikesMap, hikesByDashedName)=> { (hikesMap, hikesByDashedName) => {
if (!hikesMap || !hikesByDashedName) { if (!hikesMap || !hikesByDashedName) {
return { hikes: [] }; return { hikes: [] };
} }

View File

@ -42,7 +42,7 @@ export class Lecture extends React.Component {
componentWillMount() { componentWillMount() {
if (!this.props.id) { if (!this.props.id) {
this.props.hardGoTo('/map'); // this.props.hardGoTo('/map');
} }
} }

View File

@ -13,7 +13,8 @@ export const fetchHikes = createAction(types.fetchHikes);
// called within fetchHikesSaga // called within fetchHikesSaga
export const fetchHikesCompleted = createAction( export const fetchHikesCompleted = createAction(
types.fetchHikesCompleted, types.fetchHikesCompleted,
(hikes, currentHike) => ({ hikes, currentHike }) (entities, hikes, currentHike) => ({ hikes, currentHike }),
entities => ({ entities })
); );
export const resetHike = createAction(types.resetHike); export const resetHike = createAction(types.resetHike);

View File

@ -25,14 +25,9 @@ export default ({ services }) => ({ dispatch }) => next => {
{ hikes: arrayOf(hike) } { hikes: arrayOf(hike) }
); );
hikes = { const currentHike = findCurrentHike(result.hikes, dashedName);
entities: entities.hike,
results: result.hikes
};
const currentHike = findCurrentHike(hikes, dashedName); return fetchHikesCompleted(entities, result.hikes, currentHike);
return fetchHikesCompleted(hikes, currentHike);
}) })
.catch(error => { .catch(error => {
return Observable.just({ return Observable.just({

View File

@ -3,10 +3,7 @@ import types from './types';
import { findNextHikeName } from './utils'; import { findNextHikeName } from './utils';
const initialState = { const initialState = {
hikes: { hikes: [],
results: [],
entities: {}
},
// ui // ui
// hike dashedName // hike dashedName
currentHike: '', currentHike: '',
@ -91,7 +88,6 @@ export default handleActions(
[types.fetchHikesCompleted]: (state, { payload }) => { [types.fetchHikesCompleted]: (state, { payload }) => {
const { hikes, currentHike } = payload; const { hikes, currentHike } = payload;
return { return {
...state, ...state,
hikes, hikes,

View File

@ -2,7 +2,7 @@
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
export const getCurrentHike = createSelector( export const getCurrentHike = createSelector(
state => state.hikesApp.hikes.entities, state => state.entities.hike,
state => state.hikesApp.currentHike, state => state.hikesApp.currentHike,
(hikesMap, currentHikeDashedName) => (hikesMap[currentHikeDashedName] || {}) (hikesMap, currentHikeDashedName) => (hikesMap[currentHikeDashedName] || {})
); );

View File

@ -4,7 +4,7 @@ import _ from 'lodash';
const log = debug('fcc:hikes:utils'); const log = debug('fcc:hikes:utils');
function getFirstHike(hikes) { function getFirstHike(hikes) {
return hikes.results[0]; return hikes[0];
} }
// interface Hikes { // interface Hikes {
@ -26,7 +26,6 @@ export function findCurrentHike(hikes, dashedName) {
const filterRegex = new RegExp(dashedName, 'i'); const filterRegex = new RegExp(dashedName, 'i');
return hikes return hikes
.results
.filter(dashedName => { .filter(dashedName => {
return filterRegex.test(dashedName); return filterRegex.test(dashedName);
}) })
@ -43,23 +42,23 @@ export function getCurrentHike(hikes = {}, dashedName) {
} }
// findNextHikeName( // findNextHikeName(
// hikes: { results: String[] }, // hikes: String[],
// dashedName: String // dashedName: String
// ) => String // ) => String
export function findNextHikeName({ results }, dashedName) { export function findNextHikeName(hikes, dashedName) {
if (!dashedName) { if (!dashedName) {
log('find next hike no id provided'); log('find next hike no dashedName provided');
return results[0]; return hikes[0];
} }
const currentIndex = _.findIndex( const currentIndex = _.findIndex(
results, hikes,
_dashedName => _dashedName === dashedName _dashedName => _dashedName === dashedName
); );
if (currentIndex >= results.length) { if (currentIndex >= hikes.length) {
return ''; return '';
} }
return results[currentIndex + 1]; return hikes[currentIndex + 1];
} }

View File

@ -16,12 +16,11 @@ import {
} from '../redux/actions'; } from '../redux/actions';
const mapStateToProps = createSelector( const mapStateToProps = createSelector(
state => state.jobsApp.jobs.entities, state => state.entities.job,
state => state.jobsApp.jobs.results, state => state.jobsApp.jobs,
state => state.jobsApp, (jobsMap, jobsById) => ({
(jobsMap, jobsById) => { jobs: jobsById.map(id => jobsMap[id])
return { jobs: jobsById.map(id => jobsMap[id]) }; })
}
); );
const bindableActions = { const bindableActions = {

View File

@ -60,12 +60,12 @@ function generateMessage(
const mapStateToProps = createSelector( const mapStateToProps = createSelector(
state => state.app, state => state.app,
state => state.jobsApp.currentJob, state => state.jobsApp.currentJob,
state => state.jobsApp.jobs.entities, state => state.entities.job,
({ username, isFrontEndCert, isBackEndCert }, currentJob, jobs) => ({ ({ username, isFrontEndCert, isBackEndCert }, currentJob, jobMap) => ({
username, username,
isFrontEndCert, isFrontEndCert,
isBackEndCert, isBackEndCert,
job: jobs[currentJob] || {} job: jobMap[currentJob] || {}
}) })
); );

View File

@ -5,7 +5,8 @@ import types from './types';
export const fetchJobs = createAction(types.fetchJobs); export const fetchJobs = createAction(types.fetchJobs);
export const fetchJobsCompleted = createAction( export const fetchJobsCompleted = createAction(
types.fetchJobsCompleted, types.fetchJobsCompleted,
(currentJob, jobs) => ({ currentJob, jobs }) (_, currentJob, jobs) => ({ currentJob, jobs }),
entities => ({ entities })
); );
export const findJob = createAction(types.findJob); export const findJob = createAction(types.findJob);

View File

@ -32,11 +32,9 @@ export default ({ services }) => ({ dispatch }) => next => {
return fetchJobsCompleted( return fetchJobsCompleted(
entities,
result.jobs[0], result.jobs[0],
{ result.jobs
entities: entities.job,
results: result.jobs
}
); );
}) })
.catch(error => { .catch(error => {

View File

@ -13,21 +13,15 @@ const initialState = {
initialValues: {}, initialValues: {},
currentJob: '', currentJob: '',
newJob: {}, newJob: {},
jobs: { jobs: []
entities: {},
results: []
}
}; };
export default handleActions( export default handleActions(
{ {
[types.findJob]: (state, { payload: id }) => { [types.findJob]: (state, { payload: id }) => {
const currentJob = state.jobs.entities[id];
return { return {
...state, ...state,
currentJob: currentJob && currentJob.id ? currentJob: id
currentJob.id :
state.currentJob
}; };
}, },
[types.fetchJobsCompleted]: (state, { payload: { jobs, currentJob } }) => ({ [types.fetchJobsCompleted]: (state, { payload: { jobs, currentJob } }) => ({