Skip to content

Commit 3bcf08c

Browse files
authored
fix(admin-ui): inventory item deletion when removing product (medusajs#5727)
1 parent 2e6b110 commit 3bcf08c

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

.changeset/metal-singers-watch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@medusajs/admin-ui": patch
3+
---
4+
5+
fix(admin-ui): delete inventory items when removing product

packages/admin-ui/ui/src/components/templates/product-table/use-product-actions.tsx

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
1-
import { Product } from "@medusajs/medusa"
2-
import { useAdminDeleteProduct, useAdminUpdateProduct } from "medusa-react"
3-
import { useNavigate } from "react-router-dom"
4-
import { useTranslation } from "react-i18next"
5-
import useImperativeDialog from "../../../hooks/use-imperative-dialog"
6-
import useNotification from "../../../hooks/use-notification"
7-
import { getErrorMessage } from "../../../utils/error-messages"
1+
import {
2+
adminInventoryItemsKeys,
3+
useAdminDeleteProduct,
4+
useAdminUpdateProduct,
5+
useMedusa,
6+
} from "medusa-react"
7+
8+
import { ActionType } from "../../molecules/actionables"
89
import DuplicateIcon from "../../fundamentals/icons/duplicate-icon"
910
import EditIcon from "../../fundamentals/icons/edit-icon"
11+
import { Product } from "@medusajs/medusa"
1012
import PublishIcon from "../../fundamentals/icons/publish-icon"
1113
import TrashIcon from "../../fundamentals/icons/trash-icon"
1214
import UnpublishIcon from "../../fundamentals/icons/unpublish-icon"
13-
import { ActionType } from "../../molecules/actionables"
15+
import { getErrorMessage } from "../../../utils/error-messages"
1416
import useCopyProduct from "./use-copy-product"
17+
import { useFeatureFlag } from "../../../providers/feature-flag-provider"
18+
import useImperativeDialog from "../../../hooks/use-imperative-dialog"
19+
import { useNavigate } from "react-router-dom"
20+
import useNotification from "../../../hooks/use-notification"
21+
import { useQueryClient } from "@tanstack/react-query"
22+
import { useTranslation } from "react-i18next"
1523

1624
const useProductActions = (product: Product) => {
1725
const { t } = useTranslation()
@@ -21,6 +29,9 @@ const useProductActions = (product: Product) => {
2129
const copyProduct = useCopyProduct()
2230
const deleteProduct = useAdminDeleteProduct(product?.id)
2331
const updateProduct = useAdminUpdateProduct(product?.id)
32+
const queryClient = useQueryClient()
33+
const { isFeatureEnabled } = useFeatureFlag()
34+
const { client } = useMedusa()
2435

2536
const handleDelete = async () => {
2637
const shouldDelete = await dialog({
@@ -32,6 +43,22 @@ const useProductActions = (product: Product) => {
3243
})
3344

3445
if (shouldDelete) {
46+
if (isFeatureEnabled("inventoryService")) {
47+
const { variants } = await client.admin.variants.list({
48+
id: product.variants.map((v) => v.id),
49+
expand: "inventory_items",
50+
})
51+
52+
variants
53+
.filter(({ inventory_items }) => !!inventory_items?.length)
54+
.map(({ inventory_items }) =>
55+
client.admin.inventoryItems.delete(
56+
inventory_items![0].inventory_item_id
57+
)
58+
)
59+
queryClient.invalidateQueries(adminInventoryItemsKeys.lists())
60+
}
61+
3562
deleteProduct.mutate()
3663
}
3764
}

packages/admin-ui/ui/src/hooks/use-edit-product-actions.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@ import {
55
Product,
66
} from "@medusajs/medusa"
77
import {
8+
adminInventoryItemsKeys,
89
useAdminCreateVariant,
910
useAdminDeleteProduct,
1011
useAdminDeleteVariant,
1112
useAdminProduct,
1213
useAdminUpdateProduct,
1314
useAdminUpdateVariant,
15+
useMedusa,
1416
} from "medusa-react"
1517

1618
import { getErrorMessage } from "../utils/error-messages"
17-
import { removeFalsy } from "../utils/remove-nullish"
19+
import { useFeatureFlag } from "../providers/feature-flag-provider"
1820
import useImperativeDialog from "./use-imperative-dialog"
1921
import { useNavigate } from "react-router-dom"
2022
import useNotification from "./use-notification"
23+
import { useQueryClient } from "@tanstack/react-query"
2124

2225
const useEditProductActions = (productId: string) => {
2326
const dialog = useImperativeDialog()
@@ -29,13 +32,33 @@ const useEditProductActions = (productId: string) => {
2932
const updateVariant = useAdminUpdateVariant(productId)
3033
const deleteVariant = useAdminDeleteVariant(productId)
3134
const addVariant = useAdminCreateVariant(productId)
35+
const queryClient = useQueryClient()
36+
const { isFeatureEnabled } = useFeatureFlag()
37+
const { client } = useMedusa()
3238

3339
const onDelete = async () => {
3440
const shouldDelete = await dialog({
3541
heading: "Delete Product",
3642
text: "Are you sure you want to delete this product",
3743
})
44+
3845
if (shouldDelete) {
46+
if (isFeatureEnabled("inventoryService") && getProduct.product) {
47+
const { variants } = await client.admin.variants.list({
48+
id: getProduct.product.variants.map((v) => v.id),
49+
expand: "inventory_items",
50+
})
51+
52+
variants
53+
.filter(({ inventory_items }) => !!inventory_items?.length)
54+
.map(({ inventory_items }) =>
55+
client.admin.inventoryItems.delete(
56+
inventory_items![0].inventory_item_id
57+
)
58+
)
59+
queryClient.invalidateQueries(adminInventoryItemsKeys.lists())
60+
}
61+
3962
deleteProduct.mutate(undefined, {
4063
onSuccess: () => {
4164
notification("Success", "Product deleted successfully", "success")

0 commit comments

Comments
 (0)