import { useAdminStockLocations, useAdminVariantsInventory } from "medusa-react" import Button from "../../../../components/fundamentals/button" import CheckCircleFillIcon from "../../../../components/fundamentals/icons/check-circle-fill-icon" import CircleQuarterSolid from "../../../../components/fundamentals/icons/circle-quarter-solid" import EditReservationDrawer from "../../details/reservation/edit-reservation-modal" import { LineItem } from "@medusajs/medusa" import React from "react" import { ReservationItemDTO } from "@medusajs/types" import Tooltip from "../../../../components/atoms/tooltip" import WarningCircleIcon from "../../../../components/fundamentals/icons/warning-circle" import { sum } from "lodash" import { useTranslation } from "react-i18next" const ReservationIndicator = ({ reservations, lineItem, }: { reservations?: ReservationItemDTO[] lineItem: LineItem }) => { const { t } = useTranslation() const { variant, isLoading, isFetching } = useAdminVariantsInventory( lineItem.variant_id!, { enabled: !!lineItem?.variant_id, } ) const { stock_locations } = useAdminStockLocations({ id: reservations?.map((r) => r.location_id) || [], }) const [reservation, setReservation] = React.useState(null) const locationMap = new Map(stock_locations?.map((l) => [l.id, l.name]) || []) const reservationsSum = sum(reservations?.map((r) => r.quantity) || []) const reservableSum = lineItem.quantity - (lineItem?.fulfilled_quantity || 0) const awaitingReservation = reservableSum - reservationsSum if ( isLoading || isFetching || !lineItem.variant_id || !variant?.inventory.length ) { return
} return (
{reservationsSum || awaitingReservation ? (
{!!awaitingReservation && ( {t( "reservation-indicator-awaiting-reservation-count", "{{awaitingReservation}} items not reserved", { awaitingReservation, } )} )} {reservations?.map((reservation) => ( setReservation(reservation)} /> ))}
) : ( {t( "reservation-indicator-this-item-has-been-fulfilled", "This item has been fulfilled." )} )}
} side="bottom" > {awaitingReservation ? ( reservationsSum ? ( ) : ( ) ) : ( )} {reservation && ( setReservation(null)} reservation={reservation} item={lineItem} /> )}
) } const EditReservationButton = ({ reservation, locationName, onClick, }: { reservation: ReservationItemDTO totalReservedQuantity: number locationName?: string lineItem: LineItem onClick: () => void }) => { const { t } = useTranslation() return (
{t( "edit-reservation-button-quantity-item-location-name", "{{quantity}} item: ${{locationName}}", { quantity: reservation.quantity, locationName, } )}
) } export default ReservationIndicator