fix(admin-ui): Gift Card manage page (#3532)

**What**
- Updates GC manage page to use product page sections
- Revamps Denomination section
- Updates the location of several components to reflect that they are now shared between the GC and products domain

![image](https://user-images.githubusercontent.com/45367945/226584238-bb0786b1-d21c-4b90-b00b-29530af320f4.png)
![image](https://user-images.githubusercontent.com/45367945/226584362-80c0c9f8-4ec5-4e64-9075-110caa3b5137.png)

Resolves CORE-1089
This commit is contained in:
Kasper Fabricius Kristensen
2023-03-23 09:29:29 +01:00
committed by GitHub
parent 3171b0e518
commit bfef22b33e
77 changed files with 1286 additions and 1706 deletions

View File

@@ -0,0 +1,171 @@
import {
AdminPostProductsProductReq,
AdminPostProductsProductVariantsReq,
AdminPostProductsProductVariantsVariantReq,
Product,
} from "@medusajs/medusa"
import {
useAdminCreateVariant,
useAdminDeleteProduct,
useAdminDeleteVariant,
useAdminProduct,
useAdminUpdateProduct,
useAdminUpdateVariant,
} from "medusa-react"
import { useNavigate } from "react-router-dom"
import { getErrorMessage } from "../utils/error-messages"
import { removeNullish } from "../utils/remove-nullish"
import useImperativeDialog from "./use-imperative-dialog"
import useNotification from "./use-notification"
const useEditProductActions = (productId: string) => {
const dialog = useImperativeDialog()
const navigate = useNavigate()
const notification = useNotification()
const getProduct = useAdminProduct(productId)
const updateProduct = useAdminUpdateProduct(productId)
const deleteProduct = useAdminDeleteProduct(productId)
const updateVariant = useAdminUpdateVariant(productId)
const deleteVariant = useAdminDeleteVariant(productId)
const addVariant = useAdminCreateVariant(productId)
const onDelete = async () => {
const shouldDelete = await dialog({
heading: "Delete Product",
text: "Are you sure you want to delete this product",
})
if (shouldDelete) {
deleteProduct.mutate(undefined, {
onSuccess: () => {
notification("Success", "Product deleted successfully", "success")
navigate("/a/products/")
},
onError: (err) => {
notification("Error", getErrorMessage(err), "error")
},
})
}
}
const onAddVariant = (
payload: AdminPostProductsProductVariantsReq,
onSuccess: (variantRes: Product) => void,
successMessage = "Variant was created successfully"
) => {
addVariant.mutate(payload, {
onSuccess: (data) => {
notification("Success", successMessage, "success")
getProduct.refetch()
onSuccess(data.product)
},
onError: (err) => {
notification("Error", getErrorMessage(err), "error")
},
})
}
const onUpdateVariant = (
id: string,
payload: Partial<AdminPostProductsProductVariantsVariantReq>,
onSuccess: () => void,
successMessage = "Variant was updated successfully"
) => {
updateVariant.mutate(
{
variant_id: id,
...removeNullish(payload),
manage_inventory: payload.manage_inventory,
},
{
onSuccess: () => {
notification("Success", successMessage, "success")
getProduct.refetch()
onSuccess()
},
onError: (err) => {
notification("Error", getErrorMessage(err), "error")
},
}
)
}
const onDeleteVariant = (
variantId: string,
onSuccess?: () => void,
successMessage = "Variant was succesfully deleted"
) => {
deleteVariant.mutate(variantId, {
onSuccess: () => {
notification("Success", successMessage, "success")
getProduct.refetch()
if (onSuccess) {
onSuccess()
}
},
onError: (err) => {
notification("Error", getErrorMessage(err), "error")
},
})
}
const onUpdate = (
payload: Partial<AdminPostProductsProductReq>,
onSuccess: () => void,
successMessage = "Product was successfully updated"
) => {
updateProduct.mutate(
// @ts-ignore TODO fix images being required
payload,
{
onSuccess: () => {
notification("Success", successMessage, "success")
onSuccess()
},
onError: (err) => {
notification("Error", getErrorMessage(err), "error")
},
}
)
}
const onStatusChange = (currentStatus: string) => {
const newStatus = currentStatus === "published" ? "draft" : "published"
updateProduct.mutate(
{
// @ts-ignore TODO fix update type in API
status: newStatus,
},
{
onSuccess: () => {
const pastTense = newStatus === "published" ? "published" : "drafted"
notification(
"Success",
`Product ${pastTense} successfully`,
"success"
)
},
onError: (err) => {
notification("Ooops", getErrorMessage(err), "error")
},
}
)
}
return {
getProduct,
onDelete,
onStatusChange,
onUpdate,
onAddVariant,
onUpdateVariant,
onDeleteVariant,
updating: updateProduct.isLoading,
deleting: deleteProduct.isLoading,
addingVariant: addVariant.isLoading,
updatingVariant: updateVariant.isLoading,
deletingVariant: deleteVariant.isLoading,
}
}
export default useEditProductActions