import { createElement, useContext } from '@wordpress/element'
import { getOptionIdFor } from './BuilderRoot'
import cls from 'classnames'
import Sortable from './Sortable'
import { DragDropContext } from './BuilderRoot'
export const DraggableItem = ({
item,
index,
panelType,
onRemove,
renderItem,
className
}) => {
const itemData = ct_customizer_localizations.header_builder_data[
panelType
].find(({ id }) => id === item)
if (renderItem) {
return renderItem({ item, itemData })
}
return (
wp.customize
.section(`${getOptionIdFor(panelType, item)}_panel`)
.expand()
}>
{itemData.config.name}
)
}
const DraggableItems = ({
items,
draggableId,
hasPointers = true,
className,
tagName = 'div',
direction = 'horizontal',
group = 'header_sortables',
options = {},
propsForItem = item => ({}),
...props
}) => {
const { isDragging, setIsDragging, onChange, setList } = useContext(
DragDropContext
)
return (
{
setIsDragging(false)
document.body.classList.remove('ct-builder-dragging')
;[...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(
el => el.classList.remove('ct-is-over')
)
},
onMove: (event, originalEvent) => {
if (event.from.closest('#ct-option-header-builder-items')) {
Promise.resolve().then(() =>
[
...event.from.querySelectorAll(
`[data-id="${event.dragged.dataset.id}"]`
)
].map(el => {
el.classList.remove('ct-builder-item')
el.classList.add('ct-item-in-builder')
})
)
}
;[...document.querySelectorAll('.ct-panel-builder .ct-is-over')].map(
el => el.classList.remove('ct-is-over')
)
if (event.to) {
event.to.classList.add('ct-is-over')
}
},
...options
}}
onChange={(order, sortable, evt) => {
onChange({
id: draggableId,
value: order.filter(i => i !== '__pointer__' && i !== '__filler__')
})
}}
tag={tagName}
className={cls('ct-builder-items', className)}
{...props}>
{['end', 'start-middle'].indexOf(draggableId.split(':')[1]) > -1 && (
)}
{hasPointers && isDragging && (
)}
{items.map((item, index) => (
setList({
[draggableId]: items.filter(id => id !== item),
'available-items': null
})
}
{...propsForItem(item)}
/>
))}
)
}
export default DraggableItems