mirror of
https://github.com/yldio/copilot.git
synced 2024-11-14 07:10:05 +02:00
move from ducks
This commit is contained in:
parent
7eb639297f
commit
cce5998bfc
3
spikes/stacks/redux-thunk/.eslintignore
Normal file
3
spikes/stacks/redux-thunk/.eslintignore
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/node_modules
|
||||||
|
coverage
|
||||||
|
.nyc_output
|
2
spikes/stacks/redux-thunk/.gitignore
vendored
2
spikes/stacks/redux-thunk/.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
/node_modules
|
/node_modules
|
||||||
coverage
|
coverage
|
||||||
.nyc_output
|
.nyc_output
|
||||||
|
npm-debug.log
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
"graphql-fetch": "^1.0.0",
|
"graphql-fetch": "^1.0.0",
|
||||||
"json-loader": "^0.5.4",
|
"json-loader": "^0.5.4",
|
||||||
"lodash.find": "^4.6.0",
|
"lodash.find": "^4.6.0",
|
||||||
|
"lodash.get": "^4.4.2",
|
||||||
"lodash.values": "^4.3.0",
|
"lodash.values": "^4.3.0",
|
||||||
"node-uuid": "^1.4.7",
|
"node-uuid": "^1.4.7",
|
||||||
"react": "^15.3.2",
|
"react": "^15.3.2",
|
||||||
@ -46,6 +47,7 @@
|
|||||||
"redux-logger": "^2.7.0",
|
"redux-logger": "^2.7.0",
|
||||||
"redux-promise-middleware": "^4.1.0",
|
"redux-promise-middleware": "^4.1.0",
|
||||||
"redux-thunk": "^2.1.0",
|
"redux-thunk": "^2.1.0",
|
||||||
|
"reselect": "^2.5.4",
|
||||||
"webpack": "^1.13.2",
|
"webpack": "^1.13.2",
|
||||||
"webpack-dev-server": "^1.16.1"
|
"webpack-dev-server": "^1.16.1"
|
||||||
},
|
},
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
...require('./reducers/app').actions,
|
|
||||||
...require('./reducers/printers').actions,
|
|
||||||
...require('./reducers/changes').actions
|
|
||||||
};
|
|
@ -7,15 +7,8 @@ const {
|
|||||||
|
|
||||||
module.exports = ({
|
module.exports = ({
|
||||||
changes = [],
|
changes = [],
|
||||||
pathname,
|
pathname
|
||||||
onClick
|
|
||||||
}) => {
|
}) => {
|
||||||
const _onClick = (id) => {
|
|
||||||
return () => {
|
|
||||||
onClick(id);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const lis = changes.map(({
|
const lis = changes.map(({
|
||||||
price,
|
price,
|
||||||
currency,
|
currency,
|
||||||
|
@ -30,7 +30,6 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
const {
|
const {
|
||||||
fetch,
|
|
||||||
loading,
|
loading,
|
||||||
loaded,
|
loaded,
|
||||||
render,
|
render,
|
||||||
@ -38,7 +37,7 @@ module.exports = React.createClass({
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const _loaded = !loading && !loaded;
|
const _loaded = !loading && !loaded;
|
||||||
const component = _loaded ? (children ? children : render()) : null;
|
const component = _loaded ? (children || render()) : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Loader
|
<Loader
|
||||||
|
@ -6,7 +6,7 @@ const NotFound = require('./not-found');
|
|||||||
const Home = require('./home');
|
const Home = require('./home');
|
||||||
const Print = require('./print');
|
const Print = require('./print');
|
||||||
|
|
||||||
const actions = require('../actions');
|
const actions = require('../state/actions');
|
||||||
|
|
||||||
const {
|
const {
|
||||||
connect
|
connect
|
||||||
@ -19,7 +19,7 @@ const {
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
updateRouter
|
updateRouter
|
||||||
} = actions
|
} = actions;
|
||||||
|
|
||||||
const App = connect()(React.createClass({
|
const App = connect()(React.createClass({
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
|
@ -8,7 +8,7 @@ const Printers = require('../components/printers');
|
|||||||
const Changes = require('../components/changes');
|
const Changes = require('../components/changes');
|
||||||
const Change = require('../components/change');
|
const Change = require('../components/change');
|
||||||
|
|
||||||
const actions = require('../actions');
|
const actions = require('../state/actions');
|
||||||
|
|
||||||
const {
|
const {
|
||||||
fetchChanges,
|
fetchChanges,
|
||||||
@ -18,10 +18,7 @@ const {
|
|||||||
} = actions;
|
} = actions;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
BrowserRouter,
|
Match
|
||||||
Miss,
|
|
||||||
Match,
|
|
||||||
Router
|
|
||||||
} = ReactRouter;
|
} = ReactRouter;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -136,4 +133,4 @@ const mapDispatchToProps = (dispatch) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = connect(mapStateToProps, mapDispatchToProps, )(Print);
|
module.exports = connect(mapStateToProps, mapDispatchToProps)(Print);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const worker = require('./worker'); // singleton
|
require('./worker'); // singleton
|
||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const ReactDOM = require('react-dom');
|
const ReactDOM = require('react-dom');
|
||||||
@ -16,4 +16,4 @@ render();
|
|||||||
|
|
||||||
if (module.hot) {
|
if (module.hot) {
|
||||||
module.hot.accept('./root', render);
|
module.hot.accept('./root', render);
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
const ReduxActions = require('redux-actions');
|
|
||||||
const app = require('../../../package.json').name;
|
|
||||||
|
|
||||||
const {
|
|
||||||
createAction,
|
|
||||||
handleActions
|
|
||||||
} = ReduxActions;
|
|
||||||
|
|
||||||
const UPDATE_ROUTER = `${app}/changes/UPDATE_ROUTER`;
|
|
||||||
|
|
||||||
exports.ui = handleActions({
|
|
||||||
[UPDATE_ROUTER]: (state, action) => {
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
router: action.payload
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
const actions = exports.actions = {
|
|
||||||
updateRouter: (router) => {
|
|
||||||
return {
|
|
||||||
type: UPDATE_ROUTER,
|
|
||||||
payload: router
|
|
||||||
};
|
|
||||||
},
|
|
||||||
transitionTo: (pathname) => (dispatch, getState) => {
|
|
||||||
return getState().ui.app.router.transitionTo(pathname);
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,206 +0,0 @@
|
|||||||
const ReduxActions = require('redux-actions');
|
|
||||||
const app = require('../../../package.json').name;
|
|
||||||
const find = require('lodash.find');
|
|
||||||
const changes = require('./changes');
|
|
||||||
|
|
||||||
const {
|
|
||||||
createAction,
|
|
||||||
handleActions
|
|
||||||
} = ReduxActions;
|
|
||||||
|
|
||||||
const {
|
|
||||||
actions: {
|
|
||||||
removeChange
|
|
||||||
}
|
|
||||||
} = changes;
|
|
||||||
|
|
||||||
const UPDATE_PRINTERS = `${app}/printers/UPDATE_PRINTERS`;
|
|
||||||
const UPDATE_WORKER_ID = `${app}/printers/UPDATE_WORKER_ID`;
|
|
||||||
const LOCK_PRINTER = `${app}/printers/LOCK_PRINTER`;
|
|
||||||
const PRINT = `${app}/printers/PRINT`;
|
|
||||||
|
|
||||||
exports.data = handleActions({
|
|
||||||
[UPDATE_PRINTERS]: (state, action) => {
|
|
||||||
return action.payload;
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
exports.ui = handleActions({
|
|
||||||
[UPDATE_WORKER_ID]: (state, action) => {
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
id: action.payload
|
|
||||||
};
|
|
||||||
},
|
|
||||||
[UPDATE_PRINTERS]: (state, action) => {
|
|
||||||
const locked = (find(action.payload, (printer) => {
|
|
||||||
return (
|
|
||||||
printer.lock &&
|
|
||||||
printer.lock === state.id
|
|
||||||
);
|
|
||||||
}) || {}).id || '';
|
|
||||||
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
locked
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
id: '',
|
|
||||||
locked: ''
|
|
||||||
});
|
|
||||||
|
|
||||||
// confirm should be an async op,
|
|
||||||
// let's mock it that way
|
|
||||||
const confirm = (msg) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
resolve(window.confirm(msg));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// prompt should be an async op,
|
|
||||||
// let's mock it that way
|
|
||||||
const prompt = (msg) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
resolve(window.prompt(msg));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// alert should be an async op,
|
|
||||||
// let's mock it that way
|
|
||||||
const alert = (msg) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
resolve(window.alert(msg));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const actions = exports.actions = {
|
|
||||||
updatePrinters: createAction(UPDATE_PRINTERS),
|
|
||||||
updateWorkerId: createAction(UPDATE_WORKER_ID),
|
|
||||||
lockPrinter: (id) => (dispatch, getState) => {
|
|
||||||
const {
|
|
||||||
ui,
|
|
||||||
data
|
|
||||||
} = getState();
|
|
||||||
|
|
||||||
const {
|
|
||||||
printers
|
|
||||||
} = data;
|
|
||||||
|
|
||||||
const {
|
|
||||||
printers: {
|
|
||||||
locked
|
|
||||||
}
|
|
||||||
} = ui;
|
|
||||||
|
|
||||||
if (locked === id) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const printer = find(printers, ['id', id]);
|
|
||||||
|
|
||||||
if (!printer) {
|
|
||||||
return window.alert(`Printer ${id} not found`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const worker = require('../worker');
|
|
||||||
|
|
||||||
const lock = () => {
|
|
||||||
return dispatch({
|
|
||||||
type: LOCK_PRINTER,
|
|
||||||
payload: worker.dispatch({
|
|
||||||
type: 'LOCK_PRINTER',
|
|
||||||
payload: id
|
|
||||||
})
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const askToLock = () => {
|
|
||||||
const msg = `Do you want to lock printer ${id}?`;
|
|
||||||
return confirm(msg).then((yes) => {
|
|
||||||
return yes ? lock(id) : null;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const askToOverride = () => {
|
|
||||||
const msg = `Printer ${id} already locked! Do you want to override?`;
|
|
||||||
return confirm(msg).then((yes) => {
|
|
||||||
return yes ? lock(id) : null;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return printer.lock ? askToOverride() : askToLock();
|
|
||||||
},
|
|
||||||
print: (changeId) => (dispatch, getState) => {
|
|
||||||
const {
|
|
||||||
ui,
|
|
||||||
data
|
|
||||||
} = getState();
|
|
||||||
|
|
||||||
const {
|
|
||||||
printers
|
|
||||||
} = data;
|
|
||||||
|
|
||||||
const {
|
|
||||||
printers: {
|
|
||||||
locked
|
|
||||||
}
|
|
||||||
} = ui;
|
|
||||||
|
|
||||||
const worker = require('../worker');
|
|
||||||
|
|
||||||
const print = () => {
|
|
||||||
return dispatch({
|
|
||||||
type: PRINT,
|
|
||||||
payload: worker.dispatch({
|
|
||||||
type: 'PRINT',
|
|
||||||
payload: changeId
|
|
||||||
})
|
|
||||||
}).then(() => {
|
|
||||||
return dispatch(removeChange(changeId));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const lock = (printerId) => {
|
|
||||||
return dispatch({
|
|
||||||
type: LOCK_PRINTER,
|
|
||||||
payload: worker.dispatch({
|
|
||||||
type: 'LOCK_PRINTER',
|
|
||||||
payload: printerId
|
|
||||||
})
|
|
||||||
}).then(print);
|
|
||||||
};
|
|
||||||
|
|
||||||
const askToOverride = (printerId) => {
|
|
||||||
const msg = `Printer ${printerId} already locked! Do you want to override?`;
|
|
||||||
return confirm(msg).then((yes) => {
|
|
||||||
return yes ? lock(printerId) : null;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const askToLock = () => {
|
|
||||||
const msg = `Please select a printer to lock: ${
|
|
||||||
printers.map(({
|
|
||||||
id,
|
|
||||||
name
|
|
||||||
}) => {
|
|
||||||
return `\n(${id}) ${name}`;
|
|
||||||
})
|
|
||||||
}`;
|
|
||||||
|
|
||||||
return prompt(msg).then((printerId) => {
|
|
||||||
const printer = find(printers, ['id', printerId]);
|
|
||||||
|
|
||||||
if (!printer) {
|
|
||||||
return alert(`Printer ${printerId} not found. Try again`).then(() => {
|
|
||||||
return actions.print(printerId)(dispatch, getState);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return printer.lock ? askToOverride(printerId) : lock(printerId);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return !locked ? askToLock() : print();
|
|
||||||
}
|
|
||||||
};
|
|
@ -5,15 +5,14 @@ const ReactRedux = require('react-redux');
|
|||||||
const ReactIntl = require('react-intl');
|
const ReactIntl = require('react-intl');
|
||||||
|
|
||||||
const App = require('./containers/app');
|
const App = require('./containers/app');
|
||||||
|
const store = require('./state/store');
|
||||||
const store = require('./store');
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
AppContainer
|
AppContainer
|
||||||
} = ReactHotLoader;
|
} = ReactHotLoader;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
BrowserRouter,
|
BrowserRouter
|
||||||
} = ReactRouter;
|
} = ReactRouter;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
25
spikes/stacks/redux-thunk/src/client/state/actions/app.js
Normal file
25
spikes/stacks/redux-thunk/src/client/state/actions/app.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const ReduxActions = require('redux-actions');
|
||||||
|
const app = require('../../../../package.json').name;
|
||||||
|
const selectors = require('../selectors');
|
||||||
|
|
||||||
|
const {
|
||||||
|
router
|
||||||
|
} = selectors;
|
||||||
|
|
||||||
|
const {
|
||||||
|
createAction
|
||||||
|
} = ReduxActions;
|
||||||
|
|
||||||
|
const UPDATE_ROUTER = `${app}/changes/UPDATE_ROUTER`;
|
||||||
|
|
||||||
|
const updateRouter = createAction(UPDATE_ROUTER);
|
||||||
|
|
||||||
|
const transitionTo = (pathname) => (dispatch, getState) => {
|
||||||
|
return router(getState()).transitionTo(pathname);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
UPDATE_ROUTER,
|
||||||
|
updateRouter,
|
||||||
|
transitionTo
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
const app = require('../../../../package.json').name;
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const FETCH_CHANGES = `${app}/changes/FETCH_CHANGES`;
|
||||||
|
const REMOVE_CHANGE = `${app}/changes/REMOVE_CHANGE`;
|
||||||
|
|
||||||
|
const fetchChanges = () => {
|
||||||
|
return {
|
||||||
|
type: FETCH_CHANGES,
|
||||||
|
payload: api.fetchChanges()
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const removeChange = (id) => (dispatch) => {
|
||||||
|
return dispatch({
|
||||||
|
type: REMOVE_CHANGE,
|
||||||
|
payload: api.removeChange(id)
|
||||||
|
}).then(() => {
|
||||||
|
return dispatch(fetchChanges());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
FETCH_CHANGES,
|
||||||
|
REMOVE_CHANGE,
|
||||||
|
fetchChanges,
|
||||||
|
removeChange
|
||||||
|
};
|
@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
...require('./app'),
|
||||||
|
...require('./printers'),
|
||||||
|
...require('./changes')
|
||||||
|
};
|
183
spikes/stacks/redux-thunk/src/client/state/actions/printers.js
Normal file
183
spikes/stacks/redux-thunk/src/client/state/actions/printers.js
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
const ReduxActions = require('redux-actions');
|
||||||
|
const app = require('../../../../package.json').name;
|
||||||
|
const find = require('lodash.find');
|
||||||
|
const changes = require('./changes');
|
||||||
|
|
||||||
|
const {
|
||||||
|
createAction
|
||||||
|
} = ReduxActions;
|
||||||
|
|
||||||
|
const {
|
||||||
|
removeChange
|
||||||
|
} = changes;
|
||||||
|
|
||||||
|
const UPDATE_PRINTERS = `${app}/printers/UPDATE_PRINTERS`;
|
||||||
|
const UPDATE_WORKER_ID = `${app}/printers/UPDATE_WORKER_ID`;
|
||||||
|
const LOCK_PRINTER = `${app}/printers/LOCK_PRINTER`;
|
||||||
|
const PRINT = `${app}/printers/PRINT`;
|
||||||
|
|
||||||
|
// confirm should be an async op,
|
||||||
|
// let's mock it that way
|
||||||
|
const confirm = (msg) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve(window.confirm(msg));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// prompt should be an async op,
|
||||||
|
// let's mock it that way
|
||||||
|
const prompt = (msg) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve(window.prompt(msg));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// alert should be an async op,
|
||||||
|
// let's mock it that way
|
||||||
|
const alert = (msg) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve(window.alert(msg));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const updatePrinters = createAction(UPDATE_PRINTERS);
|
||||||
|
const updateWorkerId = createAction(UPDATE_WORKER_ID);
|
||||||
|
|
||||||
|
const lockPrinter = (id) => (dispatch, getState) => {
|
||||||
|
const {
|
||||||
|
ui,
|
||||||
|
data
|
||||||
|
} = getState();
|
||||||
|
|
||||||
|
const {
|
||||||
|
printers
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
const {
|
||||||
|
printers: {
|
||||||
|
locked
|
||||||
|
}
|
||||||
|
} = ui;
|
||||||
|
|
||||||
|
if (locked === id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const printer = find(printers, ['id', id]);
|
||||||
|
|
||||||
|
if (!printer) {
|
||||||
|
return window.alert(`Printer ${id} not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const worker = require('../../worker');
|
||||||
|
|
||||||
|
const lock = () => {
|
||||||
|
return dispatch({
|
||||||
|
type: LOCK_PRINTER,
|
||||||
|
payload: worker.dispatch({
|
||||||
|
type: 'LOCK_PRINTER',
|
||||||
|
payload: id
|
||||||
|
})
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const askToLock = () => {
|
||||||
|
const msg = `Do you want to lock printer ${id}?`;
|
||||||
|
return confirm(msg).then((yes) => {
|
||||||
|
return yes ? lock(id) : null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const askToOverride = () => {
|
||||||
|
const msg = `Printer ${id} already locked! Do you want to override?`;
|
||||||
|
return confirm(msg).then((yes) => {
|
||||||
|
return yes ? lock(id) : null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return printer.lock ? askToOverride() : askToLock();
|
||||||
|
};
|
||||||
|
|
||||||
|
const print = (changeId) => (dispatch, getState) => {
|
||||||
|
const {
|
||||||
|
ui,
|
||||||
|
data
|
||||||
|
} = getState();
|
||||||
|
|
||||||
|
const {
|
||||||
|
printers
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
const {
|
||||||
|
printers: {
|
||||||
|
locked
|
||||||
|
}
|
||||||
|
} = ui;
|
||||||
|
|
||||||
|
const worker = require('../../worker');
|
||||||
|
|
||||||
|
const _print = () => {
|
||||||
|
return dispatch({
|
||||||
|
type: PRINT,
|
||||||
|
payload: worker.dispatch({
|
||||||
|
type: 'PRINT',
|
||||||
|
payload: changeId
|
||||||
|
})
|
||||||
|
}).then(() => {
|
||||||
|
return dispatch(removeChange(changeId));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const lock = (printerId) => {
|
||||||
|
return dispatch({
|
||||||
|
type: LOCK_PRINTER,
|
||||||
|
payload: worker.dispatch({
|
||||||
|
type: 'LOCK_PRINTER',
|
||||||
|
payload: printerId
|
||||||
|
})
|
||||||
|
}).then(_print);
|
||||||
|
};
|
||||||
|
|
||||||
|
const askToOverride = (printerId) => {
|
||||||
|
const msg = `Printer ${printerId} already locked! Do you want to override?`;
|
||||||
|
return confirm(msg).then((yes) => {
|
||||||
|
return yes ? lock(printerId) : null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const askToLock = () => {
|
||||||
|
const msg = `Please select a printer to lock: ${
|
||||||
|
printers.map(({
|
||||||
|
id,
|
||||||
|
name
|
||||||
|
}) => {
|
||||||
|
return `\n(${id}) ${name}`;
|
||||||
|
})
|
||||||
|
}`;
|
||||||
|
|
||||||
|
return prompt(msg).then((printerId) => {
|
||||||
|
const printer = find(printers, ['id', printerId]);
|
||||||
|
|
||||||
|
if (!printer) {
|
||||||
|
return alert(`Printer ${printerId} not found. Try again`).then(() => {
|
||||||
|
return print(printerId)(dispatch, getState);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return printer.lock ? askToOverride(printerId) : lock(printerId);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return !locked ? askToLock() : _print();
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
UPDATE_PRINTERS,
|
||||||
|
UPDATE_WORKER_ID,
|
||||||
|
LOCK_PRINTER,
|
||||||
|
PRINT,
|
||||||
|
updatePrinters,
|
||||||
|
updateWorkerId,
|
||||||
|
lockPrinter,
|
||||||
|
print
|
||||||
|
};
|
19
spikes/stacks/redux-thunk/src/client/state/reducers/app.js
Normal file
19
spikes/stacks/redux-thunk/src/client/state/reducers/app.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const ReduxActions = require('redux-actions');
|
||||||
|
const actions = require('../actions');
|
||||||
|
|
||||||
|
const {
|
||||||
|
handleActions
|
||||||
|
} = ReduxActions;
|
||||||
|
|
||||||
|
const {
|
||||||
|
UPDATE_ROUTER
|
||||||
|
} = actions;
|
||||||
|
|
||||||
|
exports.ui = handleActions({
|
||||||
|
[UPDATE_ROUTER]: (state, action) => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
router: action.payload
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, {});
|
@ -1,19 +1,13 @@
|
|||||||
const ReduxActions = require('redux-actions');
|
const ReduxActions = require('redux-actions');
|
||||||
const app = require('../../../package.json').name;
|
const actions = require('../actions');
|
||||||
const api = require('../api');
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
createAction,
|
|
||||||
handleActions
|
handleActions
|
||||||
} = ReduxActions;
|
} = ReduxActions;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
fetchChanges,
|
FETCH_CHANGES
|
||||||
removeChange
|
} = actions;
|
||||||
} = api;
|
|
||||||
|
|
||||||
const FETCH_CHANGES = `${app}/changes/FETCH_CHANGES`;
|
|
||||||
const REMOVE_CHANGE = `${app}/changes/REMOVE_CHANGE`;
|
|
||||||
|
|
||||||
exports.data = handleActions({
|
exports.data = handleActions({
|
||||||
[`${FETCH_CHANGES}_FULFILLED`]: (state, action) => {
|
[`${FETCH_CHANGES}_FULFILLED`]: (state, action) => {
|
||||||
@ -47,20 +41,3 @@ exports.ui = handleActions({
|
|||||||
loading: false,
|
loading: false,
|
||||||
loaded: false
|
loaded: false
|
||||||
});
|
});
|
||||||
|
|
||||||
const actions = exports.actions = {
|
|
||||||
fetchChanges: () => {
|
|
||||||
return {
|
|
||||||
type: FETCH_CHANGES,
|
|
||||||
payload: fetchChanges()
|
|
||||||
};
|
|
||||||
},
|
|
||||||
removeChange: (id) => (dispatch) => {
|
|
||||||
return dispatch({
|
|
||||||
type: REMOVE_CHANGE,
|
|
||||||
payload: removeChange(id)
|
|
||||||
}).then(() => {
|
|
||||||
return dispatch(actions.fetchChanges());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
@ -0,0 +1,43 @@
|
|||||||
|
const ReduxActions = require('redux-actions');
|
||||||
|
const find = require('lodash.find');
|
||||||
|
const actions = require('../actions');
|
||||||
|
|
||||||
|
const {
|
||||||
|
handleActions
|
||||||
|
} = ReduxActions;
|
||||||
|
|
||||||
|
const {
|
||||||
|
UPDATE_WORKER_ID,
|
||||||
|
UPDATE_PRINTERS
|
||||||
|
} = actions;
|
||||||
|
|
||||||
|
exports.data = handleActions({
|
||||||
|
[UPDATE_PRINTERS]: (state, action) => {
|
||||||
|
return action.payload;
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
exports.ui = handleActions({
|
||||||
|
[UPDATE_WORKER_ID]: (state, action) => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
id: action.payload
|
||||||
|
};
|
||||||
|
},
|
||||||
|
[UPDATE_PRINTERS]: (state, action) => {
|
||||||
|
const locked = (find(action.payload, (printer) => {
|
||||||
|
return (
|
||||||
|
printer.lock &&
|
||||||
|
printer.lock === state.id
|
||||||
|
);
|
||||||
|
}) || {}).id || '';
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
locked
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
id: '',
|
||||||
|
locked: ''
|
||||||
|
});
|
10
spikes/stacks/redux-thunk/src/client/state/selectors.js
Normal file
10
spikes/stacks/redux-thunk/src/client/state/selectors.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// const Reselect = require('reselect');
|
||||||
|
const get = require('lodash.get');
|
||||||
|
|
||||||
|
const router = (state) => {
|
||||||
|
return get(state, 'ui.app.router');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
router
|
||||||
|
};
|
@ -2,7 +2,7 @@ const createReducer = require('./reducers');
|
|||||||
const enableBatching = require('redux-batched-actions').enableBatching;
|
const enableBatching = require('redux-batched-actions').enableBatching;
|
||||||
const thunk = require('redux-thunk').default;
|
const thunk = require('redux-thunk').default;
|
||||||
const promiseMiddleware = require('redux-promise-middleware').default;
|
const promiseMiddleware = require('redux-promise-middleware').default;
|
||||||
const createLogger = require('redux-logger');
|
// const createLogger = require('redux-logger');
|
||||||
const redux = require('redux');
|
const redux = require('redux');
|
||||||
|
|
||||||
|
|
@ -2,7 +2,7 @@ const uuid = require('node-uuid');
|
|||||||
const Emitter = require('component-emitter');
|
const Emitter = require('component-emitter');
|
||||||
const crosstab = require('crosstab');
|
const crosstab = require('crosstab');
|
||||||
const values = require('lodash.values');
|
const values = require('lodash.values');
|
||||||
const actions = require('./actions');
|
const actions = require('./state/actions');
|
||||||
|
|
||||||
const emitter = module.exports = new Emitter();
|
const emitter = module.exports = new Emitter();
|
||||||
let isMaster = crosstab.util.tabs['MASTER_TAB'].id === crosstab.id;
|
let isMaster = crosstab.util.tabs['MASTER_TAB'].id === crosstab.id;
|
||||||
|
@ -47,7 +47,7 @@ const ChangeType = new GraphQLObjectType({
|
|||||||
product: {
|
product: {
|
||||||
type: ProductType,
|
type: ProductType,
|
||||||
resolve: (root, args) => {
|
resolve: (root, args) => {
|
||||||
return products[root.product]
|
return products[root.product];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
price: {
|
price: {
|
||||||
@ -70,7 +70,7 @@ const query = new GraphQLObjectType({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
resolve(root, args, ctx) {
|
resolve(root, args, ctx) {
|
||||||
return args.id ? [products[args.id]] : values(products)
|
return args.id ? [products[args.id]] : values(products);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
changes: {
|
changes: {
|
||||||
|
Loading…
Reference in New Issue
Block a user