Files
freeCodeCamp/common/app/routes/Jobs/redux/oldActions.js

198 lines
4.6 KiB
JavaScript
Raw Normal View History

import { Actions } from 'thundercats';
2015-09-24 20:28:04 -07:00
import store from 'store';
import { Observable } from 'rx';
2016-01-04 14:26:07 -08:00
import { nameSpacedTransformer } from '../../../../utils';
2015-07-25 15:42:03 -07:00
const assign = Object.assign;
2016-01-04 14:26:07 -08:00
const jobsTranformer = nameSpacedTransformer('jobsApp');
const noOper = { transform: () => {} };
export default Actions({
2016-01-04 14:26:07 -08:00
refs: { displayName: 'JobActions' },
shouldBindMethods: true,
// findJob assumes that the job is already in the list of jobs
findJob(id) {
2016-01-04 14:26:07 -08:00
return {
transform: jobsTranformer(oldState => {
const { currentJob = {}, jobs = [] } = oldState;
// currentJob already set
// do nothing
if (currentJob.id === id) {
return null;
}
2016-01-04 14:26:07 -08:00
const foundJob = jobs.reduce((newJob, job) => {
if (job.id === id) {
return job;
}
return newJob;
}, null);
2016-01-04 14:26:07 -08:00
// if no job found this will be null which is a op noop
return foundJob ?
assign({}, oldState, { currentJob: foundJob }) :
null;
})
};
},
2016-01-04 14:26:07 -08:00
saveJobToDb({ goTo, job }) {
return this.createService$('jobs', { job })
.map(job => ({
transform(state) {
state.location = {
action: 'PUSH',
pathname: goTo
};
return {
...state,
jobsApp: {
2016-01-04 14:26:07 -08:00
...state.jobs,
currentJob: job
}
};
}
}))
.catch(err => Observable.just({
2016-01-04 14:26:07 -08:00
transform(state) {
return { ...state, err };
}
}));
},
getJob(id) {
return this.readService$('jobs', { id })
.map(job => ({
transform: jobsTranformer(state => {
return { ...state, currentJob: job };
})
}))
.catch(err => Observable.just({
2016-01-04 14:26:07 -08:00
transform(state) {
return { ...state, err };
}
}));
},
getJobs() {
return this.readService$('jobs')
.map(jobs => ({
transform: jobsTranformer(state => {
return { ...state, jobs };
})
}))
.catch(err => Observable.just({
2016-01-04 14:26:07 -08:00
transform(state) {
return { ...state, err };
2016-01-04 14:26:07 -08:00
}
}));
2015-09-14 13:06:27 -07:00
},
openModal() {
2016-01-04 14:26:07 -08:00
return {
transform: jobsTranformer(state => ({ ...state, showModal: true }))
};
2015-09-14 13:06:27 -07:00
},
closeModal() {
2016-01-04 14:26:07 -08:00
return {
transform: jobsTranformer(state => ({ ...state, showModal: false }))
};
},
handleForm(value) {
return {
2016-01-04 14:26:07 -08:00
transform: jobsTranformer(oldState => {
const { form } = oldState;
const newState = assign({}, oldState);
newState.form = assign(
{},
form,
value
);
return newState;
2016-01-04 14:26:07 -08:00
})
};
2015-09-24 20:28:04 -07:00
},
saveForm: null,
2015-10-19 15:38:48 -07:00
clearSavedForm: null,
2016-01-04 14:26:07 -08:00
getSavedForm() {
const form = store.get('newJob');
if (form && !Array.isArray(form) && typeof form === 'object') {
return {
transform: jobsTranformer(state => {
return { ...state, form };
})
};
}
return noOper;
2015-10-26 17:39:38 -07:00
},
setPromoCode({ target: { value = '' }} = {}) {
2015-10-26 18:00:33 -07:00
return {
2016-01-04 14:26:07 -08:00
transform: jobsTranformer(state => ({
...state,
promoCode: value.replace(/[^\d\w\s]/, '')
}))
2015-10-26 18:00:33 -07:00
};
},
2016-01-04 14:26:07 -08:00
applyCode({ id, code = '', type = null}) {
const body = {
id,
code: code.replace(/[^\d\w\s]/, '')
2015-10-26 17:39:38 -07:00
};
2016-01-04 14:26:07 -08:00
if (type) {
body.type = type;
}
return this.postJSON$('/api/promos/getButton', body)
.map(({ promo }) => {
if (!promo || !promo.buttonId) {
return noOper;
2015-07-25 15:42:03 -07:00
}
2016-01-04 14:26:07 -08:00
const {
fullPrice: price,
buttonId,
discountAmount,
code: promoCode,
name: promoName
} = promo;
2016-01-04 14:26:07 -08:00
return {
transform: jobsTranformer(state => ({
...state,
price,
buttonId,
discountAmount,
promoCode,
promoApplied: true,
promoName
}))
};
})
.catch(err => Observable.just({
2016-01-04 14:26:07 -08:00
transform(state) {
return { ...state, err };
}
2016-01-04 14:26:07 -08:00
}));
},
clearPromo() {
2016-01-04 14:26:07 -08:00
return {
/* eslint-disable no-undefined */
2016-01-04 14:26:07 -08:00
transform: jobsTranformer(state => ({
...state,
price: undefined,
buttonId: undefined,
discountAmount: undefined,
promoCode: undefined,
2016-01-04 14:26:07 -08:00
promoApplied: false,
promoName: undefined
2016-01-04 14:26:07 -08:00
}))
/* eslint-enable no-undefined */
2016-01-04 14:26:07 -08:00
};
},
init({ instance: jobActions }) {
2015-09-24 20:28:04 -07:00
jobActions.saveForm.subscribe((form) => {
store.set('newJob', form);
});
2015-10-19 15:38:48 -07:00
jobActions.clearSavedForm.subscribe(() => {
store.remove('newJob');
});
2015-07-25 15:42:03 -07:00
return jobActions;
2016-01-04 14:26:07 -08:00
}
});