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,
})
}}>
)}
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