/** * 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! )}
); }