import {
EllipseGreenSolid,
EllipseGreySolid,
EllipseOrangeSolid,
EllipseRedSolid,
EllipsisHorizontal,
PencilSquare,
Trash,
} from "@medusajs/icons"
import type { PriceList } from "@medusajs/medusa"
import {
Badge,
Button,
Container,
DropdownMenu,
Heading,
IconButton,
Text,
Tooltip,
usePrompt,
} from "@medusajs/ui"
import { format } from "date-fns"
import { useAdminDeletePriceList, useAdminUpdatePriceList } from "medusa-react"
import * as React from "react"
import { useNavigate } from "react-router-dom"
import { useTranslation } from "react-i18next"
import useNotification from "../../../../hooks/use-notification"
import { getErrorMessage } from "../../../../utils/error-messages"
import { PriceListStatus } from "../../forms/price-list-details-form"
import { EditDetailsDrawer } from "./details-drawer"
type PriceListDetailsSectionProps = {
priceList: PriceList
}
const PriceListDetailsSection = ({
priceList,
}: PriceListDetailsSectionProps) => {
const [open, setOpen] = React.useState(false)
const toggleDrawer = () => {
setOpen(!open)
}
const { t } = useTranslation()
const prompt = usePrompt()
const notification = useNotification()
const navigate = useNavigate()
const { mutateAsync } = useAdminDeletePriceList(priceList.id)
const onDeletePriceList = async () => {
const name = priceList.name
const confirmText =
t("price-list-details-section-prompt-confirm-text", "Delete") ?? undefined
const cancelText =
t("price-list-details-section-prompt-cancel-text", "Cancel") ?? undefined
const res = await prompt({
title: t("price-list-details-section-prompt-title", "Delete price list"),
description: t(
"price-list-details-section-prompt-description",
`Are you sure you want to delete the price list "{{name}}"?`,
{
name,
}
),
verificationText: name,
confirmText,
cancelText,
})
if (!res) {
return
}
await mutateAsync(undefined, {
onSuccess: () => {
notification(
t(
"price-list-details-section-delete-notification-success-title",
"Successfully deleted price list"
),
t(
"price-list-details-section-delete-notification-success-message",
`The price list "{{name}}" was successfully deleted`,
{ name }
),
`success`
)
navigate(`/a/price-lists`, { replace: true })
},
onError: (err) => {
notification(
t(
"price-list-details-section-delete-notification-error-title",
"Failed to delete price list"
),
getErrorMessage(err),
`error`
)
},
})
}
return (
{t(
"price-list-details-section-customer-groups",
"Customer Groups"
)}
{(priceList.customer_groups?.length ?? 0) > 0 ? (
{priceList.customer_groups
.slice(0, 2)
.map((cg) => cg.name)
.join(", ")}
{(priceList.customer_groups?.length || 0) > 2 && (
{priceList.customer_groups.slice(2).map((group) => {
return (
{group.name}
)
})}
}
>
+{priceList.customer_groups.length - 2}
)}
) : (
-
)}
{t("price-list-details-section-last-edited", "Last edited")}
{format(new Date(priceList.updated_at), "EEE d, MMM yyyy")}
{t("price-list-details-section-number-of-prices", "Prices")}
{priceList.prices.length ?? 0}
)
}
type PriceListStatusMenuProps = {
status: PriceList["status"]
endsAt: PriceList["ends_at"]
startsAt: PriceList["starts_at"]
priceListId: string
}
const PriceListStatusMenu = ({
status,
endsAt,
startsAt,
priceListId,
}: PriceListStatusMenuProps) => {
const { t } = useTranslation()
const notification = useNotification()
const { mutateAsync } = useAdminUpdatePriceList(priceListId)
const isActive = status === "active"
const isExpired = endsAt ? new Date(endsAt) < new Date() : false
const isScheduled = startsAt ? new Date(startsAt) > new Date() : false
const statusText = React.useMemo(() => {
if (isExpired) {
return t("price-list-details-section-status-menu-expired", "Expired")
}
if (status === "draft") {
return t("price-list-details-section-status-menu-draft", "Draft")
}
if (isScheduled) {
return t("price-list-details-section-status-menu-scheduled", "Scheduled")
}
return t("price-list-details-section-status-active", "Active")
}, [status, t, isExpired, isScheduled])
const statusDot = React.useMemo(() => {
if (isExpired) {
return
}
if (status === "draft") {
return
}
if (isScheduled) {
return
}
return
}, [status, isExpired, isScheduled])
const onUpdateStatus = async () => {
const newStatus = isActive ? PriceListStatus.DRAFT : PriceListStatus.ACTIVE
mutateAsync(
{
status: newStatus,
},
{
onSuccess: () => {
notification(
t(
"price-list-details-section-status-menu-notification-success-title",
"Successfully updated price list status"
),
t(
"price-list-details-section-status-menu-notification-success-message",
`The price list status was successfully updated to {{status}}`,
{ status: newStatus }
),
`success`
)
},
onError: (err) => {
notification(
t(
"price-list-details-section-status-menu-notification-error-title",
"Failed to update price list status"
),
getErrorMessage(err),
`error`
)
},
}
)
}
return (
{isActive ? : }
{isActive
? t("price-list-details-section-status-menu-item-draft", "Draft")
: t(
"price-list-details-section-status-menu-item-activate",
"Activate"
)}
)
}
type PriceListMenuProps = {
onDelete: () => Promise
onOpenDrawer: () => void
}
const PriceListMenu = ({ onDelete, onOpenDrawer }: PriceListMenuProps) => {
const { t } = useTranslation()
return (
{t("price-list-details-menu-item-edit", "Edit details")}
{t("price-list-details-menu-item-delete", "Delete")}
)
}
export { PriceListDetailsSection as PriceListGeneralSection }