Update /jobs
This commit is contained in:
@ -5,7 +5,7 @@ import { Disposable, Observable } from 'rx';
|
|||||||
import { post$, postJSON$ } from '../utils/ajax-stream.js';
|
import { post$, postJSON$ } from '../utils/ajax-stream.js';
|
||||||
import { AppActions, AppStore } from './flux';
|
import { AppActions, AppStore } from './flux';
|
||||||
import { HikesActions } from './routes/Hikes/flux';
|
import { HikesActions } from './routes/Hikes/flux';
|
||||||
import { JobActions, JobsStore} from './routes/Jobs/flux';
|
import { JobActions } from './routes/Jobs/flux';
|
||||||
|
|
||||||
const ajaxStamp = stamp({
|
const ajaxStamp = stamp({
|
||||||
methods: {
|
methods: {
|
||||||
@ -22,8 +22,7 @@ export default Cat().init(({ instance: cat, args: [services] }) => {
|
|||||||
return Observable.create(function(observer) {
|
return Observable.create(function(observer) {
|
||||||
services.read(resource, params, config, (err, res) => {
|
services.read(resource, params, config, (err, res) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
observer.onError(err);
|
return observer.onError(err);
|
||||||
return observer.onCompleted();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
observer.onNext(res);
|
observer.onNext(res);
|
||||||
@ -31,8 +30,24 @@ export default Cat().init(({ instance: cat, args: [services] }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return Disposable.create(function() {
|
return Disposable.create(function() {
|
||||||
|
observer.dispose();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
createService$(resource, params, body, config) {
|
||||||
|
return Observable.create(function(observer) {
|
||||||
|
services.create(resource, params, body, config, (err, res) => {
|
||||||
|
if (err) {
|
||||||
|
return observer.onError(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
observer.onNext(res);
|
||||||
observer.onCompleted();
|
observer.onCompleted();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return Disposable.create(function() {
|
||||||
|
observer.dispose();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -40,9 +55,11 @@ export default Cat().init(({ instance: cat, args: [services] }) => {
|
|||||||
|
|
||||||
cat.register(HikesActions.compose(serviceStamp, ajaxStamp), null, services);
|
cat.register(HikesActions.compose(serviceStamp, ajaxStamp), null, services);
|
||||||
cat.register(AppActions.compose(serviceStamp), null, services);
|
cat.register(AppActions.compose(serviceStamp), null, services);
|
||||||
|
cat.register(
|
||||||
|
JobActions.compose(serviceStamp, ajaxStamp),
|
||||||
|
null,
|
||||||
|
cat,
|
||||||
|
services
|
||||||
|
);
|
||||||
cat.register(AppStore, null, cat);
|
cat.register(AppStore, null, cat);
|
||||||
|
|
||||||
|
|
||||||
cat.register(JobActions, null, cat, services);
|
|
||||||
cat.register(JobsStore.compose(serviceStamp), null, cat);
|
|
||||||
});
|
});
|
||||||
|
@ -11,6 +11,9 @@ const initValue = {
|
|||||||
// lecture state
|
// lecture state
|
||||||
currentHike: {},
|
currentHike: {},
|
||||||
showQuestion: false
|
showQuestion: false
|
||||||
|
},
|
||||||
|
jobsApp: {
|
||||||
|
showModal: false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -19,25 +22,15 @@ export default Store({
|
|||||||
displayName: 'AppStore',
|
displayName: 'AppStore',
|
||||||
value: initValue
|
value: initValue
|
||||||
},
|
},
|
||||||
init({ instance: appStore, args: [cat] }) {
|
init({ instance: store, args: [cat] }) {
|
||||||
|
const register = createRegistrar(store);
|
||||||
|
// app
|
||||||
const {
|
const {
|
||||||
updateLocation,
|
updateLocation,
|
||||||
getUser,
|
getUser,
|
||||||
setTitle
|
setTitle
|
||||||
} = cat.getActions('appActions');
|
} = cat.getActions('appActions');
|
||||||
|
|
||||||
const register = createRegistrar(appStore);
|
|
||||||
const {
|
|
||||||
toggleQuestions,
|
|
||||||
fetchHikes,
|
|
||||||
hideInfo,
|
|
||||||
grabQuestion,
|
|
||||||
releaseQuestion,
|
|
||||||
moveQuestion,
|
|
||||||
answer
|
|
||||||
} = cat.getActions('hikesActions');
|
|
||||||
|
|
||||||
// app
|
|
||||||
register(
|
register(
|
||||||
fromMany(
|
fromMany(
|
||||||
setter(
|
setter(
|
||||||
@ -51,6 +44,16 @@ export default Store({
|
|||||||
);
|
);
|
||||||
|
|
||||||
// hikes
|
// hikes
|
||||||
|
const {
|
||||||
|
toggleQuestions,
|
||||||
|
fetchHikes,
|
||||||
|
hideInfo,
|
||||||
|
grabQuestion,
|
||||||
|
releaseQuestion,
|
||||||
|
moveQuestion,
|
||||||
|
answer
|
||||||
|
} = cat.getActions('hikesActions');
|
||||||
|
|
||||||
register(
|
register(
|
||||||
fromMany(
|
fromMany(
|
||||||
toggleQuestions,
|
toggleQuestions,
|
||||||
@ -63,6 +66,36 @@ export default Store({
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
return appStore;
|
|
||||||
|
// jobs
|
||||||
|
const {
|
||||||
|
findJob,
|
||||||
|
saveJobToDb,
|
||||||
|
getJob,
|
||||||
|
getJobs,
|
||||||
|
openModal,
|
||||||
|
closeModal,
|
||||||
|
handleForm,
|
||||||
|
getSavedForm,
|
||||||
|
setPromoCode,
|
||||||
|
applyCode,
|
||||||
|
clearPromo
|
||||||
|
} = cat.getActions('JobActions');
|
||||||
|
|
||||||
|
register(
|
||||||
|
fromMany(
|
||||||
|
findJob,
|
||||||
|
saveJobToDb,
|
||||||
|
getJob,
|
||||||
|
getJobs,
|
||||||
|
openModal,
|
||||||
|
closeModal,
|
||||||
|
handleForm,
|
||||||
|
getSavedForm,
|
||||||
|
setPromoCode,
|
||||||
|
applyCode,
|
||||||
|
clearPromo
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -11,12 +11,12 @@ const paypalIds = {
|
|||||||
|
|
||||||
export default contain(
|
export default contain(
|
||||||
{
|
{
|
||||||
store: 'JobsStore',
|
store: 'appStore',
|
||||||
actions: [
|
actions: [
|
||||||
'jobActions',
|
'jobActions',
|
||||||
'appActions'
|
'appActions'
|
||||||
],
|
],
|
||||||
map({
|
map({ jobApp: {
|
||||||
job: { id, isHighlighted } = {},
|
job: { id, isHighlighted } = {},
|
||||||
buttonId = isHighlighted ?
|
buttonId = isHighlighted ?
|
||||||
paypalIds.highlighted :
|
paypalIds.highlighted :
|
||||||
@ -26,7 +26,7 @@ export default contain(
|
|||||||
promoCode = '',
|
promoCode = '',
|
||||||
promoApplied = false,
|
promoApplied = false,
|
||||||
promoName
|
promoName
|
||||||
}) {
|
}}) {
|
||||||
return {
|
return {
|
||||||
id,
|
id,
|
||||||
isHighlighted,
|
isHighlighted,
|
||||||
@ -57,7 +57,7 @@ export default contain(
|
|||||||
|
|
||||||
goToJobBoard() {
|
goToJobBoard() {
|
||||||
const { appActions } = this.props;
|
const { appActions } = this.props;
|
||||||
appActions.updateRoute('/jobs');
|
appActions.goTo('/jobs');
|
||||||
},
|
},
|
||||||
|
|
||||||
renderDiscount(discountAmount) {
|
renderDiscount(discountAmount) {
|
||||||
|
@ -6,7 +6,10 @@ import ListJobs from './List.jsx';
|
|||||||
|
|
||||||
export default contain(
|
export default contain(
|
||||||
{
|
{
|
||||||
store: 'jobsStore',
|
store: 'appStore',
|
||||||
|
map({ jobsApp: { jobs, showModal }}) {
|
||||||
|
return { jobs, showModal };
|
||||||
|
},
|
||||||
fetchAction: 'jobActions.getJobs',
|
fetchAction: 'jobActions.getJobs',
|
||||||
actions: [
|
actions: [
|
||||||
'appActions',
|
'appActions',
|
||||||
@ -18,25 +21,19 @@ export default contain(
|
|||||||
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
children: PropTypes.element,
|
children: PropTypes.element,
|
||||||
numOfFollowers: PropTypes.number,
|
|
||||||
appActions: PropTypes.object,
|
appActions: PropTypes.object,
|
||||||
jobActions: PropTypes.object,
|
jobActions: PropTypes.object,
|
||||||
jobs: PropTypes.array,
|
jobs: PropTypes.array,
|
||||||
showModal: PropTypes.bool
|
showModal: PropTypes.bool
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount() {
|
|
||||||
const { jobActions } = this.props;
|
|
||||||
jobActions.getFollowers();
|
|
||||||
},
|
|
||||||
|
|
||||||
handleJobClick(id) {
|
handleJobClick(id) {
|
||||||
const { appActions, jobActions } = this.props;
|
const { appActions, jobActions } = this.props;
|
||||||
if (!id) {
|
if (!id) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
jobActions.findJob(id);
|
jobActions.findJob(id);
|
||||||
appActions.updateRoute(`/jobs/${id}`);
|
appActions.goTo(`/jobs/${id}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
renderList(handleJobClick, jobs) {
|
renderList(handleJobClick, jobs) {
|
||||||
@ -84,7 +81,7 @@ export default contain(
|
|||||||
<Button
|
<Button
|
||||||
className='signup-btn btn-block btn-cta'
|
className='signup-btn btn-block btn-cta'
|
||||||
onClick={ ()=> {
|
onClick={ ()=> {
|
||||||
appActions.updateRoute('/jobs/new');
|
appActions.goTo('/jobs/new');
|
||||||
}}>
|
}}>
|
||||||
Post a job: $1,000
|
Post a job: $1,000
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -103,9 +103,9 @@ function makeRequired(validator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default contain({
|
export default contain({
|
||||||
|
store: 'appStore',
|
||||||
actions: 'jobActions',
|
actions: 'jobActions',
|
||||||
store: 'jobsStore',
|
map({ jobsApp: { form = {} } }) {
|
||||||
map({ form = {} }) {
|
|
||||||
const {
|
const {
|
||||||
position,
|
position,
|
||||||
locale,
|
locale,
|
||||||
|
@ -8,12 +8,12 @@ import JobNotFound from './JobNotFound.jsx';
|
|||||||
|
|
||||||
export default contain(
|
export default contain(
|
||||||
{
|
{
|
||||||
store: 'JobsStore',
|
store: 'appStore',
|
||||||
actions: [
|
actions: [
|
||||||
'appActions',
|
'appActions',
|
||||||
'jobActions'
|
'jobActions'
|
||||||
],
|
],
|
||||||
map({ form: job = {} }) {
|
map({ jobApp: { form: job = {} } }) {
|
||||||
return { job };
|
return { job };
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -32,7 +32,7 @@ export default contain(
|
|||||||
const { appActions, job } = this.props;
|
const { appActions, job } = this.props;
|
||||||
// redirect user in client
|
// redirect user in client
|
||||||
if (!job || !job.position || !job.description) {
|
if (!job || !job.position || !job.description) {
|
||||||
appActions.updateRoute('/jobs/new');
|
appActions.goTo('/jobs/new');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -53,13 +53,14 @@ function generateMessage(
|
|||||||
|
|
||||||
export default contain(
|
export default contain(
|
||||||
{
|
{
|
||||||
stores: ['appStore', 'jobsStore'],
|
store: 'appStore',
|
||||||
fetchWaitFor: 'jobsStore',
|
|
||||||
fetchAction: 'jobActions.getJob',
|
fetchAction: 'jobActions.getJob',
|
||||||
combineLatest(
|
map({
|
||||||
{ username, isFrontEndCert, isFullStackCert },
|
username,
|
||||||
{ currentJob }
|
isFrontEndCert,
|
||||||
) {
|
isFullStackCert,
|
||||||
|
jobsApp: { currentJob }
|
||||||
|
}) {
|
||||||
return {
|
return {
|
||||||
username,
|
username,
|
||||||
job: currentJob,
|
job: currentJob,
|
||||||
@ -67,11 +68,11 @@ export default contain(
|
|||||||
isFullStackCert
|
isFullStackCert
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
getPayload({ params: { id }, job = {} }) {
|
getPayload({ params: { id } }) {
|
||||||
return {
|
return id;
|
||||||
id,
|
},
|
||||||
isPrimed: job.id === id
|
isPrimed({ params: { id } = {}, job = {} }) {
|
||||||
};
|
return job.id === id;
|
||||||
},
|
},
|
||||||
// using es6 destructuring
|
// using es6 destructuring
|
||||||
shouldContainerFetch({ job = {} }, { params: { id } }
|
shouldContainerFetch({ job = {} }, { params: { id } }
|
||||||
|
@ -1,51 +1,100 @@
|
|||||||
import { Actions } from 'thundercats';
|
import { Actions } from 'thundercats';
|
||||||
import store from 'store';
|
import store from 'store';
|
||||||
import debugFactory from 'debug';
|
import { nameSpacedTransformer } from '../../../../utils';
|
||||||
import { jsonp$ } from '../../../../utils/jsonp$';
|
|
||||||
import { postJSON$ } from '../../../../utils/ajax-stream';
|
|
||||||
|
|
||||||
const debug = debugFactory('freecc:jobs:actions');
|
|
||||||
const assign = Object.assign;
|
const assign = Object.assign;
|
||||||
|
const jobsTranformer = nameSpacedTransformer('jobsApp');
|
||||||
|
const noOper = { transform: () => {} };
|
||||||
|
|
||||||
export default Actions({
|
export default Actions({
|
||||||
setJobs: null,
|
refs: { displayName: 'JobActions' },
|
||||||
|
shouldBindMethods: true,
|
||||||
// findJob assumes that the job is already in the list of jobs
|
// findJob assumes that the job is already in the list of jobs
|
||||||
findJob(id) {
|
findJob(id) {
|
||||||
return oldState => {
|
return {
|
||||||
const { currentJob = {}, jobs = [] } = oldState;
|
transform: jobsTranformer(oldState => {
|
||||||
// currentJob already set
|
const { currentJob = {}, jobs = [] } = oldState;
|
||||||
// do nothing
|
// currentJob already set
|
||||||
if (currentJob.id === id) {
|
// do nothing
|
||||||
return null;
|
if (currentJob.id === id) {
|
||||||
}
|
return null;
|
||||||
const foundJob = jobs.reduce((newJob, job) => {
|
|
||||||
if (job.id === id) {
|
|
||||||
return job;
|
|
||||||
}
|
}
|
||||||
return newJob;
|
const foundJob = jobs.reduce((newJob, job) => {
|
||||||
}, null);
|
if (job.id === id) {
|
||||||
|
return job;
|
||||||
|
}
|
||||||
|
return newJob;
|
||||||
|
}, null);
|
||||||
|
|
||||||
// if no job found this will be null which is a op noop
|
// if no job found this will be null which is a op noop
|
||||||
return foundJob ?
|
return foundJob ?
|
||||||
assign({}, oldState, { currentJob: foundJob }) :
|
assign({}, oldState, { currentJob: foundJob }) :
|
||||||
null;
|
null;
|
||||||
|
})
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
setError: null,
|
saveJobToDb({ goTo, job }) {
|
||||||
getJob: null,
|
return this.createService$('jobs', { job })
|
||||||
saveJobToDb: null,
|
.map(job => ({
|
||||||
getJobs(params) {
|
transform(state) {
|
||||||
return { params };
|
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 };
|
||||||
|
}
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
openModal() {
|
openModal() {
|
||||||
return { showModal: true };
|
return {
|
||||||
|
transform: jobsTranformer(state => ({ ...state, showModal: true }))
|
||||||
|
};
|
||||||
},
|
},
|
||||||
closeModal() {
|
closeModal() {
|
||||||
return { showModal: false };
|
return {
|
||||||
|
transform: jobsTranformer(state => ({ ...state, showModal: false }))
|
||||||
|
};
|
||||||
},
|
},
|
||||||
handleForm(value) {
|
handleForm(value) {
|
||||||
return {
|
return {
|
||||||
transform(oldState) {
|
transform: jobsTranformer(oldState => {
|
||||||
const { form } = oldState;
|
const { form } = oldState;
|
||||||
const newState = assign({}, oldState);
|
const newState = assign({}, oldState);
|
||||||
newState.form = assign(
|
newState.form = assign(
|
||||||
@ -54,142 +103,92 @@ export default Actions({
|
|||||||
value
|
value
|
||||||
);
|
);
|
||||||
return newState;
|
return newState;
|
||||||
}
|
})
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
saveForm: null,
|
saveForm: null,
|
||||||
getSavedForm: null,
|
|
||||||
clearSavedForm: null,
|
clearSavedForm: null,
|
||||||
setForm(form) {
|
getSavedForm() {
|
||||||
return { form };
|
const form = store.get('newJob');
|
||||||
},
|
if (form && !Array.isArray(form) && typeof form === 'object') {
|
||||||
getFollowers: null,
|
return {
|
||||||
setFollowersCount(numOfFollowers) {
|
transform: jobsTranformer(state => {
|
||||||
return { numOfFollowers };
|
return { ...state, form };
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return noOper;
|
||||||
},
|
},
|
||||||
setPromoCode({ target: { value = '' }} = {}) {
|
setPromoCode({ target: { value = '' }} = {}) {
|
||||||
return { promoCode: value.replace(/[^\d\w\s]/, '') };
|
return {
|
||||||
|
transform: jobsTranformer(state => ({
|
||||||
|
...state,
|
||||||
|
promoCode: value.replace(/[^\d\w\s]/, '')
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
},
|
||||||
|
applyCode({ id, code = '', type = null}) {
|
||||||
|
const body = {
|
||||||
|
id,
|
||||||
|
code: code.replace(/[^\d\w\s]/, '')
|
||||||
|
};
|
||||||
|
if (type) {
|
||||||
|
body.type = type;
|
||||||
|
}
|
||||||
|
return this.postJSON$('/api/promos/getButton', body)
|
||||||
|
.pluck('response')
|
||||||
|
.map(({ promo }) => {
|
||||||
|
if (!promo || !promo.buttonId) {
|
||||||
|
return noOper;
|
||||||
|
}
|
||||||
|
const {
|
||||||
|
fullPrice: price,
|
||||||
|
buttonId,
|
||||||
|
discountAmount,
|
||||||
|
code: promoCode,
|
||||||
|
name: promoName
|
||||||
|
} = promo;
|
||||||
|
|
||||||
|
return {
|
||||||
|
transform: jobsTranformer(state => ({
|
||||||
|
...state,
|
||||||
|
price,
|
||||||
|
buttonId,
|
||||||
|
discountAmount,
|
||||||
|
promoCode,
|
||||||
|
promoApplied: true,
|
||||||
|
promoName
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch(err => ({
|
||||||
|
transform(state) {
|
||||||
|
return { ...state, err };
|
||||||
|
}
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
applyCode: null,
|
|
||||||
clearPromo(foo, undef) {
|
clearPromo(foo, undef) {
|
||||||
return {
|
return {
|
||||||
price: undef,
|
transform: jobsTranformer(state => ({
|
||||||
buttonId: undef,
|
...state,
|
||||||
discountAmount: undef,
|
price: undef,
|
||||||
promoCode: undef,
|
buttonId: undef,
|
||||||
promoApplied: false,
|
discountAmount: undef,
|
||||||
promoName: undef
|
promoCode: undef,
|
||||||
|
promoApplied: false,
|
||||||
|
promoName: undef
|
||||||
|
}))
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
applyPromo({
|
init({ instance: jobActions }) {
|
||||||
fullPrice: price,
|
|
||||||
buttonId,
|
|
||||||
discountAmount,
|
|
||||||
code: promoCode,
|
|
||||||
name: promoName
|
|
||||||
} = {}) {
|
|
||||||
return {
|
|
||||||
price,
|
|
||||||
buttonId,
|
|
||||||
discountAmount,
|
|
||||||
promoCode,
|
|
||||||
promoApplied: true,
|
|
||||||
promoName
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.refs({ displayName: 'JobActions' })
|
|
||||||
.init(({ instance: jobActions, args: [cat, services] }) => {
|
|
||||||
jobActions.getJobs.subscribe(() => {
|
|
||||||
services.read('jobs', null, null, (err, jobs) => {
|
|
||||||
if (err) {
|
|
||||||
debug('job services experienced an issue', err);
|
|
||||||
return jobActions.setError({ err });
|
|
||||||
}
|
|
||||||
jobActions.setJobs({ jobs });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
jobActions.getJob.subscribe(({ id, isPrimed }) => {
|
|
||||||
// job is already set, do nothing.
|
|
||||||
if (isPrimed) {
|
|
||||||
debug('job is primed');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
services.read('jobs', { id }, null, (err, job) => {
|
|
||||||
if (err) {
|
|
||||||
debug('job services experienced an issue', err);
|
|
||||||
return jobActions.setError({ err });
|
|
||||||
}
|
|
||||||
if (job) {
|
|
||||||
jobActions.setJobs({ currentJob: job });
|
|
||||||
}
|
|
||||||
jobActions.setJobs({});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
jobActions.saveForm.subscribe((form) => {
|
jobActions.saveForm.subscribe((form) => {
|
||||||
store.set('newJob', form);
|
store.set('newJob', form);
|
||||||
});
|
});
|
||||||
|
|
||||||
jobActions.getSavedForm.subscribe(() => {
|
|
||||||
const job = store.get('newJob');
|
|
||||||
if (job && !Array.isArray(job) && typeof job === 'object') {
|
|
||||||
jobActions.setForm(job);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
jobActions.clearSavedForm.subscribe(() => {
|
jobActions.clearSavedForm.subscribe(() => {
|
||||||
store.remove('newJob');
|
store.remove('newJob');
|
||||||
});
|
});
|
||||||
|
|
||||||
jobActions.saveJobToDb.subscribe(({ goTo, job }) => {
|
|
||||||
const appActions = cat.getActions('appActions');
|
|
||||||
services.create('jobs', { job }, null, (err, job) => {
|
|
||||||
if (err) {
|
|
||||||
debug('job services experienced an issue', err);
|
|
||||||
return jobActions.setError(err);
|
|
||||||
}
|
|
||||||
jobActions.setJobs({ job });
|
|
||||||
appActions.updateRoute(goTo);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
jobActions.getFollowers.subscribe(() => {
|
|
||||||
const url = 'https://cdn.syndication.twimg.com/widgets/followbutton/' +
|
|
||||||
'info.json?lang=en&screen_names=CamperJobs' +
|
|
||||||
'&callback=JSONPCallback';
|
|
||||||
|
|
||||||
jsonp$(url)
|
|
||||||
.map(({ response }) => {
|
|
||||||
return response[0]['followers_count'];
|
|
||||||
})
|
|
||||||
.subscribe(
|
|
||||||
count => jobActions.setFollowersCount(count),
|
|
||||||
err => jobActions.setError(err)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
jobActions.applyCode.subscribe(({ id, code = '', type = null}) => {
|
|
||||||
const body = {
|
|
||||||
id,
|
|
||||||
code: code.replace(/[^\d\w\s]/, '')
|
|
||||||
};
|
|
||||||
if (type) {
|
|
||||||
body.type = type;
|
|
||||||
}
|
|
||||||
postJSON$('/api/promos/getButton', body)
|
|
||||||
.pluck('response')
|
|
||||||
.subscribe(
|
|
||||||
({ promo }) => {
|
|
||||||
if (promo && promo.buttonId) {
|
|
||||||
jobActions.applyPromo(promo);
|
|
||||||
}
|
|
||||||
jobActions.setError(new Error('no promo found'));
|
|
||||||
},
|
|
||||||
jobActions.setError
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return jobActions;
|
return jobActions;
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
import { Store } from 'thundercats';
|
|
||||||
|
|
||||||
const {
|
|
||||||
createRegistrar,
|
|
||||||
setter,
|
|
||||||
transformer
|
|
||||||
} = Store;
|
|
||||||
|
|
||||||
export default Store({
|
|
||||||
refs: {
|
|
||||||
displayName: 'JobsStore',
|
|
||||||
value: { showModal: false }
|
|
||||||
},
|
|
||||||
init({ instance: jobsStore, args: [cat] }) {
|
|
||||||
const {
|
|
||||||
setJobs,
|
|
||||||
findJob,
|
|
||||||
setError,
|
|
||||||
openModal,
|
|
||||||
closeModal,
|
|
||||||
handleForm,
|
|
||||||
setForm,
|
|
||||||
setFollowersCount,
|
|
||||||
setPromoCode,
|
|
||||||
applyPromo,
|
|
||||||
clearPromo
|
|
||||||
} = cat.getActions('JobActions');
|
|
||||||
const register = createRegistrar(jobsStore);
|
|
||||||
register(setter(setJobs));
|
|
||||||
register(setter(setError));
|
|
||||||
register(setter(openModal));
|
|
||||||
register(setter(closeModal));
|
|
||||||
register(setter(setForm));
|
|
||||||
register(setter(setPromoCode));
|
|
||||||
register(setter(applyPromo));
|
|
||||||
register(setter(clearPromo));
|
|
||||||
register(setter(setFollowersCount));
|
|
||||||
|
|
||||||
register(transformer(findJob));
|
|
||||||
register(handleForm);
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,2 +1 @@
|
|||||||
export { default as JobActions } from './Actions';
|
export { default as JobActions } from './Actions';
|
||||||
export { default as JobsStore } from './Store';
|
|
||||||
|
13
common/utils/index.js
Normal file
13
common/utils/index.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export function nameSpacedTransformer(ns, transformer) {
|
||||||
|
if (!transformer) {
|
||||||
|
return nameSpacedTransformer.bind(null, ns);
|
||||||
|
}
|
||||||
|
return (state) => {
|
||||||
|
const newState = transformer(state[ns]);
|
||||||
|
// nothing has changed
|
||||||
|
if (newState === state[ns]) {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
return { ...state, [ns]: newState };
|
||||||
|
};
|
||||||
|
}
|
Reference in New Issue
Block a user