import React from 'react'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; 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 { toast } from 'react-toastify'; import 'react-color-gradient-picker/dist/index.css'; import '../../../../../scss/react-color-picker-gradient-picker-custom-styles.scss'; export default class BackgroundSettings extends React.PureComponent { DefaultGradientSettings = { 'angle': '180', 'gradient': [{ 'colour': window.language.modals.main.settings.sections.background.source.disabled, 'stop': 0 }], 'type': 'linear' }; GradientPickerInitalState = undefined; constructor(...args) { super(...args); this.state = { blur: localStorage.getItem('blur'), brightness: localStorage.getItem('brightness'), customBackground: localStorage.getItem('customBackground') || '', gradientSettings: this.DefaultGradientSettings }; this.language = window.language.modals.main.settings; } resetItem(key) { switch (key) { case 'customBackgroundColour': localStorage.setItem('customBackgroundColour', ''); this.setState({ gradientSettings: this.DefaultGradientSettings }); break; case 'customBackground': localStorage.setItem('customBackground', ''); this.setState({ customBackground: '' }); break; case 'blur': localStorage.setItem('blur', 0); this.setState({ blur: 0 }); break; case 'brightness': localStorage.setItem('brightness', 100); this.setState({ brightness: 100 }); break; default: toast('resetItem requires a key!'); } toast(this.language.toasts.reset); } InitializeColorPickerState(gradientSettings) { this.GradientPickerInitalState = { points: gradientSettings.gradient.map((g) => { const rgb = hexToRgb(g.colour); return { left: +g.stop, red: rgb.red, green: rgb.green, blue: rgb.blue, alpha: 1 }; }), degree: + gradientSettings.angle, type: gradientSettings.type }; } componentDidMount() { 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({ gradientSettings }); } 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; }); } addColour = () => { this.setState((s) => { const [lastGradient, ...initGradients] = s.gradientSettings.gradient.reverse(); const newState = { gradientSettings: { ...s.gradientSettings, gradient: [...initGradients, lastGradient, { 'colour': localStorage.getItem('darkTheme') === 'true' ? '#000000' : '#ffffff', stop: 100 }].sort((a, b) => (a.stop > b.stop) ? 1 : -1) } }; return newState; }); } currentGradientSettings = () => { if (typeof this.state.gradientSettings === 'object' && this.state.gradientSettings.gradient.every(g => g.colour !== this.language.sections.background.source.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.language.sections.background.source.disabled; } onColorPickerChange = (attrs, name) => { if (process.env.NODE_ENV === 'development') { console.log(attrs, name); } this.setState({ gradientSettings: { 'angle': attrs.degree, 'gradient': attrs.points.map((p) => { return { 'colour': '#' + rgbToHex(p.red, p.green, p.blue), 'stop': p.left }}), 'type': attrs.type } }); }; fileUpload(e) { localStorage.setItem('customBackground', e.target.result); this.setState({ customBackground: e.target.result }); } componentDidUpdate() { localStorage.setItem('blur', this.state.blur); localStorage.setItem('brightness', this.state.brightness); localStorage.setItem('customBackground', this.state.customBackground); if (document.getElementById('customBackgroundHex').value !== this.language.sections.background.source.disabled) { localStorage.setItem('customBackgroundColour', document.getElementById('customBackgroundHex').value); } } render() { const { background } = this.language.sections; 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 /> ); } else { gradientInputs = this.state.gradientSettings.gradient.map((g, i) => { return (
this.onGradientChange(event, i)} value={g.colour}>
); }); } colourSettings = (
{gradientInputs} {this.state.gradientSettings.gradient[0].colour !== background.source.disabled && !gradientHasMoreThanOneColour ? () : null }
); } return (

{background.title}

{background.buttons.title}

{background.effects.title}

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

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

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

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

{background.source.title}

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

    this.setState({ customBackground: e.target.value })}>

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

    this.fileUpload(e)} />

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

    {colourSettings}
); } }