import { useState, useEffect, memo } from '@wordpress/element';
import {
RangeControl,
Button,
Flex,
FlexBlock,
FlexItem,
Dashicon
} from '@wordpress/components';
import DeviceControl from './DeviceControl';
import UnitField from './UnitField';
import { usePreviewedDevice } from '../_hooks';
import { __, sprintf } from '@wordpress/i18n';
/**
* responsiveRangeControl.
*/
type Props = {
// settings: {
// [key in device]: {
// get: () => string[]
// set: (a:any) => void
// }
// },
values: RangeControlDeviceValue[],
defaults: RangeControlDeviceValue[],
devices: devices,
unitData: unitData[],
label: string,
unitOptions: unitOptions,
onChange: (newValues: {[key in device]: string}) => void
}
export default function ApuraRangeControl({
values,
defaults,
devices,
unitData,
label,
unitOptions,
onChange
}: Props) {
// console.log(values);
const [rangeValues, setRangeValues] = useState(values || defaults);
const { previewedDevice, setPreviewedDevice, handleDeviceClick } = usePreviewedDevice();
useEffect(() => {
// console.log('currentValues', rangeValues);
const cssValues: {[key in device]: string} = {desktop: '', tablet:'', mobile: ''};
// wp.customize API Set value.
rangeValues.forEach(rangeValue => {
const _device = rangeValue.device;
// console.log(rangeValue.number);
let value = '';
if (rangeValue.number) {
// unitが「-」の場合はunitなし。
let unit = rangeValue.unit === '-' ? '' : rangeValue.unit;
value = String(rangeValue.number) + unit;
}
// console.log(value);
cssValues[_device] = value;
});
onChange(cssValues);
}, [rangeValues]);
// デバイス毎にスライダーの変更イベント.
function handleNumberChange(newNum: number|undefined, device: device) {
const newValues = rangeValues.map((_values, i) =>{
if (_values.device === device) {
// Return a new number
return {
..._values,
number: newNum,
};
} else {
// No change
return _values;
}
});
// Re-render with the new array
setRangeValues(newValues);
}
// デバイス毎にユニットの変更イベント.
const handleUnitChange: handleUnitChange = function (newUnit: string, device: device) {
const newValues = rangeValues.map((_values, i) => {
if (_values.device === device) {
let currentUnitData: unitData = unitData.find((item: unitData) => item.value === newUnit) || {value: ''};
// ユニットありで変えた場合にmax以上の値だった場合はmax値にnumberを変える.
let _number = _values.number;
if (currentUnitData?.max &&_values?.number && _values.number > currentUnitData.max) {
_number = currentUnitData.max;
}
// Return a new unit
return {
..._values,
number: _number,
unit: newUnit,
min: currentUnitData?.min || 0,
max: currentUnitData?.max || 100,
step: currentUnitData?.step || 1,
};
} else {
// No change
return _values;
}
});
// Re-render with the new array
setRangeValues(newValues);
}
// デバイス毎にリセットする.
function handleResetClick(device: device) {
const newValues = rangeValues.map((_values, i) =>{
if (_values.device === device) {
const _defaultData = defaults.find((item) => item.device === device);
// Return default values.
return {
..._values,
number: _defaultData?.number,
unit: _defaultData?.unit || '',
min: _defaultData?.min || 0,
max: _defaultData?.max || 100,
};
} else {
// No change
return _values;
}
});
// Re-render with the new array
setRangeValues(newValues);
}
/**
* Range control field.
*
* @param {Object} rangeValue
* @returns {React.ReactElement}
*/
const rangeField = (rangeValue: RangeControlDeviceValue) => {
// const step = rangeValue.unit && rangeValue.unit !== 'px' ? 0.1 : 1;
return(