import React from 'react'; import { toast } from 'react-toastify'; import Checkbox from '../Checkbox'; export default class BackgroundSettings extends React.PureComponent { DefaultGradientSettings = { "angle": "180", "gradient": [{ "colour": this.props.language.background.disabled, "stop": 0 }], "type": "linear" }; constructor(...args) { super(...args); this.state = { blur: 0, brightness: 100, gradientSettings: this.DefaultGradientSettings }; } resetItem(key) { switch (key) { case 'customBackgroundColour': localStorage.setItem('customBackgroundColour', ''); this.setState({ gradientSettings: this.DefaultGradientSettings }); break; case 'customBackground': document.getElementById('customBackground').value = ''; break; case 'blur': localStorage.setItem('blur', 0); this.setState({ blur: 0 }); break; case 'brightness': localStorage.setItem('brightness', 100); this.setState({ blur: 100 }); break; default: toast('resetItem requires a key!'); } toast(this.props.toastLanguage.reset); } 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; if (hex !== '') { try { gradientSettings = JSON.parse(hex); } catch (e) { //Disregard exception. } } if (gradientSettings === undefined) gradientSettings = this.DefaultGradientSettings; this.setState({ blur: localStorage.getItem('blur'), brightness: localStorage.getItem('brightness'), gradientSettings }); document.getElementById('customBackground').value = localStorage.getItem('customBackground'); document.getElementById('backgroundAPI').value = localStorage.getItem('backgroundAPI'); } onGradientChange = (event, index) => { const newValue = event.target.value; const name = event.target.name; this.setState((s) => { const newState = { gradientSettings: { ...s.gradientSettings, gradient: s.gradientSettings.gradient.map((g, i) => i === index ? { ...g, [name]: newValue } : g) } }; return newState; }); } pickFirstColour = (event) => { const value = event.target.value; this.setState({ gradientSettings: { "angle": "180", "gradient": [{ "colour": value, "stop": 0 }], "type": "linear" } }); } addColour = () => { this.setState((s) => { const [lastGradient, ...initGradients] = s.gradientSettings.gradient.reverse(); const newState = { gradientSettings: { ...s.gradientSettings, gradient: [...initGradients, lastGradient, { ...lastGradient, stop: 100 }].sort((a, b) => (a.stop > b.stop) ? 1 : -1) } }; return newState; }); } removeColour = (index) => { this.setState((s) => { const newState = { gradientSettings: { ...s.gradientSettings, gradient: s.gradientSettings.gradient.filter((g, i) => i !== index) } }; return newState; }); } currentGradientSettings = () => { if (typeof this.state.gradientSettings === 'object' && this.state.gradientSettings.gradient.every(g => g.colour !== this.props.language.background.disabled)) { const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b)); return JSON.stringify({ ...this.state.gradientSettings, gradient: [...this.state.gradientSettings.gradient.map(g => { return { ...g, stop: clampNumber(+g.stop, 0, 100) } })].sort((a, b) => (a.stop > b.stop) ? 1 : -1) }); } return this.props.language.background.disabled; } render() { let colourSettings = null; if (typeof this.state.gradientSettings === 'object') { const gradientInputs = this.state.gradientSettings.gradient.map((g, i) => { const gradientHasMoreThanOneColour = this.state.gradientSettings.gradient.length > 1; return (
{gradientHasMoreThanOneColour ? () : null} this.onGradientChange(event, i)} value={g.colour}> {gradientHasMoreThanOneColour ? ( this.onGradientChange(event, i)} /> ) : null}
); }); colourSettings = (
{gradientInputs} {this.state.gradientSettings.gradient[0].colour !== this.props.language.background.disabled ? () : null}
); } return (
); } }