diff --git a/package.json b/package.json index 2b1e6bef..c47582d0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "fontsource-lexend-deca": "^3.0.10", "fontsource-roboto": "^3.0.3", "react": "17.0.1", + "react-beforeunload": "^2.4.0", "react-clock": "^2.4.0", "react-color-gradient-picker": "^0.1.2", "react-date-picker": "^8.0.5", diff --git a/src/components/modals/settings/FileUpload.jsx b/src/components/modals/settings/FileUpload.jsx new file mode 100644 index 00000000..955d3762 --- /dev/null +++ b/src/components/modals/settings/FileUpload.jsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { toast } from 'react-toastify'; + +export default class FileUpload extends React.PureComponent { + componentDidMount() { + document.getElementById(this.props.id).onchange = (e) => { + const reader = new FileReader(); + const file = e.target.files[0]; + + if (this.props.type === 'settings') reader.readAsText(file, 'UTF-8'); + else { // file upload + if (file.size > 2000000) return toast('File is over 2MB'); + reader.readAsDataURL(file); + } + reader.addEventListener('load', (e) => this.props.loadFunction(e)); + }; + } + + render() { + return ; + } +} \ No newline at end of file diff --git a/src/components/modals/settings/sections/BackgroundSettings.jsx b/src/components/modals/settings/sections/BackgroundSettings.jsx index 776f4a6c..9fc8f694 100644 --- a/src/components/modals/settings/sections/BackgroundSettings.jsx +++ b/src/components/modals/settings/sections/BackgroundSettings.jsx @@ -3,9 +3,11 @@ import { toast } from 'react-toastify'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; import Section from '../Section'; +import FileUpload from '../FileUpload'; import { ColorPicker } from 'react-color-gradient-picker'; import hexToRgb from '../../../../modules/helpers/background/hexToRgb'; import rgbToHex from '../../../../modules/helpers/background/rgbToHex'; +import { Beforeunload } from 'react-beforeunload'; import 'react-color-gradient-picker/dist/index.css'; import '../../../../scss/react-color-picker-gradient-picker-custom-styles.scss'; @@ -62,21 +64,6 @@ export default class BackgroundSettings extends React.PureComponent { } componentDidMount() { - document.getElementById('bg-input').onchange = (e) => { - const reader = new FileReader(); - const file = e.target.files[0]; - - if (file.size > 2000000) return toast('File is over 2MB', '#ff0000', '#ffffff'); - - reader.addEventListener('load', (e) => { - localStorage.setItem('customBackground', e.target.result); - document.getElementById('customBackground').src = e.target.result; - document.getElementById('customBackground').value = e.target.result; - }); - - reader.readAsDataURL(file); - }; - const hex = localStorage.getItem('customBackgroundColour'); let gradientSettings = undefined; @@ -150,23 +137,34 @@ export default class BackgroundSettings extends React.PureComponent { return { shown: !state.shown }; - }) + }); + } + + fileUpload(e) { + localStorage.setItem('customBackground', e.target.result); + document.getElementById('customBackground').value = e.target.result; + } + + beforeUnload() { + localStorage.setItem('blur', this.state.blur); + localStorage.setItem('brightness', this.state.brightness); } render() { let colourSettings = null; if (typeof this.state.gradientSettings === 'object') { const gradientHasMoreThanOneColour = this.state.gradientSettings.gradient.length > 1; + let gradientInputs; if (gradientHasMoreThanOneColour) { if (this.GradientPickerInitalState === undefined) this.InitializeColorPickerState(this.state.gradientSettings); gradientInputs = ( - this.onColorPickerChange(color, 'start')} - onChange={(color) => this.onColorPickerChange(color, 'change')} - onEndChange={(color) => this.onColorPickerChange(color, 'end')} - gradient={this.GradientPickerInitalState} - isGradient/> + this.onColorPickerChange(color, 'start')} + onChange={(color) => this.onColorPickerChange(color, 'change')} + onEndChange={(color) => this.onColorPickerChange(color, 'end')} + gradient={this.GradientPickerInitalState} + isGradient /> ); } else { gradientInputs = this.state.gradientSettings.gradient.map((g, i) => { @@ -178,6 +176,7 @@ export default class BackgroundSettings extends React.PureComponent { ); }); } + colourSettings = (
{gradientInputs} @@ -187,6 +186,7 @@ export default class BackgroundSettings extends React.PureComponent {
); } + return (
@@ -202,17 +202,17 @@ export default class BackgroundSettings extends React.PureComponent { name='backgroundapi' id='backgroundAPI' onChange={() => localStorage.setItem('backgroundAPI', document.getElementById('backgroundAPI').value)} > - - + +

    {this.props.language.background.blur} ({this.state.blur}%) this.resetItem('blur')}>{this.props.language.reset}

    - this.setState({ blur: event.target.value })} /> + this.setState({ blur: event.target.value })} />

    {this.props.language.background.brightness} ({this.state.brightness}%) this.resetItem('brightness')}>{this.props.language.reset}

    - this.setState({ brightness: event.target.value })} /> + this.setState({ brightness: event.target.value })} />

    {this.props.language.background.custom_url} this.resetItem('customBackground')}>{this.props.language.reset}

    @@ -221,7 +221,7 @@ export default class BackgroundSettings extends React.PureComponent {

      {this.props.language.background.custom_background} this.resetItem('customBackground')}>{this.props.language.reset}

      - + this.fileUpload(e)} />

      {this.props.language.background.custom_colour} this.resetItem('customBackgroundColour')}>{this.props.language.reset}

      @@ -229,6 +229,7 @@ export default class BackgroundSettings extends React.PureComponent { {this.state.shown && colourSettings}
+ this.beforeUnload()}/>
); } diff --git a/src/components/modals/settings/sections/GreetingSettings.jsx b/src/components/modals/settings/sections/GreetingSettings.jsx index e0986bd6..25e3dbd4 100644 --- a/src/components/modals/settings/sections/GreetingSettings.jsx +++ b/src/components/modals/settings/sections/GreetingSettings.jsx @@ -23,6 +23,10 @@ export default class GreetingSettings extends React.PureComponent { this.setState({ birthday: data }); } + componentDidMount() { + document.getElementById('greetingName').value = localStorage.getItem('greetingName'); + } + render() { return (
diff --git a/src/components/modals/tabs/Settings.jsx b/src/components/modals/tabs/Settings.jsx index 52c5c174..c6b4a421 100644 --- a/src/components/modals/tabs/Settings.jsx +++ b/src/components/modals/tabs/Settings.jsx @@ -3,6 +3,7 @@ import SettingsFunctions from '../../../modules/helpers/settings'; import Checkbox from '../settings/Checkbox'; import Dropdown from '../settings/Dropdown'; import Section from '../settings/Section'; +import FileUpload from '../settings/FileUpload'; import { toast } from 'react-toastify'; import BackgroundSettings from '../settings/sections/BackgroundSettings'; @@ -18,7 +19,6 @@ export default class Settings extends React.PureComponent { componentDidMount() { // Settings - document.getElementById('greetingName').value = localStorage.getItem('greetingName'); document.getElementById('language').value = localStorage.getItem('language'); document.getElementById('customcss').value = localStorage.getItem('customcss'); @@ -26,17 +26,12 @@ export default class Settings extends React.PureComponent { const choices = document.getElementsByClassName('choices'); for (let i = 0; i < choices.length; i++) choices[i].style.backgroundColor = '#2f3542'; } + } - document.getElementById('file-input').onchange = (e) => { // import settings - const reader = new FileReader(); - reader.readAsText(e.target.files[0], 'UTF-8'); - - reader.onload = (readerEvent) => { - const content = JSON.parse(readerEvent.target.result); - for (const key of Object.keys(content)) localStorage.setItem(key, content[key]); - toast(this.props.toastLanguage.imported); - }; - }; + settingsImport(e) { + const content = JSON.parse(e.target.result); + for (const key of Object.keys(content)) localStorage.setItem(key, content[key]); + toast(this.props.toastLanguage.imported); } render() { @@ -98,7 +93,7 @@ export default class Settings extends React.PureComponent { - + this.settingsImport(e)} /> ); } diff --git a/src/modules/helpers/settings.js b/src/modules/helpers/settings.js index e88a9466..c753d3f1 100644 --- a/src/modules/helpers/settings.js +++ b/src/modules/helpers/settings.js @@ -47,8 +47,6 @@ export default class SettingsFunctions { } static saveStuff(hexDisabled) { - localStorage.setItem('blur', document.getElementById('blurRange').value); // this is better than inline onChange for performance - localStorage.setItem('brightness', document.getElementById('brightnessRange').value); localStorage.setItem('greetingName', document.getElementById('greetingName').value); localStorage.setItem('customBackground', document.getElementById('customBackground').value); localStorage.setItem('customcss', document.getElementById('customcss').value);