diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index cd6de102d..1df417872 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -69,7 +69,7 @@ const Homebrew = createClass({ } /> } /> } /> - } /> + } /> } /> } /> } /> diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index f8040d5c3..e3e7990df 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -159,7 +159,6 @@ const EditPage = createClass({ themeBundle : themeBundle })); }); - }, trySave : function(immediate=false){ @@ -434,7 +433,6 @@ const EditPage = createClass({ themeBundle={this.state.themeBundle} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 878896a06..4b223faa7 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -44,7 +44,8 @@ const NewPage = createClass({ saveGoogle : (global.account && global.account.googleId ? true : false), error : null, htmlErrors : Markdown.validate(brew.text), - currentEditorPage : 0 + currentEditorPage : 0, + themeBundle : {} }; }, @@ -77,6 +78,8 @@ const NewPage = createClass({ saveGoogle : (saveStorage == 'GOOGLE-DRIVE' && this.state.saveGoogle) }); + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + localStorage.setItem(BREWKEY, brew.text); if(brew.style) localStorage.setItem(STYLEKEY, brew.style); @@ -86,6 +89,17 @@ const NewPage = createClass({ document.removeEventListener('keydown', this.handleControlKeys); }, + // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected + fetchThemeBundle : function(renderer, theme) { + fetch(`${window.location.protocol}//${window.location.host}/theme/${renderer}/${theme}`).then((response)=>response.json()).then((themeBundle)=>{ + themeBundle.joinedStyles = themeBundle.styles.map((style)=>``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); + this.setState((prevState)=>({ // MOVE TO MOUNT STEP OF SHARE / NEW / EDIT + ...prevState, + themeBundle : themeBundle + })); + }); + }, + handleControlKeys : function(e){ if(!(e.ctrlKey || e.metaKey)) return; const S_KEY = 83; @@ -122,7 +136,10 @@ const NewPage = createClass({ localStorage.setItem(STYLEKEY, style); }, - handleMetaChange : function(metadata){ + handleMetaChange : function(metadata, field=undefined){ + if(field == 'theme') // Fetch theme bundle only if theme was changed + this.fetchThemeBundle(metadata.renderer, metadata.theme); + this.setState((prevState)=>({ brew : { ...prevState.brew, ...metadata }, }), ()=>{ @@ -157,7 +174,7 @@ const NewPage = createClass({ .catch((err)=>{ this.setState({ isSaving: false, error: err }); }); - if(!res) return; + if(!res) return; brew = res.body; localStorage.removeItem(BREWKEY); @@ -217,9 +234,9 @@ const NewPage = createClass({ style={this.state.brew.style} renderer={this.state.brew.renderer} theme={this.state.brew.theme} + themeBundle={this.state.themeBundle} errors={this.state.htmlErrors} lang={this.state.brew.lang} - userThemes={this.props.userThemes} currentEditorPage={this.state.currentEditorPage} allowPrint={true} /> diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 90dc1959a..c1f044d2d 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -19,13 +19,12 @@ const SharePage = createClass({ getDefaultProps : function() { return { brew : DEFAULT_BREW_LOAD, - themeBundle : {} }; }, getInitialState : function() { return { - themeBundle : this.props.themeBundle + themeBundle : {} }; }, diff --git a/server/app.js b/server/app.js index 62976ade6..5d3e74925 100644 --- a/server/app.js +++ b/server/app.js @@ -286,7 +286,7 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), asyncHandler(async(req, res, return next(); })); -//New Page +//New Page from ID app.get('/new/:id', asyncHandler(getBrew('share')), asyncHandler(async(req, res, next)=>{ sanitizeBrew(req.brew, 'share'); splitTextStyleAndMetadata(req.brew); @@ -311,6 +311,18 @@ app.get('/new/:id', asyncHandler(getBrew('share')), asyncHandler(async(req, res, return next(); })); +//New Page +app.get('/new', asyncHandler(async(req, res, next)=>{ + req.userThemes = await(getUsersBrewThemes(req.account?.username)); + + req.ogMeta = { ...defaultMetaTags, + title : 'New', + description : 'Start crafting your homebrew on the Homebrewery!' + }; + + return next(); +})); + //Share Page app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res, next)=>{ const { brew } = req;