mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-13 08:42:42 +00:00
Added input validation (allows Share ID or Share URL)
This commit is contained in:
@@ -77,6 +77,7 @@ const MetadataEditor = createClass({
|
|||||||
...this.props.metadata,
|
...this.props.metadata,
|
||||||
[name] : e.target.value
|
[name] : e.target.value
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
} else {
|
} else {
|
||||||
// if validation issues, display built-in browser error popup with each error.
|
// if validation issues, display built-in browser error popup with each error.
|
||||||
const errMessage = validationErr.map((err)=>{
|
const errMessage = validationErr.map((err)=>{
|
||||||
@@ -85,6 +86,7 @@ const MetadataEditor = createClass({
|
|||||||
|
|
||||||
callIfExists(e.target, 'setCustomValidity', errMessage);
|
callIfExists(e.target, 'setCustomValidity', errMessage);
|
||||||
callIfExists(e.target, 'reportValidity');
|
callIfExists(e.target, 'reportValidity');
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -120,9 +122,8 @@ const MetadataEditor = createClass({
|
|||||||
},
|
},
|
||||||
|
|
||||||
handleThemeWritein : function(e) {
|
handleThemeWritein : function(e) {
|
||||||
this.props.metadata.theme = e.target.value;
|
const shareId = e.target.value.split('/').pop(); //Extract just the ID if a URL was pasted in
|
||||||
|
this.props.metadata.theme = shareId;
|
||||||
|
|
||||||
|
|
||||||
this.props.onChange(this.props.metadata, 'theme');
|
this.props.onChange(this.props.metadata, 'theme');
|
||||||
},
|
},
|
||||||
@@ -225,8 +226,6 @@ const MetadataEditor = createClass({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(this.props.themeBundle);
|
|
||||||
|
|
||||||
const currentRenderer = this.props.metadata.renderer;
|
const currentRenderer = this.props.metadata.renderer;
|
||||||
const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme]
|
const currentTheme = mergedThemes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme]
|
||||||
?? { name: `${this.props.themeBundle?.name || ''}`, author: `${this.props.themeBundle?.author || ''}` };
|
?? { name: `${this.props.themeBundle?.name || ''}`, author: `${this.props.themeBundle?.author || ''}` };
|
||||||
@@ -247,8 +246,8 @@ const MetadataEditor = createClass({
|
|||||||
onSelect={(value)=>this.handleTheme(value)}
|
onSelect={(value)=>this.handleTheme(value)}
|
||||||
onEntry={(e)=>{
|
onEntry={(e)=>{
|
||||||
e.target.setCustomValidity(''); //Clear the validation popup while typing
|
e.target.setCustomValidity(''); //Clear the validation popup while typing
|
||||||
//debouncedHandleFieldChange('theme', e);
|
if(this.handleFieldChange('theme', e))
|
||||||
this.handleThemeWritein(e);
|
this.handleThemeWritein(e);
|
||||||
}}
|
}}
|
||||||
options={listThemes(currentRenderer)}
|
options={listThemes(currentRenderer)}
|
||||||
autoSuggest={{
|
autoSuggest={{
|
||||||
|
|||||||
@@ -27,6 +27,19 @@ module.exports = {
|
|||||||
(value)=>{
|
(value)=>{
|
||||||
return new RegExp(/^([a-zA-Z]{2,3})(-[a-zA-Z]{4})?(-(?:[0-9]{3}|[a-zA-Z]{2}))?$/).test(value) === false && (value.length > 0) ? 'Invalid language code.' : null;
|
return new RegExp(/^([a-zA-Z]{2,3})(-[a-zA-Z]{4})?(-(?:[0-9]{3}|[a-zA-Z]{2}))?$/).test(value) === false && (value.length > 0) ? 'Invalid language code.' : null;
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
theme: [
|
||||||
|
(value) => {
|
||||||
|
const URL = global.config.baseUrl.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'); //Escape any regex characters
|
||||||
|
const shareIDPattern = '[a-zA-Z0-9-_]{12}';
|
||||||
|
const shareURLRegex = new RegExp(`^${URL}\\/share\\/${shareIDPattern}$`);
|
||||||
|
const shareIDRegex = new RegExp(`^${shareIDPattern}$`);
|
||||||
|
if (value?.length === 0) return null;
|
||||||
|
if (shareURLRegex.test(value)) return null;
|
||||||
|
if (shareIDRegex.test(value)) return null;
|
||||||
|
|
||||||
|
return 'Must be a valid Share URL or a 12-character ID.';
|
||||||
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ const EditPage = createClass({
|
|||||||
const title = `${this.props.brew.title} ${systems}`;
|
const title = `${this.props.brew.title} ${systems}`;
|
||||||
const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out.
|
const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out.
|
||||||
|
|
||||||
**[Homebrewery Link](${global.config.publicUrl}/share/${shareLink})**`;
|
**[Homebrewery Link](${global.config.baseUrl}/share/${shareLink})**`;
|
||||||
|
|
||||||
return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title.toWellFormed())}&text=${encodeURIComponent(text)}`;
|
return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title.toWellFormed())}&text=${encodeURIComponent(text)}`;
|
||||||
},
|
},
|
||||||
@@ -410,7 +410,7 @@ const EditPage = createClass({
|
|||||||
<Nav.item color='blue' href={`/share/${shareLink}`}>
|
<Nav.item color='blue' href={`/share/${shareLink}`}>
|
||||||
view
|
view
|
||||||
</Nav.item>
|
</Nav.item>
|
||||||
<Nav.item color='blue' onClick={()=>{navigator.clipboard.writeText(`${global.config.publicUrl}/share/${shareLink}`);}}>
|
<Nav.item color='blue' onClick={()=>{navigator.clipboard.writeText(`${global.config.baseUrl}/share/${shareLink}`);}}>
|
||||||
copy url
|
copy url
|
||||||
</Nav.item>
|
</Nav.item>
|
||||||
<Nav.item color='blue' href={this.getRedditLink()} newTab={true} rel='noopener noreferrer'>
|
<Nav.item color='blue' href={this.getRedditLink()} newTab={true} rel='noopener noreferrer'>
|
||||||
|
|||||||
@@ -552,6 +552,7 @@ const renderPage = async (req, res)=>{
|
|||||||
const configuration = {
|
const configuration = {
|
||||||
local : isLocalEnvironment,
|
local : isLocalEnvironment,
|
||||||
publicUrl : config.get('publicUrl') ?? '',
|
publicUrl : config.get('publicUrl') ?? '',
|
||||||
|
baseUrl : `${req.protocol}://${req.get('host')}`,
|
||||||
environment : nodeEnv,
|
environment : nodeEnv,
|
||||||
deployment : config.get('heroku_app_name') ?? ''
|
deployment : config.get('heroku_app_name') ?? ''
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user