mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-08 20:23:39 +00:00
Functional user theme loading though noising console
This commit is contained in:
@@ -14,7 +14,7 @@ const NotificationPopup = require('./notificationPopup/notificationPopup.jsx');
|
|||||||
const Frame = require('react-frame-component').default;
|
const Frame = require('react-frame-component').default;
|
||||||
const dedent = require('dedent-tabs').default;
|
const dedent = require('dedent-tabs').default;
|
||||||
|
|
||||||
const Themes = require('themes/themes.json');
|
const staticThemes = require('themes/themes.json');
|
||||||
|
|
||||||
const PAGE_HEIGHT = 1056;
|
const PAGE_HEIGHT = 1056;
|
||||||
|
|
||||||
@@ -182,18 +182,34 @@ const BrewRenderer = (props)=>{
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy';
|
let rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy';
|
||||||
const themePath = props.theme ?? '5ePHB';
|
let baseRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy';
|
||||||
const baseThemePath = Themes[rendererPath][themePath].baseTheme;
|
const blankRendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy';
|
||||||
|
if(props.theme[0] === '#') {
|
||||||
|
rendererPath = 'Brew';
|
||||||
|
}
|
||||||
|
let themePath = props.theme ?? '5ePHB';
|
||||||
|
console.log(`props.userThemes`);
|
||||||
|
console.log(props);
|
||||||
|
console.log(`props.userThemes`);
|
||||||
|
const Themes = { ...staticThemes, ...props.userThemes };
|
||||||
|
let baseThemePath = Themes[rendererPath][themePath]?.baseTheme;
|
||||||
|
|
||||||
// Override static theme values if a Brew theme.
|
// Override static theme values if a Brew theme.
|
||||||
|
|
||||||
if(themePath[0] == '#') {
|
if(themePath[0] == '#') {
|
||||||
themePath.slice(1);
|
themePath = themePath.slice(1);
|
||||||
rendererPath = '';
|
rendererPath = '';
|
||||||
} else {
|
} else {
|
||||||
rendererPath += '/';
|
rendererPath += '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(baseThemePath && baseThemePath[0] == '#') {
|
||||||
|
baseThemePath = baseThemePath.slice(1);
|
||||||
|
baseRendererPath = '';
|
||||||
|
} else {
|
||||||
|
baseRendererPath += '/';
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/*render dummy page while iFrame is mounting.*/}
|
{/*render dummy page while iFrame is mounting.*/}
|
||||||
@@ -220,9 +236,9 @@ const BrewRenderer = (props)=>{
|
|||||||
<RenderWarnings />
|
<RenderWarnings />
|
||||||
<NotificationPopup />
|
<NotificationPopup />
|
||||||
</div>
|
</div>
|
||||||
<link href={`/css/${rendererPath}Blank`} rel='stylesheet'/>
|
<link href={`/css/${blankRendererPath}/Blank`} rel='stylesheet'/>
|
||||||
{baseThemePath &&
|
{baseThemePath &&
|
||||||
<link href={`/css/${rendererPath}${baseThemePath}`} rel='stylesheet'/>
|
<link href={`/css/${baseRendererPath}${baseThemePath}`} rel='stylesheet'/>
|
||||||
}
|
}
|
||||||
<link href={`/css/${rendererPath}${themePath}`} rel='stylesheet'/>
|
<link href={`/css/${rendererPath}${themePath}`} rel='stylesheet'/>
|
||||||
|
|
||||||
|
|||||||
@@ -378,6 +378,7 @@ const Editor = createClass({
|
|||||||
showEditButtons={this.props.showEditButtons}
|
showEditButtons={this.props.showEditButtons}
|
||||||
renderer={this.props.renderer}
|
renderer={this.props.renderer}
|
||||||
theme={this.props.brew.theme}
|
theme={this.props.brew.theme}
|
||||||
|
userThemes={this.props.brew.userThemes}
|
||||||
undo={this.undo}
|
undo={this.undo}
|
||||||
redo={this.redo}
|
redo={this.redo}
|
||||||
foldCode={this.foldCode}
|
foldCode={this.foldCode}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ const MetadataEditor = createClass({
|
|||||||
authors : [],
|
authors : [],
|
||||||
systems : [],
|
systems : [],
|
||||||
renderer : 'legacy',
|
renderer : 'legacy',
|
||||||
|
themeClass : 'V3',
|
||||||
theme : '5ePHB',
|
theme : '5ePHB',
|
||||||
lang : 'en'
|
lang : 'en'
|
||||||
},
|
},
|
||||||
@@ -110,8 +111,9 @@ const MetadataEditor = createClass({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
handleTheme : function(theme){
|
handleTheme : function(theme, themeClass){
|
||||||
this.props.metadata.renderer = theme.renderer;
|
this.props.metadata.renderer = theme.renderer;
|
||||||
|
this.props.metadata.themeClass = themeClass;
|
||||||
this.props.metadata.theme = theme.path;
|
this.props.metadata.theme = theme.path;
|
||||||
this.props.onChange(this.props.metadata);
|
this.props.onChange(this.props.metadata);
|
||||||
},
|
},
|
||||||
@@ -199,7 +201,7 @@ const MetadataEditor = createClass({
|
|||||||
const listThemes = (renderer)=>{
|
const listThemes = (renderer)=>{
|
||||||
return _.map(_.values(mergedThemes[renderer]), (theme)=>{
|
return _.map(_.values(mergedThemes[renderer]), (theme)=>{
|
||||||
const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`;
|
const preview = theme?.thumbnail ? theme.thumbnail : `/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`;
|
||||||
return <div className='item' key={`${renderer}_${theme.name}`} onClick={()=>this.handleTheme(theme)} title={''}>
|
return <div className='item' key={`${renderer}_${theme.name}`} onClick={()=>this.handleTheme(theme, renderer)} title={''}>
|
||||||
{`${renderer} : ${theme.name}`}
|
{`${renderer} : ${theme.name}`}
|
||||||
<img src={`/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`}/>
|
<img src={`/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`}/>
|
||||||
<div className='preview'>
|
<div className='preview'>
|
||||||
@@ -210,7 +212,7 @@ const MetadataEditor = createClass({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme];
|
const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)}`][this.props.metadata.theme];
|
||||||
let dropdown;
|
let dropdown;
|
||||||
|
|
||||||
if(this.props.metadata.renderer == 'legacy') {
|
if(this.props.metadata.renderer == 'legacy') {
|
||||||
@@ -224,7 +226,7 @@ const MetadataEditor = createClass({
|
|||||||
dropdown =
|
dropdown =
|
||||||
<Nav.dropdown className='value' trigger='click'>
|
<Nav.dropdown className='value' trigger='click'>
|
||||||
<div>
|
<div>
|
||||||
{`${_.upperFirst(currentTheme.renderer)} : ${currentTheme.name}`} <i className='fas fa-caret-down'></i>
|
{`${_.upperFirst(this.props.metadata.themeClass?this.props.metadata.themeClass:this.props.metadata.renderer)} : ${currentTheme.name}`} <i className='fas fa-caret-down'></i>
|
||||||
</div>
|
</div>
|
||||||
{/*listThemes('Legacy')*/}
|
{/*listThemes('Legacy')*/}
|
||||||
{listThemes('V3')}
|
{listThemes('V3')}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ const Snippetbar = createClass({
|
|||||||
|
|
||||||
compileSnippets : function(rendererPath, themePath, snippets) {
|
compileSnippets : function(rendererPath, themePath, snippets) {
|
||||||
let compiledSnippets = snippets;
|
let compiledSnippets = snippets;
|
||||||
const baseSnippetsPath = Themes[rendererPath][themePath].baseSnippets;
|
const baseSnippetsPath = themePath[0] != '#' ? Themes[rendererPath][themePath].baseSnippets : false;
|
||||||
|
|
||||||
const objB = _.keyBy(compiledSnippets, 'groupName');
|
const objB = _.keyBy(compiledSnippets, 'groupName');
|
||||||
|
|
||||||
|
|||||||
@@ -388,6 +388,10 @@ const EditPage = createClass({
|
|||||||
return <div className='editPage sitePage'>
|
return <div className='editPage sitePage'>
|
||||||
<Meta name='robots' content='noindex, nofollow' />
|
<Meta name='robots' content='noindex, nofollow' />
|
||||||
{this.renderNavbar()}
|
{this.renderNavbar()}
|
||||||
|
{console.log('state')}
|
||||||
|
{console.log(this.state)}
|
||||||
|
{console.log('props')}
|
||||||
|
{console.log(this.props)}
|
||||||
|
|
||||||
<div className='content'>
|
<div className='content'>
|
||||||
<SplitPane onDragFinish={this.handleSplitMove} ref='pane'>
|
<SplitPane onDragFinish={this.handleSplitMove} ref='pane'>
|
||||||
@@ -407,6 +411,8 @@ const EditPage = createClass({
|
|||||||
theme={this.state.brew.theme}
|
theme={this.state.brew.theme}
|
||||||
errors={this.state.htmlErrors}
|
errors={this.state.htmlErrors}
|
||||||
lang={this.state.brew.lang}
|
lang={this.state.brew.lang}
|
||||||
|
userThemes={this.props.brew.userThemes}
|
||||||
|
themeClass={this.state.brew.themeClass}
|
||||||
currentEditorPage={this.state.currentEditorPage}
|
currentEditorPage={this.state.currentEditorPage}
|
||||||
/>
|
/>
|
||||||
</SplitPane>
|
</SplitPane>
|
||||||
|
|||||||
@@ -42,38 +42,6 @@ const sanitizeBrew = (brew, accessType)=>{
|
|||||||
return brew;
|
return brew;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getUsersBrewThemes = async (username,id)=>{
|
|
||||||
const fields = [
|
|
||||||
'title',
|
|
||||||
'tags',
|
|
||||||
'editId',
|
|
||||||
'thumbnail'
|
|
||||||
];
|
|
||||||
const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects
|
|
||||||
.catch((error)=>{throw 'Can not find brews';});
|
|
||||||
|
|
||||||
const userThemes = {
|
|
||||||
Brew : {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
brews.forEach((brew)=>{
|
|
||||||
if(id!=brew.editId) {
|
|
||||||
userThemes.Brew[brew.editId] = {
|
|
||||||
name : brew.title,
|
|
||||||
renderer : 'V3',
|
|
||||||
baseTheme : false,
|
|
||||||
baseSnippets : false,
|
|
||||||
path : `#${brew.editId}`,
|
|
||||||
thumbnail : brew.thumbnail
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return userThemes;
|
|
||||||
};
|
|
||||||
|
|
||||||
app.use('/', serveCompressedStaticAssets(`build`));
|
app.use('/', serveCompressedStaticAssets(`build`));
|
||||||
app.use(require('./middleware/content-negotiation.js'));
|
app.use(require('./middleware/content-negotiation.js'));
|
||||||
app.use(require('body-parser').json({ limit: '25mb' }));
|
app.use(require('body-parser').json({ limit: '25mb' }));
|
||||||
@@ -318,6 +286,9 @@ app.get('/user/:username', async (req, res, next)=>{
|
|||||||
//Edit Page
|
//Edit Page
|
||||||
app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{
|
app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{
|
||||||
req.brew = req.brew.toObject ? req.brew.toObject() : req.brew;
|
req.brew = req.brew.toObject ? req.brew.toObject() : req.brew;
|
||||||
|
console.log('edit');
|
||||||
|
console.log(req);
|
||||||
|
console.log('edit');
|
||||||
|
|
||||||
req.ogMeta = { ...defaultMetaTags,
|
req.ogMeta = { ...defaultMetaTags,
|
||||||
title : req.brew.title || 'Untitled Brew',
|
title : req.brew.title || 'Untitled Brew',
|
||||||
@@ -326,7 +297,6 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), async(req, res, next)=>{
|
|||||||
type : 'article'
|
type : 'article'
|
||||||
};
|
};
|
||||||
|
|
||||||
req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId);
|
|
||||||
sanitizeBrew(req.brew, 'edit');
|
sanitizeBrew(req.brew, 'edit');
|
||||||
splitTextStyleAndMetadata(req.brew);
|
splitTextStyleAndMetadata(req.brew);
|
||||||
res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save.
|
res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save.
|
||||||
@@ -344,7 +314,7 @@ app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{
|
|||||||
style : req.brew.style,
|
style : req.brew.style,
|
||||||
renderer : req.brew.renderer,
|
renderer : req.brew.renderer,
|
||||||
theme : req.brew.theme,
|
theme : req.brew.theme,
|
||||||
tags : req.brew.tags
|
tags : req.brew.tags,
|
||||||
};
|
};
|
||||||
req.brew = _.defaults(brew, DEFAULT_BREW);
|
req.brew = _.defaults(brew, DEFAULT_BREW);
|
||||||
|
|
||||||
@@ -378,13 +348,15 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r
|
|||||||
await HomebrewModel.increaseView({ shareId: brew.shareId });
|
await HomebrewModel.increaseView({ shareId: brew.shareId });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId);
|
||||||
sanitizeBrew(req.brew, 'share');
|
sanitizeBrew(req.brew, 'share');
|
||||||
splitTextStyleAndMetadata(req.brew);
|
splitTextStyleAndMetadata(req.brew);
|
||||||
return next();
|
return next();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
//Print Page
|
//Print Page
|
||||||
app.get('/print/:id', asyncHandler(getBrew('share')), (req, res, next)=>{
|
app.get('/print/:id', asyncHandler(getBrew('share')), async (req, res, next)=>{
|
||||||
|
req.brew.userThemes = await getUsersBrewThemes(req.account.username, req.brew.editId);
|
||||||
sanitizeBrew(req.brew, 'share');
|
sanitizeBrew(req.brew, 'share');
|
||||||
splitTextStyleAndMetadata(req.brew);
|
splitTextStyleAndMetadata(req.brew);
|
||||||
next();
|
next();
|
||||||
@@ -477,7 +449,8 @@ const renderPage = async (req, res)=>{
|
|||||||
enable_v3 : config.get('enable_v3'),
|
enable_v3 : config.get('enable_v3'),
|
||||||
enable_themes : config.get('enable_themes'),
|
enable_themes : config.get('enable_themes'),
|
||||||
config : configuration,
|
config : configuration,
|
||||||
ogMeta : req.ogMeta
|
ogMeta : req.ogMeta,
|
||||||
|
userThemes : req.userThemes
|
||||||
};
|
};
|
||||||
const title = req.brew ? req.brew.title : '';
|
const title = req.brew ? req.brew.title : '';
|
||||||
const page = await templateFn('homebrew', title, props)
|
const page = await templateFn('homebrew', title, props)
|
||||||
|
|||||||
@@ -46,8 +46,54 @@ const splitTextStyleAndMetadata = (brew)=>{
|
|||||||
brew.style = brew.text.slice(7, index - 1);
|
brew.style = brew.text.slice(7, index - 1);
|
||||||
brew.text = brew.text.slice(index + 5);
|
brew.text = brew.text.slice(index + 5);
|
||||||
}
|
}
|
||||||
|
console.log(brew.theme);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getUsersBrewThemes = async (username, id)=>{
|
||||||
|
console.log(username);
|
||||||
|
console.log(id);
|
||||||
|
const fields = [
|
||||||
|
'title',
|
||||||
|
'tags',
|
||||||
|
'editId',
|
||||||
|
'thumbnail',
|
||||||
|
'textBin'
|
||||||
|
];
|
||||||
|
const brews = await HomebrewModel.getByUser(username, true, fields, { tags: { $in: ['theme', 'Theme'] } }) //lean() converts results to JSObjects
|
||||||
|
.catch((error)=>{throw 'Can not find brews';});
|
||||||
|
|
||||||
|
const userThemes = {
|
||||||
|
Brew : {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(`Length of user brews ${brews.size}`);
|
||||||
|
|
||||||
|
brews.forEach(async (brew)=>{
|
||||||
|
b = await HomebrewModel.get({ editId: brew.editId }, ['textBin']);
|
||||||
|
splitTextStyleAndMetadata(b);
|
||||||
|
console.log(`whee!!!! ${b.theme}`);
|
||||||
|
console.log(id);
|
||||||
|
console.log(brew.editId);
|
||||||
|
if(id!=brew.editId) {
|
||||||
|
|
||||||
|
userThemes.Brew[`#${brew.editId}`] = {
|
||||||
|
name : brew.title,
|
||||||
|
renderer : 'V3',
|
||||||
|
baseTheme : b.theme,
|
||||||
|
baseSnippets : false,
|
||||||
|
path : `#${brew.editId}`,
|
||||||
|
thumbnail : brew.thumbnail.length > 0 ? brew.thumbnail : '/assets/naturalCritLogoWhite.svg'
|
||||||
|
};
|
||||||
|
console.log(`Wheee! ${userThemes.Brew[`#${brew.editId}`].baseTheme}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return userThemes;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const api = {
|
const api = {
|
||||||
homebrewApi : router,
|
homebrewApi : router,
|
||||||
getId : (req)=>{
|
getId : (req)=>{
|
||||||
@@ -119,11 +165,14 @@ const api = {
|
|||||||
throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id };
|
throw { name: 'BrewLoad Error', message: 'Brew not found', status: 404, HBErrorCode: '05', accessType: accessType, brewId: id };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const userID = accessType === 'edit' ? req.account.username : stub.authors.split(',')[0];
|
||||||
|
|
||||||
// Clean up brew: fill in missing fields with defaults / fix old invalid values
|
// Clean up brew: fill in missing fields with defaults / fix old invalid values
|
||||||
if(stub) {
|
if(stub) {
|
||||||
stub.tags = stub.tags || undefined; // Clear empty strings
|
stub.tags = stub.tags || undefined; // Clear empty strings
|
||||||
stub.renderer = stub.renderer || undefined; // Clear empty strings
|
stub.renderer = stub.renderer || undefined; // Clear empty strings
|
||||||
stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields
|
stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields
|
||||||
|
stub.userThemes = await getUsersBrewThemes(userID, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
req.brew = stub ?? {};
|
req.brew = stub ?? {};
|
||||||
@@ -239,8 +288,8 @@ const api = {
|
|||||||
const brew = req.brew;
|
const brew = req.brew;
|
||||||
splitTextStyleAndMetadata(brew);
|
splitTextStyleAndMetadata(brew);
|
||||||
res.set('Content-Type', 'text/css');
|
res.set('Content-Type', 'text/css');
|
||||||
const staticTheme = `/api/css/${req.brew.renderer}/${req.brew.theme}/styles.css`;
|
const staticTheme = `/css/${req.brew.renderer}/${req.brew.theme}`;
|
||||||
const userTheme = `/api/css/${req.brew.theme.slice(1)}`;
|
const userTheme = `/css/${req.brew.theme.slice(1)}`;
|
||||||
const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`;
|
const parentThemeImport = `@import url(\"${req.brew.theme[0] != '#' ? staticTheme : userTheme}\");\n\n/* From Brew: ${req.brew.title}*/\n\n`;
|
||||||
return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`);
|
return res.status(200).send(`${req.brew.renderer == 'legacy' ? '' : parentThemeImport}${req.brew.style}`);
|
||||||
},
|
},
|
||||||
@@ -273,6 +322,9 @@ const api = {
|
|||||||
brew.title = brew.title.trim();
|
brew.title = brew.title.trim();
|
||||||
brew.description = brew.description.trim() || '';
|
brew.description = brew.description.trim() || '';
|
||||||
brew.text = api.mergeBrewText(brew);
|
brew.text = api.mergeBrewText(brew);
|
||||||
|
const userID = req?.account?.username ? req.account.username : brew.authors.split(',')[0];
|
||||||
|
brew.userThemes = await getUsersBrewThemes(userID, brew.editId);
|
||||||
|
|
||||||
|
|
||||||
if(brew.googleId && removeFromGoogle) {
|
if(brew.googleId && removeFromGoogle) {
|
||||||
// If the google id exists and we're removing it from google, set afterSave to delete the google brew and mark the brew's google id as undefined
|
// If the google id exists and we're removing it from google, set afterSave to delete the google brew and mark the brew's google id as undefined
|
||||||
|
|||||||
Reference in New Issue
Block a user