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:
Alireza Hassani
2026-08-18 11:26:20 +03:30
co-authored by Cursor
parent b861ab3dc1
commit 5f4b0b4f92
20 changed files with 409 additions and 64 deletions
+30 -7
View File
@@ -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: '',
}))
}