feat: navbar hot reload, quick links zoom, add example images to welcome modal, fixes

This commit is contained in:
David Ralph
2021-07-03 14:48:49 +01:00
parent ba9f2e01c8
commit 19bc802f09
14 changed files with 94 additions and 49 deletions

View File

@@ -38,14 +38,14 @@
"babel-plugin-transform-react-class-to-function": "^1.2.2", "babel-plugin-transform-react-class-to-function": "^1.2.2",
"copy-webpack-plugin": "^9.0.1", "copy-webpack-plugin": "^9.0.1",
"css-loader": "^5.2.6", "css-loader": "^5.2.6",
"eslint": "^7.29.0", "eslint": "^7.30.0",
"eslint-config-react-app": "^6.0.0", "eslint-config-react-app": "^6.0.0",
"html-webpack-plugin": "^5.3.2", "html-webpack-plugin": "^5.3.2",
"mini-css-extract-plugin": "^2.0.0", "mini-css-extract-plugin": "^2.0.0",
"sass": "^1.35.1", "sass": "^1.35.1",
"sass-loader": "^12.1.0", "sass-loader": "^12.1.0",
"source-map-loader": "^3.0.0", "source-map-loader": "^3.0.0",
"webpack": "^5.41.1", "webpack": "^5.42.0",
"webpack-cli": "^4.7.2", "webpack-cli": "^4.7.2",
"webpack-dev-server": "^4.0.0-beta.3" "webpack-dev-server": "^4.0.0-beta.3"
}, },

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -28,8 +28,8 @@ export default function AppearanceSettings() {
<Radio name='theme' title={appearance.theme.title} options={themeOptions} category='other' /> <Radio name='theme' title={appearance.theme.title} options={themeOptions} category='other' />
<h3>{appearance.navbar.title}</h3> <h3>{appearance.navbar.title}</h3>
<Checkbox name='notesEnabled' text={appearance.navbar.notes} element='.other' /> <Checkbox name='notesEnabled' text={appearance.navbar.notes} category='navbar' />
<Checkbox name='refresh' text={appearance.navbar.refresh} element='.other' /> <Checkbox name='refresh' text={appearance.navbar.refresh} category='navbar' />
<h3>{appearance.font.title}</h3> <h3>{appearance.font.title}</h3>
<Text title={appearance.font.custom} name='font' upperCaseFirst={true} category='other' /> <Text title={appearance.font.custom} name='font' upperCaseFirst={true} category='other' />

View File

@@ -1,5 +1,6 @@
import Switch from '../Switch'; import Switch from '../Switch';
import Checkbox from '../Checkbox'; import Checkbox from '../Checkbox';
import Slider from '../Slider';
export default function QuickLinks() { export default function QuickLinks() {
const language = window.language.modals.main.settings.sections.quicklinks; const language = window.language.modals.main.settings.sections.quicklinks;
@@ -11,6 +12,7 @@ export default function QuickLinks() {
<Checkbox name='quicklinksddgProxy' text={window.language.modals.main.settings.sections.background.ddg_image_proxy} element='.other' /> <Checkbox name='quicklinksddgProxy' text={window.language.modals.main.settings.sections.background.ddg_image_proxy} element='.other' />
<Checkbox name='quicklinksnewtab' text={language.open_new} category='quicklinks' /> <Checkbox name='quicklinksnewtab' text={language.open_new} category='quicklinks' />
<Checkbox name='quicklinkstooltip' text={language.tooltip} category='quicklinks' /> <Checkbox name='quicklinkstooltip' text={language.tooltip} category='quicklinks' />
<Slider title={window.language.modals.main.settings.sections.appearance.accessibility.widget_zoom} name='zoomQuicklinks' min='10' max='400' default='100' display='%' category='quicklinks' element='.quicklinks-container' />
</> </>
); );
} }

View File

@@ -169,8 +169,8 @@ export default class BackgroundSettings extends React.PureComponent {
{backgroundSettings} {backgroundSettings}
<h3>{background.buttons.title}</h3> <h3>{background.buttons.title}</h3>
<Checkbox name='view' text={background.buttons.view} element='.other' /> <Checkbox name='view' text={background.buttons.view} category='navbar' />
<Checkbox name='favouriteEnabled' text={background.buttons.favourite} element='.other' /> <Checkbox name='favouriteEnabled' text={background.buttons.favourite} category='navbar' />
<Checkbox name='downloadbtn' text={background.buttons.download} element='.other' /> <Checkbox name='downloadbtn' text={background.buttons.download} element='.other' />
<h3>{background.effects.title}</h3> <h3>{background.effects.title}</h3>

View File

@@ -22,7 +22,7 @@ export default class WelcomeSections extends React.Component {
welcomeImage: 0 welcomeImage: 0
}; };
this.changeWelcomeImg = this.changeWelcomeImg.bind(this); this.changeWelcomeImg = this.changeWelcomeImg.bind(this);
this.welcomeImages = ['https://external-content.duckduckgo.com/iu/?u=example.com/example.png']; this.welcomeImages = ['./welcome-images/example1.webp', './welcome-images/example2.webp', './welcome-images/example3.webp', './welcome-images/example4.webp'];
} }
changeTheme(type) { changeTheme(type) {
@@ -58,6 +58,12 @@ export default class WelcomeSections extends React.Component {
this.timeout = setTimeout(this.changeWelcomeImg, 3 * 1000); this.timeout = setTimeout(this.changeWelcomeImg, 3 * 1000);
} }
componentWillUnmount() {
if (this.timeout) {
clearTimeout(this.timeout);
}
}
render() { render() {
const language = window.language.modals.welcome; const language = window.language.modals.welcome;
let tabContent; let tabContent;
@@ -66,7 +72,7 @@ export default class WelcomeSections extends React.Component {
<> <>
<h1>{language.sections.intro.title}</h1> <h1>{language.sections.intro.title}</h1>
<p>{language.sections.intro.description}</p> <p>{language.sections.intro.description}</p>
<h3 className='quicktip'>to be added</h3> <h3 className='quicktip'>#shareyourmue</h3>
<div className='examples'> <div className='examples'>
<img src={this.welcomeImages[this.state.welcomeImage]} alt='example mue setup' draggable={false}/> <img src={this.welcomeImages[this.state.welcomeImage]} alt='example mue setup' draggable={false}/>
</div> </div>
@@ -81,6 +87,7 @@ export default class WelcomeSections extends React.Component {
</> </>
); );
const { appearance } = window.language.modals.main.settings.sections;
const theme = ( const theme = (
<> <>
<h1>{language.sections.theme.title}</h1> <h1>{language.sections.theme.title}</h1>
@@ -88,16 +95,16 @@ export default class WelcomeSections extends React.Component {
<div className='themesToggleArea'> <div className='themesToggleArea'>
<div className={this.state.autoClass} onClick={() => this.changeTheme('auto')}> <div className={this.state.autoClass} onClick={() => this.changeTheme('auto')}>
<AutoIcon/> <AutoIcon/>
<span>Auto</span> <span>{appearance.theme.auto}</span>
</div> </div>
<div className='options'> <div className='options'>
<div className={this.state.lightClass} onClick={() => this.changeTheme('light')}> <div className={this.state.lightClass} onClick={() => this.changeTheme('light')}>
<LightModeIcon/> <LightModeIcon/>
<span>Light</span> <span>{appearance.theme.light}</span>
</div> </div>
<div className={this.state.darkClass} onClick={() => this.changeTheme('dark')}> <div className={this.state.darkClass} onClick={() => this.changeTheme('dark')}>
<DarkModeIcon/> <DarkModeIcon/>
<span>Dark</span> <span>{appearance.theme.dark}</span>
</div> </div>
</div> </div>
<h3 className='quicktip'>{language.tip}</h3> <h3 className='quicktip'>{language.tip}</h3>
@@ -139,7 +146,7 @@ export default class WelcomeSections extends React.Component {
<div className='toggle' onClick={() => this.props.switchTab(3)}>Theme: {this.getSetting('theme')}</div> <div className='toggle' onClick={() => this.props.switchTab(3)}>Theme: {this.getSetting('theme')}</div>
</div> </div>
</> </>
) );
switch (this.props.currentTab) { switch (this.props.currentTab) {
case 1: tabContent = chooseLanguage; break; case 1: tabContent = chooseLanguage; break;

View File

@@ -43,9 +43,9 @@ export default class Widgets extends React.PureComponent {
} }
render() { render() {
// don't hide when welcome is there // don't show when welcome is there
if (localStorage.getItem('showWelcome') === 'true') { if (localStorage.getItem('showWelcome') !== 'false') {
return <div id='widgets'></div> return <div id='widgets'></div>;
} }
// allow for re-ordering widgets // allow for re-ordering widgets
@@ -57,7 +57,7 @@ export default class Widgets extends React.PureComponent {
}); });
} else { } else {
// prevent error // prevent error
elements = ['greeting', 'time', 'quicklinks', 'quote', 'date']; elements = [<Greeting/>, <Clock/>, <QuickLinks/>, <Quote/>, <Date/>];
} }
return ( return (

View File

@@ -10,42 +10,54 @@ import Maximise from '../background/Maximise';
import Favourite from '../background/Favourite'; import Favourite from '../background/Favourite';
import Tooltip from '../../helpers/tooltip/Tooltip'; import Tooltip from '../../helpers/tooltip/Tooltip';
import EventBus from '../../../modules/helpers/eventbus';
import './scss/index.scss'; import './scss/index.scss';
export default function Navbar(props) { export default class Navbar extends React.Component {
if (localStorage.getItem('showWelcome') === 'true') { componentDidMount() {
return null; EventBus.on('refresh', (data) => {
if (data === 'navbar') {
this.forceUpdate();
}
});
} }
const backgroundEnabled = (localStorage.getItem('background') === 'true'); render() {
if (localStorage.getItem('showWelcome') !== 'false') {
return ( return null;
<div className='navbar-container'> }
{(localStorage.getItem('view') === 'true' && backgroundEnabled) ? <Maximise/> : null}
{(localStorage.getItem('favouriteEnabled') === 'true' && backgroundEnabled) ? <Favourite/> : null}
{(localStorage.getItem('notesEnabled') === 'true') ? const backgroundEnabled = (localStorage.getItem('background') === 'true');
<div className='notes'>
<NotesIcon className='topicons'/> return (
<Notes/> <div className='navbar-container'>
</div> {(localStorage.getItem('view') === 'true' && backgroundEnabled) ? <Maximise/> : null}
: null} {(localStorage.getItem('favouriteEnabled') === 'true' && backgroundEnabled) ? <Favourite/> : null}
{(window.constants.BETA_VERSION === true) ? {(localStorage.getItem('notesEnabled') === 'true') ?
<Tooltip title={window.language.widgets.navbar.tooltips.feedback}> <div className='notes'>
<Report className='topicons' onClick={() => props.openModal('feedbackModal')}/> <NotesIcon className='topicons'/>
<Notes/>
</div>
: null}
{(window.constants.BETA_VERSION === true) ?
<Tooltip title={window.language.widgets.navbar.tooltips.feedback}>
<Report className='topicons' onClick={() => this.props.openModal('feedbackModal')}/>
</Tooltip>
: null}
{(localStorage.getItem('refresh') === 'true') ?
<Tooltip title={window.language.widgets.navbar.tooltips.refresh}>
<RefreshIcon className='refreshicon topicons' onClick={() => window.location.reload()}/>
</Tooltip>
: null}
<Tooltip title={window.language.modals.main.navbar.settings}>
<Gear className='settings-icon topicons' onClick={() => this.props.openModal('mainModal')}/>
</Tooltip> </Tooltip>
: null} </div>
);
{(localStorage.getItem('refresh') === 'true') ? }
<Tooltip title={window.language.widgets.navbar.tooltips.refresh}>
<RefreshIcon className='refreshicon topicons' onClick={() => window.location.reload()}/>
</Tooltip>
: null}
<Tooltip title={window.language.modals.main.navbar.settings}>
<Gear className='settings-icon topicons' onClick={() => props.openModal('mainModal')}/>
</Tooltip>
</div>
);
} }

View File

@@ -78,6 +78,13 @@ export default class QuickLinks extends React.PureComponent {
window.stats.postEvent('feature', 'Quicklink add'); window.stats.postEvent('feature', 'Quicklink add');
this.toggleAdd(); this.toggleAdd();
// make sure image is correct size
const element = document.querySelector('.quicklinks-container');
const images = element.getElementsByTagName('img');
for (const img of images) {
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
};
} }
toggleAdd = () => { toggleAdd = () => {
@@ -102,6 +109,12 @@ export default class QuickLinks extends React.PureComponent {
} }
element.style.display = 'block'; element.style.display = 'block';
const images = element.getElementsByTagName('img');
for (const img of images) {
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
};
element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
this.setState({ this.setState({
items: JSON.parse(localStorage.getItem('quicklinks')) items: JSON.parse(localStorage.getItem('quicklinks'))
}); });
@@ -117,6 +130,13 @@ export default class QuickLinks extends React.PureComponent {
e.preventDefault(); e.preventDefault();
} }
}; };
const element = document.querySelector('.quicklinks-container');
const images = element.getElementsByTagName('img');
for (const img of images) {
img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
};
element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`;
} }
componentWillUnmount() { componentWillUnmount() {

View File

@@ -22,7 +22,7 @@
"new": "Neuer Link", "new": "Neuer Link",
"name": "Name", "name": "Name",
"url": "URL", "url": "URL",
"add": "hinzufügen", "add": "Hinzufügen",
"name_error": "Muss einen Namen angeben", "name_error": "Muss einen Namen angeben",
"url_error": "Muss eine URL angeben" "url_error": "Muss eine URL angeben"
}, },

View File

@@ -64,6 +64,10 @@ module.exports = {
{ {
from: 'public/offline-images', from: 'public/offline-images',
to: 'offline-images' to: 'offline-images'
},
{
from: 'public/welcome-images',
to: 'welcome-images'
} }
] ]
}), }),