mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-13 13:02:45 +00:00
76 lines
2.2 KiB
JavaScript
76 lines
2.2 KiB
JavaScript
const flux = require('pico-flux')
|
|
const React = require('react');
|
|
const _ = require('lodash');
|
|
const cx = require('classnames');
|
|
|
|
const Nav = require('naturalcrit/nav/nav.jsx');
|
|
|
|
const Store = require('homebrewery/brew.store.js');
|
|
const Actions = require('homebrewery/brew.actions.js');
|
|
|
|
const onStoreChange = () => {
|
|
return {
|
|
status : Store.getStatus(),
|
|
errors : Store.getErrors()
|
|
}
|
|
};
|
|
|
|
const ContinousSave = React.createClass({
|
|
getDefaultProps: function() {
|
|
return {
|
|
status : 'ready',
|
|
errors : undefined
|
|
};
|
|
},
|
|
componentDidMount: function() {
|
|
flux.actionEmitter.on('dispatch', this.actionHandler);
|
|
window.onbeforeunload = ()=>{
|
|
if(this.props.status !== 'ready') return 'You have unsaved changes!';
|
|
};
|
|
},
|
|
componentWillUnmount: function() {
|
|
flux.actionEmitter.removeListener('dispatch', this.actionHandler);
|
|
window.onbeforeunload = function(){};
|
|
},
|
|
actionHandler : function(actionType){
|
|
if(actionType == 'UPDATE_BREW_TEXT' || actionType == 'UPDATE_META'){
|
|
Actions.pendingSave();
|
|
}
|
|
},
|
|
handleClick : function(){
|
|
Actions.save();
|
|
},
|
|
renderError : function(){
|
|
let errMsg = '';
|
|
try{
|
|
errMsg += this.state.errors.toString() + '\n\n';
|
|
errMsg += '```\n' + JSON.stringify(this.state.errors.response.error, null, ' ') + '\n```';
|
|
}catch(e){}
|
|
|
|
return <Nav.item className='continousSave error' icon="fa-warning">
|
|
Oops!
|
|
<div className='errorContainer'>
|
|
Looks like there was a problem saving. <br />
|
|
Report the issue <a target='_blank' href={'https://github.com/stolksdorf/naturalcrit/issues/new?body='+ encodeURIComponent(errMsg)}>
|
|
here
|
|
</a>.
|
|
</div>
|
|
</Nav.item>
|
|
},
|
|
render : function(){
|
|
if(this.props.status == 'error') return this.renderError();
|
|
|
|
if(this.props.status == 'saving'){
|
|
return <Nav.item className='continousSave' icon="fa-spinner fa-spin">saving...</Nav.item>
|
|
}
|
|
if(this.props.status == 'pending'){
|
|
return <Nav.item className='continousSave' onClick={this.handleClick} color='blue' icon='fa-save'>Save Now</Nav.item>
|
|
}
|
|
if(this.props.status == 'ready'){
|
|
return <Nav.item className='continousSave saved'>saved.</Nav.item>
|
|
}
|
|
},
|
|
|
|
});
|
|
|
|
module.exports = Store.createSmartComponent(ContinousSave, onStoreChange); |