import { createElement, useState } from '@wordpress/element' import { __ } from 'ct-i18n' import cls from 'classnames' import OutsideClickHandler from './react-outside-click-handler' import SpacingInput from './ct-spacing/input' export const SPACING_STATE_LINKED = 1 export const SPACING_STATE_INDEPENDENT = 2 export const SPACING_STATE_CUSTOM = 3 const backportLegacySpacing = (legacy) => { if (legacy === 'auto' || legacy === '') { return { value: legacy, unit: '', } } const maybeNumber = parseFloat(legacy) if (isNaN(maybeNumber)) { return { value: '', unit: '', } } return { value: maybeNumber, unit: legacy.toString().replace(maybeNumber.toString(), ''), } } const Spacing = ({ value: maybeLegacyValue, option, onChange }) => { const [isOpen, setIsOpen] = useState(false) const units = [ { unit: 'px' }, { unit: '%' }, { unit: 'em' }, { unit: 'rem' }, { unit: 'pt' }, ] let value = maybeLegacyValue.values ? maybeLegacyValue : { values: [ backportLegacySpacing(maybeLegacyValue.top), backportLegacySpacing(maybeLegacyValue.right), backportLegacySpacing(maybeLegacyValue.bottom), backportLegacySpacing(maybeLegacyValue.left), ], custom: '', state: maybeLegacyValue.linked ? SPACING_STATE_LINKED : SPACING_STATE_INDEPENDENT, } const currentUnit = value.values.find((v) => v.value !== 'auto').unit || units[0].unit return (
{value.state !== SPACING_STATE_CUSTOM && ( { e.preventDefault() if (value.state === SPACING_STATE_LINKED) { onChange({ ...value, state: SPACING_STATE_INDEPENDENT, }) return } const futureValue = value.values.find((v) => { return v.value !== 'auto' && v.value !== '' }) || { value: '', unit: '', } onChange({ ...value, values: [ value.values[0].value === 'auto' ? value.values[0] : futureValue, value.values[1].value === 'auto' ? value.values[1] : futureValue, value.values[2].value === 'auto' ? value.values[2] : futureValue, value.values[3].value === 'auto' ? value.values[3] : futureValue, ], state: SPACING_STATE_LINKED, }) }}> {value.state === SPACING_STATE_LINKED ? ( ) : ( )} )}
setIsOpen(!isOpen)} className="ct-current-value" data-unit={ value.state === SPACING_STATE_CUSTOM ? 'custom' : currentUnit }> {value.state === SPACING_STATE_CUSTOM ? __('Custom', 'blocksy') : currentUnit || '―'}
{ if (!isOpen) { return } setIsOpen(false) }}> {[ ...units, ...(value.state === SPACING_STATE_CUSTOM ? [] : [{ unit: 'custom' }]), ] .filter(({ unit }) => unit !== currentUnit) .map(({ unit }) => ( { if (unit === 'custom') { onChange({ ...value, state: SPACING_STATE_CUSTOM, }) setIsOpen(false) return } let nonAutoValues = value.values .filter((v) => v.value !== 'auto') .map((v) => v.value + v.unit) const futureState = [...new Set(nonAutoValues)].length === 1 ? SPACING_STATE_LINKED : SPACING_STATE_INDEPENDENT onChange({ ...value, values: value.values.map((v) => ({ ...v, unit, })), state: futureState, }) setIsOpen(false) }}> {unit === 'custom' ? __('Custom', 'blocksy') : unit} ))}
) } export default Spacing