diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index baea64d3d..c01182d7b 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -61,6 +61,7 @@ const BrewRenderer = (props)=>{ lang : '', errors : [], currentEditorPage : 0, + themeBundle : {}, ...props }; @@ -69,7 +70,6 @@ const BrewRenderer = (props)=>{ height : PAGE_HEIGHT, isMounted : false, visibility : 'hidden', - themeBundle : {} }); const mainRef = useRef(null); @@ -131,7 +131,7 @@ const BrewRenderer = (props)=>{ const renderStyle = ()=>{ const cleanStyle = props.style; //DOMPurify.sanitize(props.style, purifyConfig); - return
${cleanStyle} ` }} />; + return
${cleanStyle} ` }} />; }; const renderPage = (pageText, index)=>{ @@ -173,19 +173,7 @@ const BrewRenderer = (props)=>{ } }; - // Loads the theme bundle and parses it out. Called when the iFrame is first mounted, and when a new theme is selected - const loadAllBrewStylesAndSnippets = ()=>{ - fetch(`${window.location.protocol}//${window.location.host}/theme/${props.renderer}/${props.theme}`).then((response)=>response.json()).then((themeBundle)=>{ - themeBundle.joinedStyles = themeBundle.styles.map(style => ``).join('\n\n'); //DOMPurify.sanitize(joinedStyles, purifyConfig); - setState((prevState)=>({ - ...prevState, - themeBundle : themeBundle - })); - }); - }; - const frameDidMount = ()=>{ //This triggers when iFrame finishes internal "componentDidMount" - loadAllBrewStylesAndSnippets(); // Load the brew's inherited and local styles. setTimeout(()=>{ //We still see a flicker where the style isn't applied yet, so wait 100ms before showing iFrame updateSize(); window.addEventListener('resize', updateSize); diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.jsx b/client/homebrew/editor/metadataEditor/metadataEditor.jsx index 5d6972e49..2ccf5c440 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.jsx +++ b/client/homebrew/editor/metadataEditor/metadataEditor.jsx @@ -111,7 +111,7 @@ const MetadataEditor = createClass({ handleTheme : function(theme){ this.props.metadata.renderer = theme.renderer; this.props.metadata.theme = theme.path; - this.props.onChange(this.props.metadata); + this.props.onChange(this.props.metadata, "theme"); }, handleLanguage : function(languageCode){ diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a67129ca3..1c6fe1620 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -55,7 +55,8 @@ const EditPage = createClass({ autoSaveWarning : false, unsavedTime : new Date(), currentEditorPage : 0, - displayLockMessage : this.props.brew.lock || false + displayLockMessage : this.props.brew.lock || false, + themeBundle : {} }; }, @@ -87,6 +88,8 @@ const EditPage = createClass({ htmlErrors : Markdown.validate(prevState.brew.text) })); + this.fetchThemeBundle(this.props.brew.renderer, this.props.brew.theme); + document.addEventListener('keydown', this.handleControlKeys); }, componentWillUnmount : function() { @@ -130,7 +133,10 @@ const EditPage = createClass({ }), ()=>{if(this.state.autoSave) this.trySave();}); }, - 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, @@ -138,13 +144,24 @@ const EditPage = createClass({ }, isPending : true, }), ()=>{if(this.state.autoSave) this.trySave();}); - }, hasChanges : function(){ return !_.isEqual(this.state.brew, this.savedBrew); }, + // 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 + })); + }); + + }, + trySave : function(immediate=false){ if(!this.debounceSave) this.debounceSave = _.debounce(this.save, SAVE_TIMEOUT); if(this.hasChanges()){ @@ -413,6 +430,7 @@ const EditPage = 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}