Move to localize non ui data
parent
c7af14bcf7
commit
f29545ef6c
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -13,5 +13,10 @@ export default createTypes([
|
||||||
'hardGoTo',
|
'hardGoTo',
|
||||||
|
|
||||||
'updateWindowHeight',
|
'updateWindowHeight',
|
||||||
'updateNavHeight'
|
'updateNavHeight',
|
||||||
|
|
||||||
|
// data handling
|
||||||
|
'updateChallengesData',
|
||||||
|
'updateJobsData',
|
||||||
|
'updateHikesData'
|
||||||
], 'app');
|
], 'app');
|
||||||
|
|
|
@ -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: [] };
|
||||||
}
|
}
|
||||||
|
|
|
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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] || {})
|
||||||
);
|
);
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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] || {}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 => {
|
||||||
|
|
|
@ -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 } }) => ({
|
||||||
|
|
Loading…
Reference in New Issue