diff --git a/src/App.jsx b/src/App.jsx index beda7faf..2f4bb73e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,7 @@ import Widgets from './components/widgets/Widgets'; import Modals from './components/modals/Modals'; import SettingsFunctions from './modules/helpers/settings'; + import { ToastContainer } from 'react-toastify'; export default class App extends React.PureComponent { diff --git a/src/components/modals/main/marketplace/sections/Added.jsx b/src/components/modals/main/marketplace/sections/Added.jsx index 491603b5..a2e30bd4 100644 --- a/src/components/modals/main/marketplace/sections/Added.jsx +++ b/src/components/modals/main/marketplace/sections/Added.jsx @@ -104,7 +104,7 @@ export default class Added extends React.PureComponent { if (this.state.installed.length === 0) { content = ( -
+

{this.language.empty.title}

diff --git a/src/components/modals/main/scss/index.scss b/src/components/modals/main/scss/index.scss index cbaae0f5..bf964554 100644 --- a/src/components/modals/main/scss/index.scss +++ b/src/components/modals/main/scss/index.scss @@ -119,8 +119,7 @@ ul.sidebar { border-radius: 12px 0 0 12px; text-align: left; font-size: 24px; - padding-bottom: 100%; - margin-bottom: -100%; + height: 100vh; h1 { text-align: center; diff --git a/src/components/modals/main/settings/Checkbox.jsx b/src/components/modals/main/settings/Checkbox.jsx index ccfc88da..3f491e70 100644 --- a/src/components/modals/main/settings/Checkbox.jsx +++ b/src/components/modals/main/settings/Checkbox.jsx @@ -1,5 +1,6 @@ import React from 'react'; +import EventBus from '../../../../modules/helpers/eventbus'; import SettingsFunctions from '../../../../modules/helpers/settings'; import CheckboxUI from '@material-ui/core/Checkbox'; @@ -19,6 +20,8 @@ export default class Checkbox extends React.PureComponent { this.setState({ checked: (this.state.checked === true) ? false : true }); + + EventBus.dispatch('refresh', this.props.category); } render() { diff --git a/src/components/modals/main/settings/Radio.jsx b/src/components/modals/main/settings/Radio.jsx index 45841b0a..5d79aa39 100644 --- a/src/components/modals/main/settings/Radio.jsx +++ b/src/components/modals/main/settings/Radio.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../../modules/helpers/eventbus'; + import RadioUI from '@material-ui/core/Radio'; import RadioGroup from '@material-ui/core/RadioGroup'; import FormControlLabel from '@material-ui/core/FormControlLabel'; @@ -22,6 +24,8 @@ export default class Radio extends React.PureComponent { this.setState({ value: value }); + + EventBus.dispatch('refresh', this.props.category); } render() { diff --git a/src/components/modals/main/settings/Slider.jsx b/src/components/modals/main/settings/Slider.jsx index 1976000f..79e34bab 100644 --- a/src/components/modals/main/settings/Slider.jsx +++ b/src/components/modals/main/settings/Slider.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../../modules/helpers/eventbus'; + import { toast } from 'react-toastify'; export default class Slider extends React.PureComponent { @@ -18,6 +20,8 @@ export default class Slider extends React.PureComponent { this.setState({ value: value }); + + EventBus.dispatch('refresh', this.props.category); } resetItem = () => { diff --git a/src/components/modals/main/settings/Switch.jsx b/src/components/modals/main/settings/Switch.jsx index 3872bdd5..5c13c97f 100644 --- a/src/components/modals/main/settings/Switch.jsx +++ b/src/components/modals/main/settings/Switch.jsx @@ -1,5 +1,6 @@ import React from 'react'; +import EventBus from '../../../../modules/helpers/eventbus'; import SettingsFunctions from '../../../../modules/helpers/settings'; import SwitchUI from '@material-ui/core/Switch'; @@ -19,6 +20,8 @@ export default class Switch extends React.PureComponent { this.setState({ checked: (this.state.checked === true) ? false : true }); + + EventBus.dispatch('refresh', this.props.category); } render() { diff --git a/src/components/modals/main/settings/Text.jsx b/src/components/modals/main/settings/Text.jsx index 2a33532d..ab0b7f51 100644 --- a/src/components/modals/main/settings/Text.jsx +++ b/src/components/modals/main/settings/Text.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../../modules/helpers/eventbus'; + import { toast } from 'react-toastify'; export default class Text extends React.PureComponent { @@ -23,6 +25,8 @@ export default class Text extends React.PureComponent { this.setState({ value: value }); + + EventBus.dispatch('refresh', this.props.category); } resetItem = () => { diff --git a/src/components/modals/main/settings/sections/Order.jsx b/src/components/modals/main/settings/sections/Order.jsx index 0266a284..e53736e6 100644 --- a/src/components/modals/main/settings/sections/Order.jsx +++ b/src/components/modals/main/settings/sections/Order.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../../../modules/helpers/eventbus'; + import DragHandleIcon from '@material-ui/icons/DragIndicator'; import { sortableContainer, sortableElement } from 'react-sortable-hoc'; @@ -63,6 +65,7 @@ export default class OrderSettings extends React.PureComponent { componentDidUpdate() { localStorage.setItem('order', JSON.stringify(this.state.items)); + EventBus.dispatch('refresh', 'order'); } render() { diff --git a/src/components/modals/main/settings/sections/Quote.jsx b/src/components/modals/main/settings/sections/Quote.jsx index 1b24eacd..937edd7d 100644 --- a/src/components/modals/main/settings/sections/Quote.jsx +++ b/src/components/modals/main/settings/sections/Quote.jsx @@ -10,15 +10,15 @@ export default function QuoteSettings() { return ( <>

{quote.title}

- - - - + + + +

{quote.buttons.title}

- - - + + + ); } \ No newline at end of file diff --git a/src/components/modals/main/settings/sections/Search.jsx b/src/components/modals/main/settings/sections/Search.jsx index f1b4ab35..f933064d 100644 --- a/src/components/modals/main/settings/sections/Search.jsx +++ b/src/components/modals/main/settings/sections/Search.jsx @@ -4,6 +4,8 @@ import Dropdown from '../Dropdown'; import Checkbox from '../Checkbox'; import Switch from '../Switch'; +import EventBus from '../../../../../modules/helpers/eventbus'; + import { isChrome } from 'react-device-detect'; import { toast } from 'react-toastify'; @@ -44,6 +46,8 @@ export default class SearchSettings extends React.PureComponent { if (this.state.customEnabled === true && this.state.customValue !== '') { localStorage.setItem('customSearchEngine', this.state.customValue); } + + EventBus.dispatch('refresh', 'search'); } setSearchEngine(input) { @@ -59,6 +63,8 @@ export default class SearchSettings extends React.PureComponent { }); localStorage.setItem('searchEngine', input); } + + EventBus.dispatch('refresh', 'search'); } render() { @@ -68,7 +74,7 @@ export default class SearchSettings extends React.PureComponent { return ( <>

{search.title}

- + {isChrome ? : null} this.setSearchEngine(value)}> diff --git a/src/components/widgets/Widgets.jsx b/src/components/widgets/Widgets.jsx index 1e1749d9..41ac2e08 100644 --- a/src/components/widgets/Widgets.jsx +++ b/src/components/widgets/Widgets.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import EventBus from '../../modules/helpers/eventbus'; import Clock from './time/Clock'; import Greeting from './greeting/Greeting'; @@ -13,6 +14,9 @@ const renderLoader = () => <>; export default class Widgets extends React.PureComponent { constructor() { super(); + this.state = { + order: JSON.parse(localStorage.getItem('order')) + }; // widgets we can re-order this.widgets = { time: this.enabled('time') ? : null, @@ -27,13 +31,22 @@ export default class Widgets extends React.PureComponent { return (localStorage.getItem(key) === 'true'); } + componentDidMount() { + EventBus.on('refresh', (data) => { + if (data === 'order') { + this.setState({ + order: JSON.parse(localStorage.getItem('order')) + }); + } + }); + } + render() { // allow for re-ordering widgets let elements = []; - const order = JSON.parse(localStorage.getItem('order')); - if (order) { - order.forEach((element) => { + if (this.state.order) { + this.state.order.forEach((element) => { elements.push({this.widgets[element]}); }); } else { diff --git a/src/components/widgets/quote/Quote.jsx b/src/components/widgets/quote/Quote.jsx index 1095bb9d..1ff3c387 100644 --- a/src/components/widgets/quote/Quote.jsx +++ b/src/components/widgets/quote/Quote.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../modules/helpers/eventbus'; + import FileCopy from '@material-ui/icons/FilterNone'; import TwitterIcon from '@material-ui/icons/Twitter'; import StarIcon from '@material-ui/icons/Star'; @@ -17,9 +19,14 @@ export default class Quote extends React.PureComponent { quote: '', author: '', favourited: , + tweet: '', + copy: '' + }; + + this.buttons = { tweet: , copy: - }; + } this.language = window.language.widgets.quote; } @@ -137,7 +144,7 @@ export default class Quote extends React.PureComponent { } } - componentDidMount() { + init() { let favouriteQuote = ''; if (localStorage.getItem('favouriteQuoteEnabled') === 'true') { favouriteQuote = localStorage.getItem('favouriteQuote') ? : ; @@ -145,13 +152,34 @@ export default class Quote extends React.PureComponent { this.setState({ favourited: favouriteQuote, - copy: (localStorage.getItem('copyButton') === 'false') ? null : this.state.copy, - tweet: (localStorage.getItem('tweetButton') === 'false') ? null : this.state.tweet + copy: (localStorage.getItem('copyButton') === 'false') ? null : this.buttons.copy, + tweet: (localStorage.getItem('tweetButton') === 'false') ? null : this.buttons.tweet }); - + this.getQuote(); } + componentDidMount() { + EventBus.on('refresh', (data) => { + if (data === 'quote') { + const element = document.querySelector('.quotediv'); + + if (localStorage.getItem('quote') === 'false') { + return element.style.display = 'none'; + } + + element.style.display = 'block'; + this.init(); + } + }); + + this.init(); + } + + componentWillUnmount() { + EventBus.remove('refresh'); + } + render() { return (
diff --git a/src/components/widgets/search/Search.jsx b/src/components/widgets/search/Search.jsx index ef82d5f5..6c9c0b3b 100644 --- a/src/components/widgets/search/Search.jsx +++ b/src/components/widgets/search/Search.jsx @@ -1,5 +1,7 @@ import React from 'react'; +import EventBus from '../../../modules/helpers/eventbus'; + import SearchIcon from '@material-ui/icons/Search'; import MicIcon from '@material-ui/icons/Mic'; @@ -40,7 +42,7 @@ export default class Search extends React.PureComponent { window.location.href = this.state.url + `?${this.state.query}=` + value; } - componentDidMount() { + init() { let url; let query = 'q'; let microphone = null; @@ -70,6 +72,27 @@ export default class Search extends React.PureComponent { }); } + componentDidMount() { + EventBus.on('refresh', (data) => { + if (data === 'search') { + const element = document.querySelector('.searchBar'); + + if (localStorage.getItem('searchBar') === 'false') { + return element.style.display = 'none'; + } + + element.style.display = 'block'; + this.init(); + } + }); + + this.init(); + } + + componentWillUnmount() { + EventBus.remove('refresh'); + } + render() { return (
diff --git a/src/index.js b/src/index.js index b34fa7c6..cfe1bcf6 100644 --- a/src/index.js +++ b/src/index.js @@ -13,11 +13,15 @@ import '@fontsource/roboto/cyrillic-400.css'; // language import merge from '@material-ui/utils/deepmerge'; + const languagecode = localStorage.getItem('language') || 'en_GB'; + // we set things to window. so they're global and we avoid passing the translation strings as props to each component window.languagecode = languagecode.replace('-', '_'); + // these are merged so if a string is untranslated it doesn't break mue window.language = merge(require('./translations/en_GB.json'), require(`./translations/${window.languagecode}.json`)); + // set html language tag if (window.languagecode !== 'en_GB' || window.languagecode !== 'en_US') { document.documentElement.lang = window.languagecode.split('_')[0]; diff --git a/src/modules/helpers/eventbus.js b/src/modules/helpers/eventbus.js new file mode 100644 index 00000000..1c1d0313 --- /dev/null +++ b/src/modules/helpers/eventbus.js @@ -0,0 +1,17 @@ +const EventBus = { + on(event, callback) { + document.addEventListener(event, (e) => callback(e.detail)); + }, + + dispatch(event, data) { + document.dispatchEvent(new CustomEvent(event, { + detail: data + })); + }, + + remove(event, callback) { + document.removeEventListener(event, callback); + }, +}; + +export default EventBus; \ No newline at end of file diff --git a/src/scss/modules/_marketplace.scss b/src/scss/modules/_marketplace.scss index 0cafd589..bc785274 100644 --- a/src/scss/modules/_marketplace.scss +++ b/src/scss/modules/_marketplace.scss @@ -7,9 +7,16 @@ } } +.emptyitems { + width: 25vw; + display: flex; + justify-content: center; + margin-top: 90px; +} + .items { display: inline-grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(2, 1fr); margin-top: 15px; .item { @@ -92,10 +99,13 @@ p.description { } .emptyMessage { - margin: 0 auto; text-align: center; - transform: translateY(30%); - + background: var(--sidebar); + padding: 25px; + border-radius: 30px; + box-shadow: 0 0 10px rgb(0 0 0 / 30%); + position: absolute; + width: 300px; svg { font-size: 50px; margin-bottom: -20px; @@ -170,7 +180,7 @@ p.description { padding: 50px; color: #fff; box-shadow: 0 0 10px rgb(0 0 0 / 30%); - width: 85%; + width: 100%; button { float: left;