Fix store item variant defaults and listing sorting
Auto-select first option in variation modals and sort store items by availability, then update time. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
b861ab3dc1
commit
5f4b0b4f92
@@ -53,6 +53,16 @@ function pickDisplayPrice(variants: StoreItem[]) {
|
||||
return { displayPrice, displayDiscountedPrice }
|
||||
}
|
||||
|
||||
function parseDateMs(value: string | undefined) {
|
||||
const ms = Date.parse(value ?? '')
|
||||
return Number.isFinite(ms) ? ms : 0
|
||||
}
|
||||
|
||||
function isVariantInStock(variant: StoreItem) {
|
||||
// `stockQuantity = null` means unlimited stock (in stock).
|
||||
return variant.stockQuantity === null || variant.stockQuantity > 0
|
||||
}
|
||||
|
||||
export function groupStoreItemsByProduct(items: StoreItem[]): StoreProductListing[] {
|
||||
const byProduct = new Map<string, StoreItem[]>()
|
||||
|
||||
@@ -64,10 +74,17 @@ export function groupStoreItemsByProduct(items: StoreItem[]): StoreProductListin
|
||||
|
||||
return [...byProduct.values()]
|
||||
.map((variants) => {
|
||||
const sorted = [...variants].sort(
|
||||
(a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),
|
||||
)
|
||||
const representative = sorted[0]
|
||||
const sorted = [...variants].sort((a, b) => {
|
||||
const aInStock = isVariantInStock(a)
|
||||
const bInStock = isVariantInStock(b)
|
||||
if (aInStock !== bInStock) return aInStock ? -1 : 1
|
||||
|
||||
const updatedDiff = parseDateMs(b.updatedAt) - parseDateMs(a.updatedAt)
|
||||
if (updatedDiff !== 0) return updatedDiff
|
||||
return parseDateMs(b.createdAt) - parseDateMs(a.createdAt)
|
||||
})
|
||||
|
||||
const representative = sorted[0]!
|
||||
const { displayPrice, displayDiscountedPrice } = pickDisplayPrice(sorted)
|
||||
|
||||
return {
|
||||
@@ -87,9 +104,15 @@ export function groupStoreItemsByProduct(items: StoreItem[]): StoreProductListin
|
||||
}
|
||||
})
|
||||
.sort(
|
||||
(a, b) =>
|
||||
new Date(b.representative.createdAt).getTime() -
|
||||
new Date(a.representative.createdAt).getTime(),
|
||||
(a, b) => {
|
||||
const aInStock = a.variants.some(isVariantInStock)
|
||||
const bInStock = b.variants.some(isVariantInStock)
|
||||
if (aInStock !== bInStock) return aInStock ? -1 : 1
|
||||
|
||||
return (
|
||||
parseDateMs(b.representative.updatedAt) - parseDateMs(a.representative.updatedAt)
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ function specialStoreItemToVariants(item: StoreSpecialStoreItem): StoreItem[] {
|
||||
isFestival: variant.isFestival,
|
||||
sortOrder: variant.sortOrder,
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
}))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user