import { AdminGetVariantsVariantInventoryRes, DraftOrder, VariantInventory, } from "@medusajs/medusa" import React, { useMemo } from "react" import { useAdminReservations, useMedusa } from "medusa-react" import { useTranslation } from "react-i18next" import { ActionType } from "../../../../components/molecules/actionables" import Badge from "../../../../components/fundamentals/badge" import BodyCard from "../../../../components/organisms/body-card" import { DisplayTotal } from "../templates" import ImagePlaceholder from "../../../../components/fundamentals/image-placeholder" import ReservationIndicator from "../../components/reservation-indicator/reservation-indicator" import { ReservationItemDTO } from "@medusajs/types" import ReserveItemsModal from "../reservation/reserve-items-modal" import { Response } from "@medusajs/medusa-js" import StatusIndicator from "../../../../components/fundamentals/status-indicator" import { formatAmountWithSymbol } from "../../../../utils/prices" import { sum } from "lodash" import { useFeatureFlag } from "../../../../providers/feature-flag-provider" import useToggleState from "../../../../hooks/use-toggle-state" type DraftSummaryCardProps = { order: DraftOrder } const DraftSummaryCard: React.FC = ({ order }) => { const { t } = useTranslation() const { client } = useMedusa() const { isFeatureEnabled } = useFeatureFlag() const inventoryEnabled = useMemo(() => { return isFeatureEnabled("inventoryService") }, [isFeatureEnabled]) const { cart } = order const { region } = cart const [variantInventoryMap, setVariantInventoryMap] = React.useState< Map >(new Map()) React.useEffect(() => { if (!inventoryEnabled) { return } const fetchInventory = async () => { const inventory = await Promise.all( cart.items.map(async (item) => { if (!item.variant_id) { return } return await client.admin.variants.getInventory(item.variant_id) }) ) setVariantInventoryMap( new Map( inventory .filter( ( inventoryItem // eslint-disable-next-line max-len ): inventoryItem is Response => !!inventoryItem ) .map((i) => { return [i.variant.id, i.variant] }) ) ) } fetchInventory() }, [cart.items, inventoryEnabled, client.admin.variants]) const { reservations } = useAdminReservations( { line_item_id: cart?.items.map((item) => item.id), }, { enabled: inventoryEnabled, } ) const reservationItemsMap = useMemo(() => { if (!reservations?.length || !inventoryEnabled) { return {} } return reservations.reduce( (acc: Record, item: ReservationItemDTO) => { if (!item.line_item_id) { return acc } acc[item.line_item_id] = acc[item.line_item_id] ? [...acc[item.line_item_id], item] : [item] return acc }, {} ) }, [reservations, inventoryEnabled]) const { state: reservationModalIsOpen, open: showReservationModal, close: closeReservationModal, } = useToggleState() const allItemsReserved = useMemo(() => { return cart.items.every((item) => { if ( !item.variant_id || !variantInventoryMap.get(item.variant_id)?.inventory.length ) { return true } const reservations = reservationItemsMap[item.id] return ( item.quantity === item.fulfilled_quantity || (reservations && sum(reservations.map((r) => r.quantity)) === item.quantity - (item.fulfilled_quantity || 0)) ) }) }, [cart.items, variantInventoryMap, reservationItemsMap]) const actionables = useMemo(() => { const actionables: ActionType[] = [] if (inventoryEnabled && !allItemsReserved) { actionables.push({ label: "Allocate", onClick: showReservationModal, }) } return actionables }, [inventoryEnabled, showReservationModal, allItemsReserved]) return ( ) } actionables={actionables} >
{cart?.items?.map((item, i) => (
{item?.thumbnail ? ( ) : ( )}
{item.title} {item?.variant && ( {item.variant.sku} )}
{formatAmountWithSymbol({ amount: (item?.total ?? 0) / item.quantity, currency: region?.currency_code ?? "", digits: 2, tax: [], })}
x {item.quantity}
{inventoryEnabled && ( )}
{formatAmountWithSymbol({ amount: item.total ?? 0, currency: region?.currency_code ?? "", digits: 2, tax: [], })}
{region?.currency_code.toUpperCase()}
))} {cart?.discounts?.map((discount, index) => (
Discount:{" "} {discount.code}
- {formatAmountWithSymbol({ amount: cart?.discount_total, currency: region?.currency_code || "", digits: 2, tax: region?.tax_rate, })}
))}
{reservationModalIsOpen && ( )}
) } export default DraftSummaryCard