/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import { useBlockProps } from '@wordpress/block-editor';
import type { BlockAttributes } from '@wordpress/blocks';
import { useWooBlockProps } from '@woocommerce/block-templates';
import { __experimentalUseProductEntityProp as useProductEntityProp } from '@woocommerce/product-editor';
import { createElement, useEffect, useState } from '@wordpress/element';
import { MediaUpload } from '@wordpress/media-utils';
import { Flex, Button, Icon } from '@wordpress/components';
import { uniqBy } from 'lodash';
import { DndContext, closestCenter, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';
import {
SortableContext,
useSortable,
arrayMove,
verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
function SortableImage({ image, index, onRemove }) {
const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: image.id });
const style = {
transform: CSS.Transform.toString(transform),
transition,
};
return (
onRemove(image.id)}>
);
}
export function Edit({ attributes }: { attributes: BlockAttributes }) {
const blockProps = useWooBlockProps(attributes);
const { variation_images } = attributes;
const [variationImages, setVariationImagesValue] = useProductEntityProp(
variation_images,
{
postType: 'product_variation',
fallbackValue: [],
}
);
const sensors = useSensors(
useSensor(PointerSensor, {
// Require a drag distance to prevent accidental drags when clicking
activationConstraint: {
distance: 5,
},
})
);
const handleDragEnd = (event) => {
const { active, over } = event;
if (!over) return; // Exit if there's no drop target
if (active.id !== over.id) {
const oldIndex = variationImages.findIndex((img) => img.id === active.id);
const newIndex = variationImages.findIndex((img) => img.id === over.id);
const newItems = arrayMove(variationImages, oldIndex, newIndex);
setVariationImagesValue(newItems);
}
};
useEffect(() => {
console.log('variationImages', variationImages);
}, [variationImages]);
// add a useState to store the variationImages
const [tempImages, setTempImages] = useState(variationImages);
return (
{__('Variation Image Gallery', 'gallery-slider-for-woocommerce')}
{variationImages && variationImages.length > 0 ? (
img.id)} strategy={verticalListSortingStrategy}>
{variationImages.map((image, index) => (
index < 2 && (
{
const updatedImages = variationImages.filter((img) => img.id != idToRemove);
setVariationImagesValue(updatedImages);
}} />)
))}
) : ''}
{variationImages && variationImages.length > 0 ? (
<>
image.id) : []}
onSelect={(medias) => {
const newImages = medias.map((media) => ({
id: media.id,
url: media.url,
meta: media,
}));
const combined = uniqBy([...(variationImages || []), ...newImages], 'id');
setTempImages(combined);
const limited = combined.slice(0, 2);
setVariationImagesValue(limited);
}}
render={({ open }) => (
)}
/>
image.id) : []}
onSelect={(medias) => {
const newImages = medias.map((media) => ({
id: media.id,
url: media.url,
meta: media,
}));
const combined = uniqBy([...(variationImages || []), ...newImages], 'id');
setTempImages(combined);
const limited = combined.slice(0, 2);
setVariationImagesValue(limited);
}}
render={({ open }) => (
)}
/>
>
) : (
image.id) : []}
onSelect={(medias) => {
const newImages = medias.map((media) => ({
id: media.id,
url: media.url,
meta: media,
}));
const combined = uniqBy([...(variationImages || []), ...newImages], 'id');
setTempImages(combined);
const limited = combined.slice(0, 2);
setVariationImagesValue(limited);;
}}
render={({ open }) => (
)}
/>
)}
{tempImages && tempImages.length > 2 && (
To add more images & videos,{' '}
Upgrade to Pro!
)}
);
}