importSettings(e)}/>
{advanced.customisation}
diff --git a/src/components/modals/main/settings/sections/Changelog.jsx b/src/components/modals/main/settings/sections/Changelog.jsx
index 0bb8473d..56f0e5d1 100644
--- a/src/components/modals/main/settings/sections/Changelog.jsx
+++ b/src/components/modals/main/settings/sections/Changelog.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Modal from 'react-modal';
@@ -6,7 +6,7 @@ import Lightbox from '../../marketplace/Lightbox';
import WifiOffIcon from '@material-ui/icons/WifiOff';
-export default class Changelog extends React.PureComponent {
+export default class Changelog extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Greeting.jsx b/src/components/modals/main/settings/sections/Greeting.jsx
index 755c8d65..07aa8bb3 100644
--- a/src/components/modals/main/settings/sections/Greeting.jsx
+++ b/src/components/modals/main/settings/sections/Greeting.jsx
@@ -1,11 +1,11 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Checkbox from '../Checkbox';
import Switch from '../Switch';
import Text from '../Text';
import Slider from '../Slider';
-export default class GreetingSettings extends React.PureComponent {
+export default class GreetingSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Language.jsx b/src/components/modals/main/settings/sections/Language.jsx
index b4006a7b..335e643b 100644
--- a/src/components/modals/main/settings/sections/Language.jsx
+++ b/src/components/modals/main/settings/sections/Language.jsx
@@ -1,10 +1,10 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Radio from '../Radio';
const languages = require('../../../../../modules/languages.json');
-export default class BackgroundSettings extends React.PureComponent {
+export default class BackgroundSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Order.jsx b/src/components/modals/main/settings/sections/Order.jsx
index b88ee997..f70d4c91 100644
--- a/src/components/modals/main/settings/sections/Order.jsx
+++ b/src/components/modals/main/settings/sections/Order.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../../../modules/helpers/eventbus';
@@ -36,7 +36,7 @@ const SortableContainer = sortableContainer(({ children }) => {
return ;
});
-export default class OrderSettings extends React.PureComponent {
+export default class OrderSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Quote.jsx b/src/components/modals/main/settings/sections/Quote.jsx
index 24859e65..3e6d6e3a 100644
--- a/src/components/modals/main/settings/sections/Quote.jsx
+++ b/src/components/modals/main/settings/sections/Quote.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Checkbox from '../Checkbox';
import Text from '../Text';
@@ -6,7 +6,7 @@ import Switch from '../Switch';
import Slider from '../Slider';
import Dropdown from '../Dropdown';
-export default class QuoteSettings extends React.PureComponent {
+export default class QuoteSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Search.jsx b/src/components/modals/main/settings/sections/Search.jsx
index 090074dc..3e498d9f 100644
--- a/src/components/modals/main/settings/sections/Search.jsx
+++ b/src/components/modals/main/settings/sections/Search.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Dropdown from '../Dropdown';
import Checkbox from '../Checkbox';
@@ -12,7 +12,7 @@ import { toast } from 'react-toastify';
const searchEngines = require('../../../../widgets/search/search_engines.json');
const autocompleteProviders = require('../../../../widgets/search/autocomplete_providers.json');
-export default class SearchSettings extends React.PureComponent {
+export default class SearchSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Stats.jsx b/src/components/modals/main/settings/sections/Stats.jsx
index 599e08c7..0a0711a6 100644
--- a/src/components/modals/main/settings/sections/Stats.jsx
+++ b/src/components/modals/main/settings/sections/Stats.jsx
@@ -1,10 +1,10 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Switch from '../Switch';
import EventBus from '../../../../../modules/helpers/eventbus';
-export default class Stats extends React.PureComponent {
+export default class Stats extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Time.jsx b/src/components/modals/main/settings/sections/Time.jsx
index ce587277..3bc8e873 100644
--- a/src/components/modals/main/settings/sections/Time.jsx
+++ b/src/components/modals/main/settings/sections/Time.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Checkbox from '../Checkbox';
import Dropdown from '../Dropdown';
@@ -6,7 +6,7 @@ import Switch from '../Switch';
import Radio from '../Radio';
import Slider from '../Slider';
-export default class TimeSettings extends React.PureComponent {
+export default class TimeSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/Weather.jsx b/src/components/modals/main/settings/sections/Weather.jsx
index 9a8cb955..3135c45f 100644
--- a/src/components/modals/main/settings/sections/Weather.jsx
+++ b/src/components/modals/main/settings/sections/Weather.jsx
@@ -1,11 +1,11 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Switch from '../Switch';
import Radio from '../Radio';
import Checkbox from '../Checkbox';
import Slider from '../Slider';
-export default class TimeSettings extends React.PureComponent {
+export default class TimeSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/background/Background.jsx b/src/components/modals/main/settings/sections/background/Background.jsx
index 9442dfd9..594d856a 100644
--- a/src/components/modals/main/settings/sections/background/Background.jsx
+++ b/src/components/modals/main/settings/sections/background/Background.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../../../../modules/helpers/eventbus';
@@ -13,7 +13,7 @@ import ColourSettings from './Colour';
import { toast } from 'react-toastify';
-export default class BackgroundSettings extends React.PureComponent {
+export default class BackgroundSettings extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/main/settings/sections/background/Colour.jsx b/src/components/modals/main/settings/sections/background/Colour.jsx
index c892a1ef..ea917923 100644
--- a/src/components/modals/main/settings/sections/background/Colour.jsx
+++ b/src/components/modals/main/settings/sections/background/Colour.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent, Fragment } from 'react';
import { ColorPicker } from 'react-color-gradient-picker';
@@ -10,7 +10,7 @@ import { toast } from 'react-toastify';
import 'react-color-gradient-picker/dist/index.css';
import '../../../scss/settings/react-color-picker-gradient-picker-custom-styles.scss';
-export default class ColourSettings extends React.PureComponent {
+export default class ColourSettings extends PureComponent {
DefaultGradientSettings = { angle: '180', gradient: [{ colour: '#ffb032', stop: 0 }], type: 'linear' };
GradientPickerInitalState = undefined;
@@ -166,10 +166,10 @@ export default class ColourSettings extends React.PureComponent {
} else {
gradientInputs = this.state.gradientSettings.gradient.map((g, i) => {
return (
-
+
this.onGradientChange(event, i)} value={g.colour}>
-
+
);
});
}
diff --git a/src/components/modals/main/tabs/Settings.jsx b/src/components/modals/main/tabs/Settings.jsx
index 3aebd92e..60dc2dce 100644
--- a/src/components/modals/main/tabs/Settings.jsx
+++ b/src/components/modals/main/tabs/Settings.jsx
@@ -18,11 +18,7 @@ import Tabs from './backend/Tabs';
export default function Settings() {
const { reminder, sections } = window.language.modals.main.settings;
-
- let display = 'none';
- if (localStorage.getItem('showReminder') === 'true') {
- display = 'block';
- }
+ const display = (localStorage.getItem('showReminder') === 'true') ? 'block' : 'none';
return (
<>
@@ -38,7 +34,7 @@ export default function Settings() {
-
+
diff --git a/src/components/modals/main/tabs/backend/Tab.jsx b/src/components/modals/main/tabs/backend/Tab.jsx
index 2757bdc2..b6760761 100644
--- a/src/components/modals/main/tabs/backend/Tab.jsx
+++ b/src/components/modals/main/tabs/backend/Tab.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { memo } from 'react';
// Navbar
import Settings from '@material-ui/icons/SettingsRounded';
@@ -96,4 +96,4 @@ function Tab(props) {
);
}
-export default React.memo(Tab);
+export default memo(Tab);
diff --git a/src/components/modals/main/tabs/backend/Tabs.jsx b/src/components/modals/main/tabs/backend/Tabs.jsx
index 63e33562..56d84304 100644
--- a/src/components/modals/main/tabs/backend/Tabs.jsx
+++ b/src/components/modals/main/tabs/backend/Tabs.jsx
@@ -1,9 +1,9 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Tab from './Tab';
import ErrorBoundary from '../../../ErrorBoundary';
-export default class Tabs extends React.PureComponent {
+export default class Tabs extends PureComponent {
constructor(props) {
super(props);
diff --git a/src/components/modals/welcome/Welcome.jsx b/src/components/modals/welcome/Welcome.jsx
index 20ec29dc..5a5e7254 100644
--- a/src/components/modals/welcome/Welcome.jsx
+++ b/src/components/modals/welcome/Welcome.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../modules/helpers/eventbus';
@@ -7,7 +7,7 @@ import ProgressBar from './ProgressBar';
import './welcome.scss';
-export default class WelcomeModal extends React.PureComponent {
+export default class WelcomeModal extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/modals/welcome/WelcomeSections.jsx b/src/components/modals/welcome/WelcomeSections.jsx
index 35f1a4cb..94994c8f 100644
--- a/src/components/modals/welcome/WelcomeSections.jsx
+++ b/src/components/modals/welcome/WelcomeSections.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Radio from '../main/settings/Radio';
import Checkbox from '../main/settings/Checkbox';
@@ -9,13 +9,13 @@ import AutoIcon from '@material-ui/icons/AutoAwesome';
import LightModeIcon from '@material-ui/icons/LightMode';
import DarkModeIcon from '@material-ui/icons/DarkMode';
-import SettingsFunctions from '../../../modules/helpers/settings';
-import SettingsFunctionsModal from '../../../modules/helpers/settings/modals';
+import { loadSettings } from '../../../modules/helpers/settings';
+import { importSettings } from '../../../modules/helpers/settings/modals';
const languages = require('../../../modules/languages.json');
const default_settings = require('../../../modules/default_settings.json');
-export default class WelcomeSections extends React.PureComponent {
+export default class WelcomeSections extends PureComponent {
constructor() {
super();
this.state = {
@@ -40,7 +40,7 @@ export default class WelcomeSections extends React.PureComponent {
});
localStorage.setItem('theme', type);
- SettingsFunctions.loadSettings(true);
+ loadSettings(true);
}
getSetting(name) {
@@ -49,7 +49,7 @@ export default class WelcomeSections extends React.PureComponent {
}
importSettings(e) {
- SettingsFunctionsModal.importSettings(e);
+ importSettings(e);
let settings = [];
const data = JSON.parse(e.target.result);
diff --git a/src/components/widgets/Widgets.jsx b/src/components/widgets/Widgets.jsx
index 8e39d98c..0cd0be91 100644
--- a/src/components/widgets/Widgets.jsx
+++ b/src/components/widgets/Widgets.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent, Fragment, Suspense, lazy } from 'react';
import EventBus from '../../modules/helpers/eventbus';
@@ -9,10 +9,10 @@ import Search from './search/Search';
import QuickLinks from './quicklinks/QuickLinks';
import Date from './time/Date';
-const Weather = React.lazy(() => import('./weather/Weather'));
+const Weather = lazy(() => import('./weather/Weather'));
const renderLoader = () => <>>;
-export default class Widgets extends React.PureComponent {
+export default class Widgets extends PureComponent {
constructor() {
super();
this.state = {
@@ -53,7 +53,7 @@ export default class Widgets extends React.PureComponent {
if (this.state.order) {
this.state.order.forEach((element) => {
- elements.push({this.widgets[element]});
+ elements.push({this.widgets[element]});
});
} else {
// prevent error
@@ -62,11 +62,11 @@ export default class Widgets extends React.PureComponent {
return (
-
+
{this.enabled('searchBar') ? : null}
{elements}
{this.enabled('weatherEnabled') && (localStorage.getItem('offlineMode') === 'false') ? : null}
-
+
);
}
diff --git a/src/components/widgets/background/Favourite.jsx b/src/components/widgets/background/Favourite.jsx
index f72f176f..3910d1d5 100644
--- a/src/components/widgets/background/Favourite.jsx
+++ b/src/components/widgets/background/Favourite.jsx
@@ -1,11 +1,11 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Tooltip from '../../helpers/tooltip/Tooltip';
import StarIcon from '@material-ui/icons/Star';
import StarIcon2 from '@material-ui/icons/StarBorder';
-export default class Favourite extends React.PureComponent {
+export default class Favourite extends PureComponent {
buttons = {
favourited: this.favourite()} className='topicons' />,
unfavourited: this.favourite()} className='topicons' />
diff --git a/src/components/widgets/background/Maximise.jsx b/src/components/widgets/background/Maximise.jsx
index 49c2e904..04799560 100644
--- a/src/components/widgets/background/Maximise.jsx
+++ b/src/components/widgets/background/Maximise.jsx
@@ -1,10 +1,10 @@
-import React from 'react';
+import { PureComponent } from 'react';
import Tooltip from '../../helpers/tooltip/Tooltip';
import FullscreenIcon from '@material-ui/icons/Fullscreen';
-export default class Maximise extends React.PureComponent {
+export default class Maximise extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/background/PhotoInformation.jsx b/src/components/widgets/background/PhotoInformation.jsx
index fa5970f8..9419c317 100644
--- a/src/components/widgets/background/PhotoInformation.jsx
+++ b/src/components/widgets/background/PhotoInformation.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { useState } from 'react';
import Info from '@material-ui/icons/Info';
import Location from '@material-ui/icons/LocationOn';
@@ -24,8 +24,8 @@ const downloadImage = async (info) => {
};
export default function PhotoInformation(props) {
- const [width, setWidth] = React.useState(0);
- const [height, setHeight] = React.useState(0);
+ const [width, setWidth] = useState(0);
+ const [height, setHeight] = useState(0);
const language = window.language.widgets.background;
diff --git a/src/components/widgets/greeting/Greeting.jsx b/src/components/widgets/greeting/Greeting.jsx
index 175aae6e..3f32eb3f 100644
--- a/src/components/widgets/greeting/Greeting.jsx
+++ b/src/components/widgets/greeting/Greeting.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import { utcToZonedTime } from 'date-fns-tz';
import EventBus from '../../../modules/helpers/eventbus';
@@ -7,7 +7,7 @@ import dtf from '../../../modules/helpers/date';
import './greeting.scss';
-export default class Greeting extends React.PureComponent {
+export default class Greeting extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/navbar/Navbar.jsx b/src/components/widgets/navbar/Navbar.jsx
index 47f9d010..57eb85ac 100644
--- a/src/components/widgets/navbar/Navbar.jsx
+++ b/src/components/widgets/navbar/Navbar.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import RefreshIcon from '@material-ui/icons/RefreshRounded';
import Gear from '@material-ui/icons/SettingsRounded';
@@ -14,7 +14,7 @@ import EventBus from '../../../modules/helpers/eventbus';
import './scss/index.scss';
-export default class Navbar extends React.PureComponent {
+export default class Navbar extends PureComponent {
componentDidMount() {
EventBus.on('refresh', (data) => {
if (data === 'navbar') {
diff --git a/src/components/widgets/navbar/Notes.jsx b/src/components/widgets/navbar/Notes.jsx
index 29fca230..d1a9fe61 100644
--- a/src/components/widgets/navbar/Notes.jsx
+++ b/src/components/widgets/navbar/Notes.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import TextareaAutosize from '@material-ui/core/TextareaAutosize';
@@ -8,7 +8,7 @@ import Pin from '@material-ui/icons/PushPin';
import { toast } from 'react-toastify';
-export default class Notes extends React.PureComponent {
+export default class Notes extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/quicklinks/QuickLinks.jsx b/src/components/widgets/quicklinks/QuickLinks.jsx
index 2f297afe..5b9d8122 100644
--- a/src/components/widgets/quicklinks/QuickLinks.jsx
+++ b/src/components/widgets/quicklinks/QuickLinks.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../modules/helpers/eventbus';
@@ -7,7 +7,7 @@ import TextareaAutosize from '@material-ui/core/TextareaAutosize';
import './quicklinks.scss';
-export default class QuickLinks extends React.PureComponent {
+export default class QuickLinks extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/quote/Quote.jsx b/src/components/widgets/quote/Quote.jsx
index a9a1f2f2..b63b583e 100644
--- a/src/components/widgets/quote/Quote.jsx
+++ b/src/components/widgets/quote/Quote.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../modules/helpers/eventbus';
import Interval from '../../../modules/helpers/interval';
@@ -12,7 +12,7 @@ import { toast } from 'react-toastify';
import './quote.scss';
-export default class Quote extends React.PureComponent {
+export default class Quote extends PureComponent {
buttons = {
tweet: this.tweetQuote()} />,
copy: this.copyQuote()} />,
diff --git a/src/components/widgets/search/Search.jsx b/src/components/widgets/search/Search.jsx
index ef5ab9dd..b2db9edf 100644
--- a/src/components/widgets/search/Search.jsx
+++ b/src/components/widgets/search/Search.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../modules/helpers/eventbus';
@@ -12,7 +12,7 @@ import './search.scss';
const searchEngines = require('./search_engines.json');
const autocompleteProviders = require('./autocomplete_providers.json');
-export default class Search extends React.PureComponent {
+export default class Search extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/time/Clock.jsx b/src/components/widgets/time/Clock.jsx
index 0b220a86..55c06823 100644
--- a/src/components/widgets/time/Clock.jsx
+++ b/src/components/widgets/time/Clock.jsx
@@ -1,14 +1,14 @@
-import React from 'react';
+import { PureComponent, Suspense, lazy } from 'react';
import { utcToZonedTime } from 'date-fns-tz';
import EventBus from '../../../modules/helpers/eventbus';
import './clock.scss';
-const Analog = React.lazy(() => import('react-clock'));
+const Analog = lazy(() => import('react-clock'));
const renderLoader = () => <>>;
-export default class Clock extends React.PureComponent {
+export default class Clock extends PureComponent {
constructor() {
super();
@@ -123,7 +123,7 @@ export default class Clock extends React.PureComponent {
if (localStorage.getItem('timeType') === 'analogue') {
clockHTML = (
-
+
-
+
);
}
diff --git a/src/components/widgets/time/Date.jsx b/src/components/widgets/time/Date.jsx
index 6c068017..dcc717f8 100644
--- a/src/components/widgets/time/Date.jsx
+++ b/src/components/widgets/time/Date.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import { utcToZonedTime } from 'date-fns-tz';
import EventBus from '../../../modules/helpers/eventbus';
@@ -7,7 +7,7 @@ import dtf from '../../../modules/helpers/date';
import './date.scss';
-export default class DateWidget extends React.PureComponent {
+export default class DateWidget extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/components/widgets/weather/Weather.jsx b/src/components/widgets/weather/Weather.jsx
index 7f5ecdc7..3f8871bd 100644
--- a/src/components/widgets/weather/Weather.jsx
+++ b/src/components/widgets/weather/Weather.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { PureComponent } from 'react';
import EventBus from '../../../modules/helpers/eventbus';
@@ -8,7 +8,7 @@ import { WiHumidity, WiWindy, WiBarometer, WiCloud } from 'weather-icons-react';
import './weather.scss';
-export default class Weather extends React.PureComponent {
+export default class Weather extends PureComponent {
constructor() {
super();
this.state = {
diff --git a/src/index.js b/src/index.js
index 85305036..52e58f5a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,4 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
+import { render } from 'react-dom';
import App from './App';
import * as Constants from './modules/constants';
@@ -12,8 +11,6 @@ import 'react-toastify/dist/ReactToastify.min.css';
import Stats from './modules/helpers/stats';
// language
-import merge from '@material-ui/utils/esm/deepmerge';
-
const languagecode = localStorage.getItem('language') || 'en_GB';
// we set things to window. so we avoid passing the translation strings as props to each component
@@ -24,7 +21,7 @@ if (languagecode === 'en') {
}
// 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`));
+window.language = require(`./translations/${window.languagecode}.json`);
// set html language tag
if (window.languagecode !== 'en_GB' || window.languagecode !== 'en_US') {
@@ -42,7 +39,7 @@ if (localStorage.getItem('stats') === 'true') {
}
}
-ReactDOM.render(
+render(
,
document.getElementById('root')
);
diff --git a/src/modules/helpers/date.js b/src/modules/helpers/date.js
index ede419a5..4990162a 100644
--- a/src/modules/helpers/date.js
+++ b/src/modules/helpers/date.js
@@ -1,18 +1,16 @@
-export default class Date {
- static nth(d) {
- if (d > 3 && d < 21) {
- return d + 'th';
- }
+export default function nth(d) {
+ if (d > 3 && d < 21) {
+ return d + 'th';
+ }
- switch (d % 10) {
- case 1:
- return d + 'st';
- case 2:
- return d + 'nd';
- case 3:
- return d + 'rd';
- default:
- return d + 'th';
- }
+ switch (d % 10) {
+ case 1:
+ return d + 'st';
+ case 2:
+ return d + 'nd';
+ case 3:
+ return d + 'rd';
+ default:
+ return d + 'th';
}
}
diff --git a/src/modules/helpers/marketplace.js b/src/modules/helpers/marketplace.js
index 06ada89a..025c7e55 100644
--- a/src/modules/helpers/marketplace.js
+++ b/src/modules/helpers/marketplace.js
@@ -1,101 +1,99 @@
import EventBus from './eventbus';
-export default class MarketplaceFunctions {
- // based on https://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
- static urlParser(input) {
- const urlPattern = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_+.~#?&//=]*)/;
- return input.replace(urlPattern, '$&');
- }
-
- static uninstall(type, name) {
- switch (type) {
- case 'settings':
- const oldSettings = JSON.parse(localStorage.getItem('backup_settings'));
- localStorage.clear();
- oldSettings.forEach((item) => {
- localStorage.setItem(item.name, item.value);
- });
- break;
- case 'quotes':
- localStorage.removeItem('quote_packs');
- localStorage.removeItem('quoteAPI');
- localStorage.setItem('quoteType', localStorage.getItem('oldQuoteType'));
- localStorage.removeItem('oldQuoteType');
- EventBus.dispatch('refresh', 'marketplacequoteuninstall');
- break;
- case 'photos':
- localStorage.removeItem('photo_packs');
- localStorage.setItem('backgroundType', localStorage.getItem('oldBackgroundType'));
- localStorage.removeItem('oldBackgroundType');
- EventBus.dispatch('refresh', 'marketplacebackgrounduninstall');
- break;
- default:
- break;
- }
-
- let installed = JSON.parse(localStorage.getItem('installed'));
- for (let i = 0; i < installed.length; i++) {
- if (installed[i].name === name) {
- installed.splice(i, 1);
- break;
- }
- }
- localStorage.setItem('installed', JSON.stringify(installed));
- }
-
- static install(type, input, sideload) {
- switch (type) {
- case 'settings':
- localStorage.removeItem('backup_settings');
-
- let oldSettings = [];
- Object.keys(localStorage).forEach((key) => {
- oldSettings.push({
- name: key,
- value: localStorage.getItem(key)
- });
- });
-
- localStorage.setItem('backup_settings', JSON.stringify(oldSettings));
- Object.keys(input.settings).forEach((key) => {
- localStorage.setItem(key, input.settings[key]);
- });
- break;
-
- case 'photos':
- localStorage.setItem('photo_packs', JSON.stringify(input.photos));
- localStorage.setItem('oldBackgroundType', localStorage.getItem('backgroundType'));
- localStorage.setItem('backgroundType', 'photo_pack');
- EventBus.dispatch('refresh', 'background');
- break;
-
- case 'quotes':
- if (input.quote_api) {
- localStorage.setItem('quoteAPI', JSON.stringify(input.quote_api));
- }
-
- localStorage.setItem('quote_packs', JSON.stringify(input.quotes));
- localStorage.setItem('oldQuoteType', localStorage.getItem('quoteType'));
- localStorage.setItem('quoteType', 'quote_pack');
- EventBus.dispatch('refresh', 'quote');
- break;
- default:
- break;
- }
-
- const installed = JSON.parse(localStorage.getItem('installed'));
-
- if (sideload) {
- installed.push({
- content: {
- updated: 'Unpublished',
- data: input
- }
- });
- } else {
- installed.push(input);
- }
-
- localStorage.setItem('installed', JSON.stringify(installed));
- }
+// based on https://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
+export function urlParser(input) {
+ const urlPattern = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_+.~#?&//=]*)/;
+ return input.replace(urlPattern, '$&');
+}
+
+export function uninstall(type, name) {
+ switch (type) {
+ case 'settings':
+ const oldSettings = JSON.parse(localStorage.getItem('backup_settings'));
+ localStorage.clear();
+ oldSettings.forEach((item) => {
+ localStorage.setItem(item.name, item.value);
+ });
+ break;
+ case 'quotes':
+ localStorage.removeItem('quote_packs');
+ localStorage.removeItem('quoteAPI');
+ localStorage.setItem('quoteType', localStorage.getItem('oldQuoteType'));
+ localStorage.removeItem('oldQuoteType');
+ EventBus.dispatch('refresh', 'marketplacequoteuninstall');
+ break;
+ case 'photos':
+ localStorage.removeItem('photo_packs');
+ localStorage.setItem('backgroundType', localStorage.getItem('oldBackgroundType'));
+ localStorage.removeItem('oldBackgroundType');
+ EventBus.dispatch('refresh', 'marketplacebackgrounduninstall');
+ break;
+ default:
+ break;
+ }
+
+ let installed = JSON.parse(localStorage.getItem('installed'));
+ for (let i = 0; i < installed.length; i++) {
+ if (installed[i].name === name) {
+ installed.splice(i, 1);
+ break;
+ }
+ }
+ localStorage.setItem('installed', JSON.stringify(installed));
+}
+
+export function install(type, input, sideload) {
+ switch (type) {
+ case 'settings':
+ localStorage.removeItem('backup_settings');
+
+ let oldSettings = [];
+ Object.keys(localStorage).forEach((key) => {
+ oldSettings.push({
+ name: key,
+ value: localStorage.getItem(key)
+ });
+ });
+
+ localStorage.setItem('backup_settings', JSON.stringify(oldSettings));
+ Object.keys(input.settings).forEach((key) => {
+ localStorage.setItem(key, input.settings[key]);
+ });
+ break;
+
+ case 'photos':
+ localStorage.setItem('photo_packs', JSON.stringify(input.photos));
+ localStorage.setItem('oldBackgroundType', localStorage.getItem('backgroundType'));
+ localStorage.setItem('backgroundType', 'photo_pack');
+ EventBus.dispatch('refresh', 'background');
+ break;
+
+ case 'quotes':
+ if (input.quote_api) {
+ localStorage.setItem('quoteAPI', JSON.stringify(input.quote_api));
+ }
+
+ localStorage.setItem('quote_packs', JSON.stringify(input.quotes));
+ localStorage.setItem('oldQuoteType', localStorage.getItem('quoteType'));
+ localStorage.setItem('quoteType', 'quote_pack');
+ EventBus.dispatch('refresh', 'quote');
+ break;
+ default:
+ break;
+ }
+
+ const installed = JSON.parse(localStorage.getItem('installed'));
+
+ if (sideload) {
+ installed.push({
+ content: {
+ updated: 'Unpublished',
+ data: input
+ }
+ });
+ } else {
+ installed.push(input);
+ }
+
+ localStorage.setItem('installed', JSON.stringify(installed));
}
diff --git a/src/modules/helpers/settings/index.js b/src/modules/helpers/settings/index.js
index 9dcf26a0..44cf02cf 100644
--- a/src/modules/helpers/settings/index.js
+++ b/src/modules/helpers/settings/index.js
@@ -3,144 +3,142 @@ import experimentalInit from '../experimental';
const defaultSettings = require('../../default_settings.json');
const languages = require('../../languages.json');
-export default class SettingsFunctions {
- static setDefaultSettings(reset) {
- localStorage.clear();
- defaultSettings.forEach((element) => localStorage.setItem(element.name, element.value));
+export function setDefaultSettings(reset) {
+ localStorage.clear();
+ defaultSettings.forEach((element) => localStorage.setItem(element.name, element.value));
- // Languages
- const languageCodes = languages.map(({ value }) => value);
- const browserLanguage = (navigator.languages && navigator.languages.find((lang) => lang.replace('-', '_') && languageCodes.includes(lang))) || navigator.language.replace('-', '_');
+ // Languages
+ const languageCodes = languages.map(({ value }) => value);
+ const browserLanguage = (navigator.languages && navigator.languages.find((lang) => lang.replace('-', '_') && languageCodes.includes(lang))) || navigator.language.replace('-', '_');
- if (languageCodes.includes(browserLanguage)) {
- localStorage.setItem('language', browserLanguage);
- } else {
- localStorage.setItem('language', 'en_GB');
- }
-
- localStorage.setItem('tabName', window.language.tabname);
-
- if (reset) {
- localStorage.setItem('showWelcome', false);
- }
-
- // Finally we set this to true so it doesn't run the function on every load
- localStorage.setItem('firstRun', true);
+ if (languageCodes.includes(browserLanguage)) {
+ localStorage.setItem('language', browserLanguage);
+ } else {
+ localStorage.setItem('language', 'en_GB');
}
- static loadSettings(hotreload) {
- document.getElementById('widgets').style.zoom = localStorage.getItem('widgetzoom') + '%';
+ localStorage.setItem('tabName', window.language.tabname);
- const theme = localStorage.getItem('theme');
- switch (theme) {
- case 'dark':
- document.body.classList.add('dark');
- break;
- case 'auto':
- if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
- document.body.classList.add('dark');
- } else {
- document.body.classList.remove('dark');
- }
- break;
- default:
- document.body.classList.remove('dark');
- }
-
- const tabName = localStorage.getItem('tabName') || window.language.tabname;
- document.title = tabName;
-
- if (hotreload === true) {
- const custom = ['customcss', 'customjs', 'customfont'];
- custom.forEach((element) => {
- try {
- document.head.removeChild(document.getElementById(element));
- } catch (e) {
- // Disregard exception
- }
- });
- }
-
- const css = localStorage.getItem('customcss');
- if (css) {
- document.head.insertAdjacentHTML('beforeend', '');
- }
-
- const font = localStorage.getItem('font');
- if (font) {
- let url = '';
- if (localStorage.getItem('fontGoogle') === 'true') {
- url = `@import url('https://fonts.googleapis.com/css2?family=${font}&display=swap');`;
- }
-
- document.head.insertAdjacentHTML('beforeend', `
-
- `);
- }
-
- // everything below this either doesn't support hot reload (custom js) or shouldn't run on a hot reload event
- if (hotreload === true) {
- return;
- }
-
- const js = localStorage.getItem('customjs');
- if (js) {
- try {
- // eslint-disable-next-line no-eval
- eval(js);
- } catch (e) {
- console.error('Failed to run custom JS: ', e);
- }
- }
-
- if (localStorage.getItem('experimental') === 'true') {
- experimentalInit();
- }
-
- // easter egg
- console.log(`
- █████████████████████████████████████████████████████████████
- ██ ██
- ██ ███ ███ ██ ██ ███████ ██
- ██ ████ ████ ██ ██ ██ ██
- ██ ██ ████ ██ ██ ██ █████ ██
- ██ ██ ██ ██ ██ ██ ██ ██
- ██ ██ ██ ██████ ███████ ██
- ██ ██
- ██ ██
- ██ Copyright 2018-${new Date().getFullYear()} The Mue Authors ██
- ██ GitHub: https://github.com/mue/mue ██
- ██ ██
- ██ Thank you for using Mue! ██
- ██ Feedback: hello@muetab.com ██
- █████████████████████████████████████████████████████████████
-`);
+ if (reset) {
+ localStorage.setItem('showWelcome', false);
}
- // in a nutshell, this function saves all of the current settings, resets them, sets the defaults and then overrides
- // the new settings with the old saved messages where they exist
- static moveSettings() {
- if (Object.keys(localStorage).length === 0) {
- return this.setDefaultSettings();
- }
-
- let settings = {};
- Object.keys(localStorage).forEach((key) => {
- settings[key] = localStorage.getItem(key);
- });
-
- localStorage.clear();
-
- this.setDefaultSettings();
- Object.keys(settings).forEach((key) => {
- localStorage.setItem(key, settings[key]);
- });
- }
+ // Finally we set this to true so it doesn't run the function on every load
+ localStorage.setItem('firstRun', true);
}
+
+export function loadSettings(hotreload) {
+ document.getElementById('widgets').style.zoom = localStorage.getItem('widgetzoom') + '%';
+
+ const theme = localStorage.getItem('theme');
+ switch (theme) {
+ case 'dark':
+ document.body.classList.add('dark');
+ break;
+ case 'auto':
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ document.body.classList.add('dark');
+ } else {
+ document.body.classList.remove('dark');
+ }
+ break;
+ default:
+ document.body.classList.remove('dark');
+ }
+
+ const tabName = localStorage.getItem('tabName') || window.language.tabname;
+ document.title = tabName;
+
+ if (hotreload === true) {
+ const custom = ['customcss', 'customjs', 'customfont'];
+ custom.forEach((element) => {
+ try {
+ document.head.removeChild(document.getElementById(element));
+ } catch (e) {
+ // Disregard exception
+ }
+ });
+ }
+
+ const css = localStorage.getItem('customcss');
+ if (css) {
+ document.head.insertAdjacentHTML('beforeend', '');
+ }
+
+ const font = localStorage.getItem('font');
+ if (font) {
+ let url = '';
+ if (localStorage.getItem('fontGoogle') === 'true') {
+ url = `@import url('https://fonts.googleapis.com/css2?family=${font}&display=swap');`;
+ }
+
+ document.head.insertAdjacentHTML('beforeend', `
+
+ `);
+ }
+
+ // everything below this either doesn't support hot reload (custom js) or shouldn't run on a hot reload event
+ if (hotreload === true) {
+ return;
+ }
+
+ const js = localStorage.getItem('customjs');
+ if (js) {
+ try {
+ // eslint-disable-next-line no-eval
+ eval(js);
+ } catch (e) {
+ console.error('Failed to run custom JS: ', e);
+ }
+ }
+
+ if (localStorage.getItem('experimental') === 'true') {
+ experimentalInit();
+ }
+
+ // easter egg
+ console.log(`
+█████████████████████████████████████████████████████████████
+██ ██
+██ ███ ███ ██ ██ ███████ ██
+██ ████ ████ ██ ██ ██ ██
+██ ██ ████ ██ ██ ██ █████ ██
+██ ██ ██ ██ ██ ██ ██ ██
+██ ██ ██ ██████ ███████ ██
+██ ██
+██ ██
+██ Copyright 2018-${new Date().getFullYear()} The Mue Authors ██
+██ GitHub: https://github.com/mue/mue ██
+██ ██
+██ Thank you for using Mue! ██
+██ Feedback: hello@muetab.com ██
+█████████████████████████████████████████████████████████████
+`);
+}
+
+// in a nutshell, this function saves all of the current settings, resets them, sets the defaults and then overrides
+// the new settings with the old saved messages where they exist
+export function moveSettings() {
+ if (Object.keys(localStorage).length === 0) {
+ return this.setDefaultSettings();
+ }
+
+ let settings = {};
+ Object.keys(localStorage).forEach((key) => {
+ settings[key] = localStorage.getItem(key);
+ });
+
+ localStorage.clear();
+
+ setDefaultSettings();
+ Object.keys(settings).forEach((key) => {
+ localStorage.setItem(key, settings[key]);
+ });
+}
\ No newline at end of file
diff --git a/src/modules/helpers/settings/modals.js b/src/modules/helpers/settings/modals.js
index 38c88e19..82675040 100644
--- a/src/modules/helpers/settings/modals.js
+++ b/src/modules/helpers/settings/modals.js
@@ -1,6 +1,6 @@
import { toast } from 'react-toastify';
-const saveFile = (data, filename = 'file') => {
+export function saveFile(data, filename = 'file') {
if (typeof data === 'object') {
data = JSON.stringify(data, undefined, 4);
}
@@ -17,28 +17,22 @@ const saveFile = (data, filename = 'file') => {
a.dispatchEvent(e);
};
-export default class ModalSettingsFunctions {
- static exportSettings() {
- let settings = {};
- Object.keys(localStorage).forEach((key) => {
- settings[key] = localStorage.getItem(key);
- });
- saveFile(settings, 'mue-settings.json');
- window.stats.postEvent('tab', 'Settings exported');
- }
+export function exportSettings() {
+ let settings = {};
+ Object.keys(localStorage).forEach((key) => {
+ settings[key] = localStorage.getItem(key);
+ });
+ saveFile(settings, 'mue-settings.json');
+ window.stats.postEvent('tab', 'Settings exported');
+}
- static saveFile(data, filename) {
- saveFile(data, filename);
- }
+export function importSettings(e) {
+ const content = JSON.parse(e.target.result);
- static importSettings(e) {
- const content = JSON.parse(e.target.result);
+ Object.keys(content).forEach((key) => {
+ localStorage.setItem(key, content[key]);
+ });
- Object.keys(content).forEach((key) => {
- localStorage.setItem(key, content[key]);
- });
-
- toast(window.language.toasts.imported);
- window.stats.postEvent('tab', 'Settings imported');
- }
-}
\ No newline at end of file
+ toast(window.language.toasts.imported);
+ window.stats.postEvent('tab', 'Settings imported');
+}