import { useEffect, useState } from 'react' import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { ProductVariant } from '../types/productVariant' import { buildVariantLabel } from '../types/productVariant' import type { ProductVariantAttribute } from '../services/productVariantService' import styles from './VariationsModal.module.css' interface CreateProductVariantModalProps { open: boolean attributes: ProductVariantAttribute[] existingVariants: ProductVariant[] isSubmitting?: boolean error?: string onClose: () => void onSubmit: (payload: { variationId: string; optionId: string }) => void } const ANIMATION_MS = 220 export function CreateProductVariantModal({ open, attributes, existingVariants, isSubmitting = false, error = '', onClose, onSubmit, }: CreateProductVariantModalProps) { const [mounted, setMounted] = useState(open) const [closing, setClosing] = useState(false) const [variationId, setVariationId] = useState('') const [optionId, setOptionId] = useState('') const selectedVariation = attributes.find((item) => item.id === variationId) const options = selectedVariation?.options ?? [] useEffect(() => { if (open) { setMounted(true) setClosing(false) const first = attributes[0] setVariationId(first?.id ?? '') setOptionId(first?.options[0]?.id ?? '') } else if (mounted) { setClosing(true) const timer = setTimeout(() => { setMounted(false) setClosing(false) }, ANIMATION_MS) return () => clearTimeout(timer) } }, [open, mounted, attributes]) useEffect(() => { if (!selectedVariation) return if (!options.some((item) => item.id === optionId)) { setOptionId(options[0]?.id ?? '') } }, [selectedVariation, options, optionId]) useEffect(() => { if (!mounted || closing) return const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() } document.addEventListener('keydown', onKey) return () => document.removeEventListener('keydown', onKey) }, [mounted, closing, onClose]) if (!mounted) return null const selectedOption = options.find((item) => item.id === optionId) const selectionList = selectedVariation && selectedOption ? [ { attributeId: selectedVariation.id, attributeName: selectedVariation.name, optionId: selectedOption.id, value: selectedOption.label, }, ] : [] const label = buildVariantLabel(selectionList) const isDuplicate = existingVariants.some((variant) => variant.selections.some((selection) => selection.optionId === optionId), ) const canSubmit = Boolean(variationId && optionId && selectionList.length) && !isDuplicate && !isSubmitting function handleSubmit(e: React.FormEvent) { e.preventDefault() if (!canSubmit) return onSubmit({ variationId, optionId }) } return createPortal(