diff --git a/src/components/seller/products/SellerProductsTable.tsx b/src/components/seller/products/SellerProductsTable.tsx index 52d45cb23..e857c0975 100644 --- a/src/components/seller/products/SellerProductsTable.tsx +++ b/src/components/seller/products/SellerProductsTable.tsx @@ -233,6 +233,29 @@ const Span = styled.span` } `; +const statusOrder = [ + OffersKit.OfferState.NOT_YET_VALID, + OffersKit.OfferState.VALID, + OffersKit.OfferState.VOIDED, + OffersKit.OfferState.EXPIRED +] as const; + +const compareOffersSortByStatus = ( + { offerStatus: offerStatusA }: { offerStatus: OffersKit.OfferState | string }, + { offerStatus: offerStatusB }: { offerStatus: OffersKit.OfferState | string } +): number => { + if (!offerStatusA) { + return -1; + } + if (!offerStatusB) { + return 1; + } + return ( + statusOrder.indexOf(offerStatusA as OffersKit.OfferState) - + statusOrder.indexOf(offerStatusB as OffersKit.OfferState) + ); +}; + export default function SellerProductsTable({ offers, refetch, @@ -294,299 +317,309 @@ export default function SellerProductsTable({ const data = useMemo( () => - offers?.map((offer) => { - const status = offer ? OffersKit.getOfferStatus(offer) : ""; - const showVariant = - offer?.additional?.variants && offer?.additional?.variants.length > 1; - if (currentTag === "voided" && offer !== null && offer.additional) { - offer.additional.variants = offer.additional.variants.filter( - (variant) => variant.voided - ); - } - if (currentTag === "expired" && offer !== null && offer.additional) { - offer.additional.variants = offer.additional.variants.filter( - (variant) => - dayjs(getDateTimestamp(variant?.validUntilDate)).isBefore( - dayjs() - ) && !variant.voided - ); - } - return { - offerId: offer?.id, - uuid: offer?.metadata?.product?.uuid, - isSubRow: false, - subRows: showVariant - ? (offer?.additional?.variants || []) - .map((variant) => { - const variantStatus = offer - ? OffersKit.getOfferStatus(variant) - : ""; - return { - isSubRow: true, - offerId: variant.id, - uuid: offer.additional?.product?.uuid ?? "", - isSelectable: !( - variantStatus === OffersKit.OfferState.EXPIRED || - variantStatus === OffersKit.OfferState.VOIDED - ), - image: variant.metadata && "image" in variant.metadata && ( - - ), + offers + ?.map((offer) => { + const status = offer ? OffersKit.getOfferStatus(offer) : ""; + const showVariant = + offer?.additional?.variants && + offer?.additional?.variants.length > 1; + if (currentTag === "voided" && offer !== null && offer.additional) { + offer.additional.variants = offer.additional.variants.filter( + (variant) => variant.voided + ); + } + if (currentTag === "expired" && offer !== null && offer.additional) { + offer.additional.variants = offer.additional.variants.filter( + (variant) => + dayjs(getDateTimestamp(variant?.validUntilDate)).isBefore( + dayjs() + ) && !variant.voided + ); + } + return { + offerStatus: status, + offerId: offer?.id, + uuid: offer?.metadata?.product?.uuid, + isSubRow: false, + subRows: showVariant + ? (offer?.additional?.variants || []) + .map((variant) => { + const variantStatus = offer + ? OffersKit.getOfferStatus(variant) + : ""; + return { + offerStatus: variantStatus, + isSubRow: true, + offerId: variant.id, + uuid: offer.additional?.product?.uuid ?? "", + isSelectable: !( + variantStatus === OffersKit.OfferState.EXPIRED || + variantStatus === OffersKit.OfferState.VOIDED + ), + image: variant.metadata && + "image" in variant.metadata && ( + + ), - sku: ( - + sku: ( + + {variant.metadata && "uuid" in variant.metadata + ? variant.metadata.uuid + : ""} + + } + > + {variant.metadata && "uuid" in variant.metadata - ? variant.metadata.uuid + ? variant.metadata.uuid.substring(0, 3) + "..." : ""} - } - > + + ), + productName: ( - {variant.metadata && "uuid" in variant.metadata - ? variant.metadata.uuid.substring(0, 3) + "..." - : ""} + {variant?.metadata?.name} - - ), - productName: ( - - {variant?.metadata?.name} - - ), - status: variant && ( - } - > - } + > + + + ), + quantity: ( + + {variant?.quantityAvailable}/ + {variant?.quantityInitial} + + ), + price: ( + - - ), - quantity: ( - - {variant?.quantityAvailable}/{variant?.quantityInitial} - - ), - price: ( - - ), - offerValidity: variant?.validUntilDate && ( - - - Until
- {dayjs( - getDateTimestamp(variant.validUntilDate) - ).format(CONFIG.dateFormat)} -
-
- ), - action: !( - variantStatus === OffersKit.OfferState.EXPIRED || - variantStatus === OffersKit.OfferState.VOIDED || - variant?.quantityAvailable === "0" - ) && ( - { - if (variant) { - showModal( - modalTypes.VOID_PRODUCT, - { - title: "Void Confirmation", - offerId: variant.id, - offer: variant as Offer, - refetch - }, - "xs" - ); - } - }} - > - Void - - ) - }; - }) - .filter(isTruthy) - : [], - isSelectable: !( - status === OffersKit.OfferState.EXPIRED || - status === OffersKit.OfferState.VOIDED - ), - image: ( - - ), - sku: {offer?.id}, - productName: ( - -
- - {offer?.metadata?.name} - - {showVariant && ( + ), + offerValidity: variant?.validUntilDate && ( + + + Until
+ {dayjs( + getDateTimestamp(variant.validUntilDate) + ).format(CONFIG.dateFormat)} +
+
+ ), + action: !( + variantStatus === OffersKit.OfferState.EXPIRED || + variantStatus === OffersKit.OfferState.VOIDED || + variant?.quantityAvailable === "0" + ) && ( + { + if (variant) { + showModal( + modalTypes.VOID_PRODUCT, + { + title: "Void Confirmation", + offerId: variant.id, + offer: variant as Offer, + refetch + }, + "xs" + ); + } + }} + > + Void + + ) + }; + }) + .filter(isTruthy) + .sort(compareOffersSortByStatus) + : [], + isSelectable: !( + status === OffersKit.OfferState.EXPIRED || + status === OffersKit.OfferState.VOIDED + ), + image: ( + + ), + sku: {offer?.id}, + productName: ( + +
- {offer?.additional?.variants.length} variants + {offer?.metadata?.name} + {showVariant && ( + + {offer?.additional?.variants.length} variants + + )} +
+ {showVariant && ( + )} -
- {showVariant && ( - + ), + status: offer && ( + }> + - )} -
- ), - status: offer && ( - }> - + ), + quantity: ( + + {offer?.quantityAvailable}/{offer?.quantityInitial} + + ), + price: ( + - - ), - quantity: ( - - {offer?.quantityAvailable}/{offer?.quantityInitial} - - ), - price: ( - - ), - offerValidity: offer?.validUntilDate && ( - - - Until
- {dayjs(getDateTimestamp(offer.validUntilDate)).format( - CONFIG.dateFormat - )} -
-
- ), - action: !( - status === OffersKit.OfferState.EXPIRED || - status === OffersKit.OfferState.VOIDED || - offer?.quantityAvailable === "0" - ) && ( - { - if (offer) { - if (showVariant) { - showModal( - modalTypes.VOID_PRODUCT, - { - title: "Void Confirmation", - offers: offer.additional?.variants.filter((variant) => { - variant.validUntilDate; - return ( - !variant.voided && - !dayjs( - getDateTimestamp(offer?.validUntilDate) - ).isBefore(dayjs()) - ); - }) as Offer[], - refetch - }, - "s" - ); - } else { - showModal( - modalTypes.VOID_PRODUCT, - { - title: "Void Confirmation", - offerId: offer.id, - offer, - refetch - }, - "xs" - ); + ), + offerValidity: offer?.validUntilDate && ( + + + Until
+ {dayjs(getDateTimestamp(offer.validUntilDate)).format( + CONFIG.dateFormat + )} +
+
+ ), + action: !( + status === OffersKit.OfferState.EXPIRED || + status === OffersKit.OfferState.VOIDED || + offer?.quantityAvailable === "0" + ) && ( + { + if (offer) { + if (showVariant) { + showModal( + modalTypes.VOID_PRODUCT, + { + title: "Void Confirmation", + offers: offer.additional?.variants.filter( + (variant) => { + variant.validUntilDate; + return ( + !variant.voided && + !dayjs( + getDateTimestamp(offer?.validUntilDate) + ).isBefore(dayjs()) + ); + } + ) as Offer[], + refetch + }, + "s" + ); + } else { + showModal( + modalTypes.VOID_PRODUCT, + { + title: "Void Confirmation", + offerId: offer.id, + offer, + refetch + }, + "xs" + ); + } } - } - }} - > - Void - - ) - }; - }), + }} + > + Void +
+ ) + }; + }) + .sort(compareOffersSortByStatus), [offers] // eslint-disable-line );