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 (
{priceList.name}
{priceList?.description}
{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 }