import {
createElement,
Component,
useContext,
createContext,
useState,
Fragment,
} from '@wordpress/element'
import classnames from 'classnames'
import {
SortableContainer,
SortableElement,
SortableHandle,
} from 'react-sortable-hoc'
import arrayMove from 'array-move'
import { __ } from 'ct-i18n'
import OptionsPanel from '../OptionsPanel'
import { getValueFromInput } from '../helpers/get-value-from-input'
import nanoid from 'nanoid'
const LayerControls = SortableHandle(({ items, onChange, value }) => {
const { removeForId, addForId, option, toggleOptionsPanel } =
useContext(LayersContext)
return (
{window._.template(option['preview-template'])(value)}
{option['inner-options'] && (
)}
)
})
const valueWithUniqueIds = (value) =>
value.map((singleItem) => ({
...singleItem,
...(singleItem.__id
? {}
: {
__id: nanoid(),
}),
}))
const getDefaultState = () => ({
currentlyPickedItem: null,
isDragging: false,
isOpen: false,
})
export const LayersContext = createContext(getDefaultState())
const { Provider, Consumer } = LayersContext
class SingleItem extends Component {
state = {
isOpen: false,
}
render() {
const { value, items, onChange } = this.props
return (
{({ option, isDragging, isOpen, parentValue }) => (
{isOpen === value.__id &&
(!isDragging ||
(isDragging && isDragging !== isOpen)) && (
{
onChange(
items.map((l) =>
l.__id === value.__id
? {
...l,
[key]: newValue,
}
: l
)
)
}}
value={getValueFromInput(
option['inner-options'],
{
...(option.value.filter(
({ id }) => id === value.id
).length > 1
? option.value.filter(
({ id }) =>
value.id === id
)[
items
.filter(
({ id }) =>
id ===
value.id
)
.map(
({
__id,
}) => __id
)
.indexOf(
value.__id
)
]
: {}),
...value,
}
)}
options={option['inner-options']}
/>
)}
)}
)
}
}
const SortableItem = SortableElement(SingleItem)
const SortableList = SortableContainer(({ items, onChange }) => (
{({ option }) => (
{items.map((value, index) => (
))}
)}
))
const Layers = ({ value, option, onChange, values }) => {
const [state, setState] = useState(getDefaultState())
const localOnChange = (v) => {
onChange(v)
}
const addForId = (val = {}) => {
localOnChange([
...(value || []),
{
enabled: true,
...getValueFromInput(option['inner-options'] || {}, {}),
...val,
__id: nanoid(),
},
])
}
const computedValue = valueWithUniqueIds(value)
return (
localOnChange(
valueWithUniqueIds(value).filter(
({ __id: id }) => id !== idToRemove
)
),
toggleOptionsPanel: (idToAdd) => {
if (value.length > 0 && !value[0].__id) {
localOnChange(computedValue)
}
setState((state) => ({
...state,
isOpen: state.isOpen === idToAdd ? false : idToAdd,
}))
},
}}>
{
localOnChange(v)
}}
helperContainer={() =>
document.querySelector('#customize-theme-controls') ||
document.body
}
onSortEnd={({ oldIndex, newIndex }) => {
localOnChange(arrayMove(computedValue, oldIndex, newIndex))
setState((state) => ({
...state,
isDragging: false,
}))
}}
updateBeforeSortStart={({ index }) => {
new Promise((resolve) => {
if (value.length > 0 && !value[0].__id) {
wp.customize &&
wp.customize.previewer &&
wp.customize.previewer.send(
'ct:sync:refresh_partial',
{
shouldSkip: true,
}
)
localOnChange(computedValue)
}
setState((state) => ({
...state,
isDragging: computedValue[index].__id,
}))
resolve()
})
}}
/>
)
}
export default Layers