From 32ef36d7f7fbab8be6982e90e5ac04d09bdc9fb0 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 15 Feb 2021 18:51:02 +1300 Subject: [PATCH] Initial commit: `Import from Share ID` appears to be functioning correctly. --- client/homebrew/homebrew.jsx | 2 + .../homebrew/pages/importPage/importPage.jsx | 207 ++++++++++++++++++ .../homebrew/pages/importPage/importPage.less | 10 + server.js | 28 +++ 4 files changed, 247 insertions(+) create mode 100644 client/homebrew/pages/importPage/importPage.jsx create mode 100644 client/homebrew/pages/importPage/importPage.less diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 640a73f77..d8707c72d 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -9,6 +9,7 @@ const EditPage = require('./pages/editPage/editPage.jsx'); const UserPage = require('./pages/userPage/userPage.jsx'); const SharePage = require('./pages/sharePage/sharePage.jsx'); const NewPage = require('./pages/newPage/newPage.jsx'); +const ImportPage = require('./pages/importPage/importPage.jsx'); //const ErrorPage = require('./pages/errorPage/errorPage.jsx'); const PrintPage = require('./pages/printPage/printPage.jsx'); @@ -44,6 +45,7 @@ const Homebrew = createClass({ }/> }/> + }/> }/> } /> } /> diff --git a/client/homebrew/pages/importPage/importPage.jsx b/client/homebrew/pages/importPage/importPage.jsx new file mode 100644 index 000000000..56a116949 --- /dev/null +++ b/client/homebrew/pages/importPage/importPage.jsx @@ -0,0 +1,207 @@ +require('./importPage.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 ImportPage = 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 { + metadata : { + gDrive : false, + title : '', + description : '', + tags : '', + published : false, + authors : [], + systems : [] + }, + + text : this.props.brew.text, + isSaving : false, + saveGoogle : (global.account && global.account.googleId ? true : false), + errors : [] + }; + }, + + componentDidMount : function() { + const storage = localStorage.getItem(KEY); + if(storage){ + this.setState({ + 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({ + metadata : _.merge({}, this.state.metadata, metadata) + }); + }, + + handleTextChange : function(text){ + this.setState({ + 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(_.merge({}, this.state.metadata, { text: this.state.text })) + .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(_.merge({}, this.state.metadata, { + text : this.state.text + })) + .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 + save... + ; + } else { + return + save + ; + } + }, + + print : function(){ + localStorage.setItem('print', this.state.text); + window.open('/print?dialog=true&local=print', '_blank'); + }, + + renderLocalPrintButton : function(){ + return + get PDF + ; + }, + + renderNavbar : function(){ + return + + + {this.state.metadata.title} + + + + {this.renderSaveButton()} + {this.renderLocalPrintButton()} + + + + + ; + }, + + render : function(){ + return
+ {this.renderNavbar()} +
+ + + + +
+
; + } +}); + +module.exports = ImportPage; diff --git a/client/homebrew/pages/importPage/importPage.less b/client/homebrew/pages/importPage/importPage.less new file mode 100644 index 000000000..041508a61 --- /dev/null +++ b/client/homebrew/pages/importPage/importPage.less @@ -0,0 +1,10 @@ +.importPage{ + + .saveButton{ + background-color: @orange; + &:hover{ + background-color: @green; + } + } + +} \ No newline at end of file diff --git a/server.js b/server.js index c33a755aa..76fec7629 100644 --- a/server.js +++ b/server.js @@ -143,6 +143,34 @@ app.get('/edit/:id', (req, res, next)=>{ } }); +//Import Page +app.get('/import/:id', (req, res, next)=>{ + res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save. + if(req.params.id.length > 12) { + const googleId = req.params.id.slice(0, -12); + const shareId = req.params.id.slice(-12); + GoogleActions.readFileMetadata(config.get('google_api_key'), googleId, shareId, 'share') + .then((brew)=>{ + req.brew = brew; //TODO Need to sanitize later + return next(); + }) + .catch((err)=>{ + console.log(err); + return res.status(400).send('Can\'t get brew from Google'); + }); + } else { + HomebrewModel.get({ shareId: req.params.id }) + .then((brew)=>{ + req.brew = brew; + return next(); + }) + .catch((err)=>{ + console.log(err); + return res.status(400).send(`Can't get that`); + }); + } +}); + //Share Page app.get('/share/:id', (req, res, next)=>{ if(req.params.id.length > 12) {