import {
adminInventoryItemsKeys,
useAdminDeleteProduct,
useAdminUpdateProduct,
useMedusa,
} from "medusa-react"
import { ActionType } from "../../molecules/actionables"
import DuplicateIcon from "../../fundamentals/icons/duplicate-icon"
import EditIcon from "../../fundamentals/icons/edit-icon"
import { Product } from "@medusajs/medusa"
import PublishIcon from "../../fundamentals/icons/publish-icon"
import TrashIcon from "../../fundamentals/icons/trash-icon"
import UnpublishIcon from "../../fundamentals/icons/unpublish-icon"
import { getErrorMessage } from "../../../utils/error-messages"
import useCopyProduct from "./use-copy-product"
import { useFeatureFlag } from "../../../providers/feature-flag-provider"
import useImperativeDialog from "../../../hooks/use-imperative-dialog"
import { useNavigate } from "react-router-dom"
import useNotification from "../../../hooks/use-notification"
import { useQueryClient } from "@tanstack/react-query"
import { useTranslation } from "react-i18next"
const useProductActions = (product: Product) => {
const { t } = useTranslation()
const navigate = useNavigate()
const notification = useNotification()
const dialog = useImperativeDialog()
const copyProduct = useCopyProduct()
const deleteProduct = useAdminDeleteProduct(product?.id)
const updateProduct = useAdminUpdateProduct(product?.id)
const queryClient = useQueryClient()
const { isFeatureEnabled } = useFeatureFlag()
const { client } = useMedusa()
const handleDelete = async () => {
const shouldDelete = await dialog({
heading: t("product-table-delete-product", "Delete Product"),
text: t(
"product-table-confirm-delete",
"Are you sure you want to delete this product?"
),
})
if (shouldDelete) {
if (isFeatureEnabled("inventoryService")) {
const { variants } = await client.admin.variants.list({
id: product.variants.map((v) => v.id),
expand: "inventory_items",
})
variants
.filter(({ inventory_items }) => !!inventory_items?.length)
.map(({ inventory_items }) =>
client.admin.inventoryItems.delete(
inventory_items![0].inventory_item_id
)
)
queryClient.invalidateQueries(adminInventoryItemsKeys.lists())
}
deleteProduct.mutate()
}
}
const getActions = (): ActionType[] => [
{
label: t("product-table-edit", "Edit"),
onClick: () => navigate(`/a/products/${product.id}`),
icon: ,
},
{
label:
product.status === "published"
? t("product-table-unpublish", "Unpublish")
: t("product-table-publish", "Publish"),
onClick: () => {
const newStatus = product.status === "published" ? "draft" : "published"
updateProduct.mutate(
{
status: newStatus,
},
{
onSuccess: () => {
notification(
t("product-table-success", "Success"),
product.status === "published"
? t(
"product-table-successfully-unpublished-product",
"Successfully unpublished product"
)
: t(
"product-table-successfully-published-product",
"Successfully published product"
),
"success"
)
},
onError: (err) =>
notification(
t("product-table-error", "Error"),
getErrorMessage(err),
"error"
),
}
)
},
icon:
product.status === "published" ? (
) : (
),
},
{
label: t("product-table-duplicate", "Duplicate"),
onClick: () => copyProduct(product),
icon: ,
},
{
label: t("product-table-delete", "Delete"),
variant: "danger",
onClick: handleDelete,
icon: ,
},
]
return {
getActions,
}
}
export default useProductActions