import OptionsProvider, { useOptionsContext } from "./options-provider" import { Product, ProductVariant, VariantInventory } from "@medusajs/medusa" import { useTranslation } from "react-i18next" import { ActionType } from "../../molecules/actionables" import AddVariantModal from "./add-variant-modal" import EditIcon from "../../fundamentals/icons/edit-icon" import EditVariantInventoryModal from "./edit-variant-inventory-modal" import EditVariantModal from "./edit-variant-modal" import EditVariantsModal from "./edit-variants-modal" import GearIcon from "../../fundamentals/icons/gear-icon" import OptionsModal from "./options-modal" import PlusIcon from "../../fundamentals/icons/plus-icon" import Section from "../../organisms/section" import VariantsTable from "./table" import useEditProductActions from "../../../hooks/use-edit-product-actions" import { useFeatureFlag } from "../../../providers/feature-flag-provider" import { adminInventoryItemsKeys, useMedusa } from "medusa-react" import { useQueryClient } from "@tanstack/react-query" import { useState } from "react" import useToggleState from "../../../hooks/use-toggle-state" import DollarSignIcon from "../../fundamentals/icons/dollar-sign-icon" import Index from "./edit-prices-modal" type Props = { product: Product } const ProductVariantsSection = ({ product }: Props) => { const queryClient = useQueryClient() const { client } = useMedusa() const { t } = useTranslation() const { isFeatureEnabled } = useFeatureFlag() const [variantToEdit, setVariantToEdit] = useState< | { base: ProductVariant isDuplicate: boolean } | undefined >(undefined) const [variantInventoryToEdit, setVariantInventoryToEdit] = useState< { base: ProductVariant } | undefined >(undefined) const { state: optionState, close: closeOptions, toggle: toggleOptions, } = useToggleState() const { state: addVariantState, close: closeAddVariant, toggle: toggleAddVariant, } = useToggleState() const { state: editVariantsState, close: closeEditVariants, toggle: toggleEditVariants, } = useToggleState() const { state: showEditPrices, close: hideEditPrices, toggle: toggleEditPrices, } = useToggleState() const actions: ActionType[] = [ { label: t("product-variants-section-add-variant", "Add Variant"), onClick: toggleAddVariant, icon: , }, { label: t("product-variants-section-edit-prices", "Edit Prices"), onClick: toggleEditPrices, icon: , }, { label: t("product-variants-section-edit-variants", "Edit Variants"), onClick: toggleEditVariants, icon: , }, { label: t("product-variants-section-edit-options", "Edit Options"), onClick: toggleOptions, icon: , }, ] const { onDeleteVariant } = useEditProductActions(product.id) const handleDeleteVariant = async (variantId: string) => { let variantInventory: VariantInventory | undefined if (isFeatureEnabled("inventoryService")) { const { variant } = await client.admin.variants.getInventory(variantId) variantInventory = variant } onDeleteVariant(variantId, async () => { if ( isFeatureEnabled("inventoryService") && variantInventory?.inventory[0]?.id ) { await client.admin.inventoryItems.delete( variantInventory.inventory[0].id ) queryClient.invalidateQueries(adminInventoryItemsKeys.lists()) } }) } const handleEditVariant = (variant: ProductVariant) => { setVariantToEdit({ base: variant, isDuplicate: false }) } const handleDuplicateVariant = (variant: ProductVariant) => { // @ts-ignore setVariantToEdit({ base: { ...variant, options: [] }, isDuplicate: true }) } const handleEditVariantInventory = (variant: ProductVariant) => { setVariantInventoryToEdit({ base: variant }) } return (

{t("product-variants-section-product-variants", "Product variants")}{" "} ({product.variants.length})

{showEditPrices && } {variantToEdit && ( setVariantToEdit(undefined)} /> )} {variantInventoryToEdit && ( setVariantInventoryToEdit(undefined)} /> )}
) } const ProductOptions = () => { const { options, status } = useOptionsContext() if (status === "error") { return null } if (status === "loading" || !options) { return (
{Array.from(Array(2)).map((_, i) => { return (
    {Array.from(Array(3)).map((_, j) => (
  • {j}
  • ))}
) })}
) } return (
{options.map((option) => { return (

{option.title}

    {option.values ?.map((val) => val.value) .filter((v, index, self) => self.indexOf(v) === index) .map((v, i) => (
  • {v}
  • ))}
) })}
) } export default ProductVariantsSection