2015-07-25 13:58:26 -07:00
|
|
|
import { Actions } from 'thundercats';
|
2015-09-24 20:28:04 -07:00
|
|
|
import store from 'store';
|
2016-01-04 14:26:07 -08:00
|
|
|
import { nameSpacedTransformer } from '../../../../utils';
|
2015-07-25 15:42:03 -07:00
|
|
|
|
2015-09-21 22:41:12 -07:00
|
|
|
const assign = Object.assign;
|
2016-01-04 14:26:07 -08:00
|
|
|
const jobsTranformer = nameSpacedTransformer('jobsApp');
|
|
|
|
const noOper = { transform: () => {} };
|
2015-07-25 13:58:26 -07:00
|
|
|
|
|
|
|
export default Actions({
|
2016-01-04 14:26:07 -08:00
|
|
|
refs: { displayName: 'JobActions' },
|
|
|
|
shouldBindMethods: true,
|
2015-09-10 16:26:41 -07:00
|
|
|
// 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;
|
2015-09-10 16:26:41 -07:00
|
|
|
}
|
2016-01-04 14:26:07 -08:00
|
|
|
const foundJob = jobs.reduce((newJob, job) => {
|
|
|
|
if (job.id === id) {
|
|
|
|
return job;
|
|
|
|
}
|
|
|
|
return newJob;
|
|
|
|
}, null);
|
2015-09-10 16:26:41 -07:00
|
|
|
|
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;
|
|
|
|
})
|
2015-09-10 16:26:41 -07:00
|
|
|
};
|
|
|
|
},
|
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,
|
|
|
|
jobs: {
|
|
|
|
...state.jobs,
|
|
|
|
currentJob: job
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}))
|
|
|
|
.catch(err => ({
|
|
|
|
transform(state) {
|
|
|
|
return { ...state, err };
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
getJob(id) {
|
|
|
|
return this.readService$('jobs', { id })
|
|
|
|
.map(job => ({
|
|
|
|
transform: jobsTranformer(state => {
|
|
|
|
return { ...state, currentJob: job };
|
|
|
|
})
|
|
|
|
}))
|
|
|
|
.catch(err => ({
|
|
|
|
transform(state) {
|
|
|
|
return { ...state, err };
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
},
|
|
|
|
getJobs() {
|
|
|
|
return this.readService$('jobs')
|
|
|
|
.map(jobs => ({
|
|
|
|
transform: jobsTranformer(state => {
|
|
|
|
return { ...state, jobs };
|
|
|
|
})
|
|
|
|
}))
|
|
|
|
.catch(err => ({
|
|
|
|
transform(state) {
|
|
|
|
return { state, err };
|
|
|
|
}
|
|
|
|
}));
|
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 }))
|
|
|
|
};
|
2015-09-21 22:41:12 -07:00
|
|
|
},
|
2015-09-25 12:53:29 -07:00
|
|
|
handleForm(value) {
|
2015-09-21 22:41:12 -07:00
|
|
|
return {
|
2016-01-04 14:26:07 -08:00
|
|
|
transform: jobsTranformer(oldState => {
|
2015-09-22 13:56:55 -07:00
|
|
|
const { form } = oldState;
|
2015-09-21 22:41:12 -07:00
|
|
|
const newState = assign({}, oldState);
|
|
|
|
newState.form = assign(
|
|
|
|
{},
|
2015-09-22 13:56:55 -07:00
|
|
|
form,
|
2015-09-25 12:53:29 -07:00
|
|
|
value
|
2015-09-21 22:41:12 -07:00
|
|
|
);
|
|
|
|
return newState;
|
2016-01-04 14:26:07 -08:00
|
|
|
})
|
2015-09-21 22:41:12 -07: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)
|
|
|
|
.pluck('response')
|
|
|
|
.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;
|
2015-09-10 16:26:41 -07:00
|
|
|
|
2016-01-04 14:26:07 -08:00
|
|
|
return {
|
|
|
|
transform: jobsTranformer(state => ({
|
|
|
|
...state,
|
|
|
|
price,
|
|
|
|
buttonId,
|
|
|
|
discountAmount,
|
|
|
|
promoCode,
|
|
|
|
promoApplied: true,
|
|
|
|
promoName
|
|
|
|
}))
|
|
|
|
};
|
|
|
|
})
|
|
|
|
.catch(err => ({
|
|
|
|
transform(state) {
|
|
|
|
return { ...state, err };
|
2015-09-11 10:58:24 -07:00
|
|
|
}
|
2016-01-04 14:26:07 -08:00
|
|
|
}));
|
|
|
|
},
|
|
|
|
clearPromo(foo, undef) {
|
|
|
|
return {
|
|
|
|
transform: jobsTranformer(state => ({
|
|
|
|
...state,
|
|
|
|
price: undef,
|
|
|
|
buttonId: undef,
|
|
|
|
discountAmount: undef,
|
|
|
|
promoCode: undef,
|
|
|
|
promoApplied: false,
|
|
|
|
promoName: undef
|
|
|
|
}))
|
|
|
|
};
|
|
|
|
},
|
|
|
|
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
|
|
|
}
|
|
|
|
});
|