import { Product } from "@medusajs/medusa" import clsx from "clsx" import type { Identifier, XYCoord } from "dnd-core" import { useContext, useMemo, useRef } from "react" import { useDrag, useDrop } from "react-dnd" import { useFormContext } from "react-hook-form" import { useTranslation } from "react-i18next" import { VariantItem } from "." import { DragItem } from "../../../../types/shared" import FormValidator from "../../../../utils/form-validator" import Button from "../../../fundamentals/button" import EditIcon from "../../../fundamentals/icons/edit-icon" import GripIcon from "../../../fundamentals/icons/grip-icon" import MoreHorizontalIcon from "../../../fundamentals/icons/more-horizontal-icon" import Actionables, { ActionType } from "../../../molecules/actionables" import InputField from "../../../molecules/input" import { LayeredModalContext } from "../../../molecules/modal/layered-modal" import { useEditVariantScreen } from "./edit-variant-screen" const ItemTypes = { CARD: "card", } export type VariantCardProps = { index: number moveCard: (dragIndex: number, hoverIndex: number) => void product: Product } & VariantItem export const VariantCard = ({ id, index, ean, sku, title, moveCard, product, }: VariantCardProps) => { const { t } = useTranslation() const { register, formState: { errors }, } = useFormContext() const editVariantScreen = useEditVariantScreen({ product, variant: product.variants.find((v) => v.id === id)!, }) const { push } = useContext(LayeredModalContext) const actions: ActionType[] = useMemo(() => { return [ { label: t("edit-variants-modal-edit-variant", "Edit Variant"), icon: , onClick: () => push(editVariantScreen), }, ] }, [editVariantScreen, push]) const ref = useRef(null) const [{ handlerId }, drop] = useDrop< DragItem, void, { handlerId: Identifier | null } >({ accept: ItemTypes.CARD, collect(monitor) { return { handlerId: monitor.getHandlerId(), } }, hover(item: DragItem, monitor) { if (!ref.current) { return } const dragIndex = item.index const hoverIndex = index if (dragIndex === hoverIndex) { return } const hoverBoundingRect = ref.current?.getBoundingClientRect() const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2 const clientOffset = monitor.getClientOffset() const hoverClientY = (clientOffset as XYCoord).y - hoverBoundingRect.top if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { return } if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { return } moveCard(dragIndex, hoverIndex) item.index = hoverIndex }, }) const [{ isDragging }, drag, preview] = useDrag({ type: ItemTypes.CARD, item: () => { return { id, index } }, collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }) drag(drop(ref)) return ( {title} {sku && ( ({sku}) )} {ean && {ean}} } /> ) }
{title} {sku && ( ({sku}) )}