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 }) => ( )} )) 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