mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-02 12:52:38 +00:00
The NEW page saves to the browser LocalStorage the current text in case the user goes to a different page before saving. The new "import" function wasn't working since it was being overwritten by any cached values if they existed from an earlier "new" page.
204 lines
4.7 KiB
JavaScript
204 lines
4.7 KiB
JavaScript
require('./newPage.less');
|
|
const React = require('react');
|
|
const createClass = require('create-react-class');
|
|
const _ = require('lodash');
|
|
const request = require('superagent');
|
|
|
|
const Markdown = require('naturalcrit/markdown.js');
|
|
|
|
const Nav = require('naturalcrit/nav/nav.jsx');
|
|
const Navbar = require('../../navbar/navbar.jsx');
|
|
const AccountNavItem = require('../../navbar/account.navitem.jsx');
|
|
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
|
const IssueNavItem = require('../../navbar/issue.navitem.jsx');
|
|
|
|
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
|
|
const Editor = require('../../editor/editor.jsx');
|
|
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
|
|
|
|
|
|
const KEY = 'homebrewery-new';
|
|
|
|
const NewPage = createClass({
|
|
getDefaultProps : function() {
|
|
return {
|
|
brew : {
|
|
text : '',
|
|
shareId : null,
|
|
editId : null,
|
|
createdAt : null,
|
|
updatedAt : null,
|
|
gDrive : false,
|
|
|
|
title : '',
|
|
description : '',
|
|
tags : '',
|
|
published : false,
|
|
authors : [],
|
|
systems : []
|
|
}
|
|
};
|
|
},
|
|
|
|
getInitialState : function() {
|
|
return {
|
|
brew : {
|
|
text : this.props.brew.text,
|
|
gDrive : false,
|
|
title : '',
|
|
description : '',
|
|
tags : '',
|
|
published : false,
|
|
authors : [],
|
|
systems : []
|
|
},
|
|
|
|
isSaving : false,
|
|
saveGoogle : (global.account && global.account.googleId ? true : false),
|
|
errors : []
|
|
};
|
|
},
|
|
|
|
componentDidMount : function() {
|
|
const storage = localStorage.getItem(KEY);
|
|
if(!this.props.brew.text && storage){
|
|
this.setState({
|
|
brew : { text: storage }
|
|
});
|
|
}
|
|
document.addEventListener('keydown', this.handleControlKeys);
|
|
},
|
|
componentWillUnmount : function() {
|
|
document.removeEventListener('keydown', this.handleControlKeys);
|
|
},
|
|
|
|
handleControlKeys : function(e){
|
|
if(!(e.ctrlKey || e.metaKey)) return;
|
|
const S_KEY = 83;
|
|
const P_KEY = 80;
|
|
if(e.keyCode == S_KEY) this.save();
|
|
if(e.keyCode == P_KEY) this.print();
|
|
if(e.keyCode == P_KEY || e.keyCode == S_KEY){
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}
|
|
},
|
|
|
|
handleSplitMove : function(){
|
|
this.refs.editor.update();
|
|
},
|
|
|
|
handleMetadataChange : function(metadata){
|
|
this.setState({
|
|
brew : _.merge({}, this.state.brew, metadata)
|
|
});
|
|
},
|
|
|
|
handleTextChange : function(text){
|
|
this.setState({
|
|
brew : { text: text },
|
|
errors : Markdown.validate(text)
|
|
});
|
|
localStorage.setItem(KEY, text);
|
|
},
|
|
|
|
save : async function(){
|
|
this.setState({
|
|
isSaving : true
|
|
});
|
|
|
|
console.log('saving new brew');
|
|
|
|
if(this.state.saveGoogle) {
|
|
const res = await request
|
|
.post('/api/newGoogle/')
|
|
.send(this.state.brew)
|
|
.catch((err)=>{
|
|
console.log(err.status === 401
|
|
? 'Not signed in!'
|
|
: 'Error Creating New Google Brew!');
|
|
this.setState({ isSaving: false });
|
|
return;
|
|
});
|
|
|
|
const brew = res.body;
|
|
localStorage.removeItem(KEY);
|
|
window.location = `/edit/${brew.googleId}${brew.editId}`;
|
|
} else {
|
|
request.post('/api')
|
|
.send(this.state.brew)
|
|
.end((err, res)=>{
|
|
if(err){
|
|
this.setState({
|
|
isSaving : false
|
|
});
|
|
return;
|
|
}
|
|
window.onbeforeunload = function(){};
|
|
const brew = res.body;
|
|
localStorage.removeItem(KEY);
|
|
window.location = `/edit/${brew.editId}`;
|
|
});
|
|
}
|
|
},
|
|
|
|
renderSaveButton : function(){
|
|
if(this.state.isSaving){
|
|
return <Nav.item icon='fas fa-spinner fa-spin' className='saveButton'>
|
|
save...
|
|
</Nav.item>;
|
|
} else {
|
|
return <Nav.item icon='fas fa-save' className='saveButton' onClick={this.save}>
|
|
save
|
|
</Nav.item>;
|
|
}
|
|
},
|
|
|
|
print : function(){
|
|
localStorage.setItem('print', this.state.brew.text);
|
|
window.open('/print?dialog=true&local=print', '_blank');
|
|
},
|
|
|
|
renderLocalPrintButton : function(){
|
|
return <Nav.item color='purple' icon='far fa-file-pdf' onClick={this.print}>
|
|
get PDF
|
|
</Nav.item>;
|
|
},
|
|
|
|
renderNavbar : function(){
|
|
return <Navbar>
|
|
|
|
<Nav.section>
|
|
<Nav.item className='brewTitle'>{this.state.brew.title}</Nav.item>
|
|
</Nav.section>
|
|
|
|
<Nav.section>
|
|
{this.renderSaveButton()}
|
|
{this.renderLocalPrintButton()}
|
|
<IssueNavItem />
|
|
<RecentNavItem />
|
|
<AccountNavItem />
|
|
</Nav.section>
|
|
</Navbar>;
|
|
},
|
|
|
|
render : function(){
|
|
return <div className='newPage page'>
|
|
{this.renderNavbar()}
|
|
<div className='content'>
|
|
<SplitPane onDragFinish={this.handleSplitMove} ref='pane'>
|
|
<Editor
|
|
ref='editor'
|
|
brew={this.state.brew}
|
|
onChange={this.handleTextChange}
|
|
onMetadataChange={this.handleMetadataChange}
|
|
/>
|
|
<BrewRenderer text={this.state.brew.text} errors={this.state.errors} />
|
|
</SplitPane>
|
|
</div>
|
|
</div>;
|
|
}
|
|
});
|
|
|
|
module.exports = NewPage;
|